From ff602f7f2a0f97a07a0bf0e38bde7e433b45def5 Mon Sep 17 00:00:00 2001 From: Amar Takhar Date: Sun, 6 Feb 2011 00:04:55 +0000 Subject: [PATCH] Copy aegisub/(video|audio)_provider.h to libmedia/(video|audio).h Originally committed to SVN as r5295. --- aegisub/libmedia/include/libmedia/audio.h | 110 ++++++++++++++++++++++ aegisub/libmedia/include/libmedia/video.h | 81 ++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 aegisub/libmedia/include/libmedia/audio.h create mode 100644 aegisub/libmedia/include/libmedia/video.h diff --git a/aegisub/libmedia/include/libmedia/audio.h b/aegisub/libmedia/include/libmedia/audio.h new file mode 100644 index 000000000..ca1b07f05 --- /dev/null +++ b/aegisub/libmedia/include/libmedia/audio.h @@ -0,0 +1,110 @@ +// Copyright (c) 2006, Rodrigo Braz Monteiro +// 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 Project http://www.aegisub.org/ +// +// $Id$ + +/// @file audio_provider.h +/// @brief Declaration of base-class for audio providers +/// @ingroup main_headers audio_input +/// + +#pragma once + +#ifndef AGI_PRE +#include +#endif + +#include +#include "factory_manager.h" + +/// @class AudioProvider +/// @brief DOCME +/// +/// DOCME +class AudioProvider { +private: + + /// DOCME + char *raw; + + /// DOCME + int raw_len; + +protected: + + /// DOCME + int channels; + + /// DOCME + int64_t num_samples; // for one channel, ie. number of PCM frames + + /// DOCME + int sample_rate; + + /// DOCME + int bytes_per_sample; + + + /// DOCME + wxString filename; + +public: + AudioProvider(); + virtual ~AudioProvider(); + + virtual wxString GetFilename() const { return filename; }; + virtual void GetAudio(void *buf, int64_t start, int64_t count) const = 0; + void GetAudioWithVolume(void *buf, int64_t start, int64_t count, double volume) const; + + int64_t GetNumSamples() const { return num_samples; } + int GetSampleRate() const { return sample_rate; } + int GetBytesPerSample() const { return bytes_per_sample; } + int GetChannels() const { return channels; } + virtual bool AreSamplesNativeEndian() const = 0; + + /// @brief Does this provider benefit from external caching? + virtual bool NeedsCache() const { return false; } +}; + +/// DOCME +/// @class AudioProviderFactory +/// @brief DOCME +/// +/// DOCME +class AudioProviderFactory : public Factory1 { +public: + static void RegisterProviders(); + static AudioProvider *GetProvider(wxString filename, int cache=-1); +}; + +DEFINE_BASE_EXCEPTION_NOINNER(AudioProviderError, agi::Exception); +DEFINE_SIMPLE_EXCEPTION_NOINNER(AudioOpenError, AudioProviderError, "audio/open/failed"); + +/// Error of some sort occurred while decoding a frame +DEFINE_SIMPLE_EXCEPTION_NOINNER(AudioDecodeError, AudioProviderError, "audio/error"); diff --git a/aegisub/libmedia/include/libmedia/video.h b/aegisub/libmedia/include/libmedia/video.h new file mode 100644 index 000000000..a658f5e32 --- /dev/null +++ b/aegisub/libmedia/include/libmedia/video.h @@ -0,0 +1,81 @@ +// Copyright (c) 2006-2008, Rodrigo Braz Monteiro, Fredrik Mellbin +// 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 Project http://www.aegisub.org/ +// +// $Id$ + +/// @file video_provider.h +/// @brief Declaration of base-class for video providers +/// @ingroup main_headers video_input +/// + +#pragma once + +#include "video_frame.h" +#include +#include + +/// @class VideoProvider +/// @brief DOCME +/// +/// DOCME +class VideoProvider { +public: + virtual ~VideoProvider() {} + + // Override this method to actually get frames + virtual const AegiVideoFrame GetFrame(int n)=0; + + // Override the following methods to get video information: + virtual int GetPosition() const=0; ///< Get the number of the last frame loaded + virtual int GetFrameCount() const=0; ///< Get total number of frames + virtual int GetWidth() const=0; ///< Returns the video width in pixels + virtual int GetHeight() const=0; ///< Returns the video height in pixels + virtual agi::vfr::Framerate GetFPS() const=0; ///< Get frame rate + virtual std::vector GetKeyFrames() const=0;///< Returns list of keyframes + + + /// @brief Use this to set any post-loading warnings, such as "being loaded with unreliable seeking" + virtual wxString GetWarning() const { return L""; } + + /// @brief Name of decoder, e.g. "Avisynth/FFMpegSource" + virtual wxString GetDecoderName() const = 0; + + /// @brief Does this provider want Aegisub to cache video frames? + /// @return Returns true if caching is desired, false otherwise. + virtual bool WantsCaching() const { return false; } +}; + +DEFINE_BASE_EXCEPTION_NOINNER(VideoProviderError, agi::Exception); +/// File could be opened, but is not a supported format +DEFINE_SIMPLE_EXCEPTION_NOINNER(VideoNotSupported, VideoProviderError, "video/open/notsupported"); +/// File appears to be a supported format, but could not be opened +DEFINE_SIMPLE_EXCEPTION_NOINNER(VideoOpenError, VideoProviderError, "video/open/failed"); + +/// Error of some sort occurred while decoding a frame +DEFINE_SIMPLE_EXCEPTION_NOINNER(VideoDecodeError, VideoProviderError, "video/error");