From 24536090614b563b66c2388d1066efaae4bc9286 Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Sat, 6 May 2006 01:07:11 +0000 Subject: [PATCH] SubtitleProviderASA Originally committed to SVN as r364. --- core/Makefile.am | 1 + core/configure.ac | 4 +- core/subtitle_provider_asa.cpp | 124 +++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 core/subtitle_provider_asa.cpp diff --git a/core/Makefile.am b/core/Makefile.am index 80ee772be..a5d6db5ce 100644 --- a/core/Makefile.am +++ b/core/Makefile.am @@ -76,6 +76,7 @@ aegisub_SOURCES = about.cpp \ subtitle_format_srt.cpp \ subtitle_format_txt.cpp \ subtitle_provider.cpp \ + subtitle_provider_asa.cpp \ text_file_reader.cpp \ text_file_writer.cpp \ timeedit_ctrl.cpp \ diff --git a/core/configure.ac b/core/configure.ac index 402d5ce15..9fc9894d2 100644 --- a/core/configure.ac +++ b/core/configure.ac @@ -82,12 +82,12 @@ AC_CHECK_LIB([portaudio], [Pa_Initialize],, [AC_MSG_ERROR([portaudio not found.] AC_CHECK_LIB([avcodec], [avcodec_init]) AC_CHECK_LIB([avformat], [av_frac_init]) -PKG_CHECK_MODULES([ASA], asa = 0.0.1, [ +PKG_CHECK_MODULES([ASA], asa >= 0.3.2, [ CPPFLAGS="$CPPFLAGS $ASA_CFLAGS" LIBS="$LIBS $ASA_LIBS" AC_DEFINE(HAVE_ASA, 1, [found asa via pkg-config]) ], [true]) -AC_CHECK_HEADERS([asa.h]) +AC_CHECK_HEADERS([asa/asa.h]) PKG_CHECK_MODULES([GLIB], glib-2.0, [ CPPFLAGS="$CPPFLAGS $GLIB_CFLAGS" diff --git a/core/subtitle_provider_asa.cpp b/core/subtitle_provider_asa.cpp new file mode 100644 index 000000000..c983cc60f --- /dev/null +++ b/core/subtitle_provider_asa.cpp @@ -0,0 +1,124 @@ +// Copyright (c) 2006, David Lamparter +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +/////////// +// Headers +#ifdef HAVE_ASA + +#ifdef HAVE_ASA_ASA_H +# include +#else +# ifdef WIN32 +# include +# endif +#endif + +#include "subtitle_provider.h" +#include "video_provider.h" +#include "ass_file.h" + + +class SubtitleProviderASA : public SubtitleProvider, SubtitleProvider::Overlay { +private: + class MyClass : public Class { + public: + MyClass() : Class(L"asa") { asa_init(ASA_VERSION); }; + virtual SubtitleProvider *Get(AssFile *subs) { return new SubtitleProviderASA(subs); }; + }; + static MyClass me; + + AssFile *subs; + asa_inst *inst; + VideoProvider *vpro; +public: + SubtitleProviderASA(AssFile *_subs); + virtual ~SubtitleProviderASA(); + virtual void Bind(VideoProvider *_vpro); + + virtual void SetParams(int width, int height); + virtual void Render(wxImage &frame, int ms); + virtual void Unbind(); +}; + +SubtitleProviderASA::MyClass SubtitleProviderASA::me; + +SubtitleProviderASA::SubtitleProviderASA(AssFile *_subs) +{ + const wxChar *cstr; + + subs = _subs; + cstr = subs->GetString().c_str(); + inst = asa_open_mem((const char *)cstr, wcslen(cstr), (enum asa_oflags)0); + if (!inst) + throw L"failed to load script with asa."; +}; + +SubtitleProviderASA::~SubtitleProviderASA() +{ + Unbind(); + asa_close(inst); +}; + +void SubtitleProviderASA::Bind(VideoProvider *_vpro) +{ + vpro = _vpro; + vpro->AttachOverlay(this); +} + +void SubtitleProviderASA::SetParams(int width, int height) +{ + asa_setsize(inst, width, height); +} + +void SubtitleProviderASA::Render(wxImage &frame, int ms) +{ + struct asa_frame aframe; + aframe.csp = ASACSP_RGB; + aframe.bmp.rgb.fmt = ASACSPR_RGB; + aframe.bmp.rgb.d.d = frame.GetData(); + aframe.bmp.rgb.d.stride = frame.GetWidth(); + asa_render(inst, ms * 0.001, &aframe); +} + +void SubtitleProviderASA::Unbind() +{ + if (vpro) + vpro->AttachOverlay(NULL); + vpro = NULL; +} + +#endif /* HAVE_ASA */ +