1 // Copyright (c) 2006-2008, Rodrigo Braz Monteiro, Fredrik Mellbin 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are met: 6 // 7 // * Redistributions of source code must retain the above copyright notice, 8 // this list of conditions and the following disclaimer. 9 // * Redistributions in binary form must reproduce the above copyright notice, 10 // this list of conditions and the following disclaimer in the documentation 11 // and/or other materials provided with the distribution. 12 // * Neither the name of the Aegisub Group nor the names of its contributors 13 // may be used to endorse or promote products derived from this software 14 // without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 // POSSIBILITY OF SUCH DAMAGE. 27 // 28 // Aegisub Project http://www.aegisub.org/ 29 30 /// @file video_provider.h 31 /// @brief Declaration of base-class for video providers 32 /// @ingroup main_headers video_input 33 /// 34 35 #pragma once 36 37 #include <libaegisub/exception.h> 38 #include <libaegisub/vfr.h> 39 40 #include <string> 41 42 struct VideoFrame; 43 44 class VideoProvider { 45 public: 46 virtual ~VideoProvider() = default; 47 48 /// Override this method to actually get frames 49 virtual void GetFrame(int n, VideoFrame &frame)=0; 50 51 /// Set the YCbCr matrix to the specified one 52 /// 53 /// Providers are free to disregard this, and should if the requested 54 /// matrix makes no sense or the input isn't YCbCr. 55 virtual void SetColorSpace(std::string const& matrix)=0; 56 57 // Override the following methods to get video information: 58 virtual int GetFrameCount() const=0; ///< Get total number of frames 59 virtual int GetWidth() const=0; ///< Returns the video width in pixels 60 virtual int GetHeight() const=0; ///< Returns the video height in pixels 61 virtual double GetDAR() const=0; ///< Returns the video display aspect ratio 62 virtual agi::vfr::Framerate GetFPS() const=0; ///< Get frame rate 63 virtual std::vector<int> GetKeyFrames() const=0;///< Returns list of keyframes 64 65 /// Get the source colorspace of the video before it was converted to RGB 66 /// @return A string describing the source colorspace or "None" if it is 67 /// unknown or meaningless 68 virtual std::string GetColorSpace() const = 0; GetRealColorSpace()69 virtual std::string GetRealColorSpace() const { return GetColorSpace(); } 70 71 /// @brief Use this to set any post-loading warnings, such as "being loaded with unreliable seeking" GetWarning()72 virtual std::string GetWarning() const { return ""; } 73 74 /// @brief Name of decoder, e.g. "Avisynth/FFMpegSource" 75 virtual std::string GetDecoderName() const = 0; 76 77 /// @brief Does this provider want Aegisub to cache video frames? 78 /// @return Returns true if caching is desired, false otherwise. WantsCaching()79 virtual bool WantsCaching() const { return false; } 80 81 /// Should the video properties in the script be set to this video's property if they already have values? ShouldSetVideoProperties()82 virtual bool ShouldSetVideoProperties() const { return true; } 83 84 /// Does the file which this provider is reading have an audio track? HasAudio()85 virtual bool HasAudio() const { return false; } 86 }; 87 88 DEFINE_EXCEPTION(VideoProviderError, agi::Exception); 89 /// File could be opened, but is not a supported format 90 DEFINE_EXCEPTION(VideoNotSupported, VideoProviderError); 91 /// File appears to be a supported format, but could not be opened 92 DEFINE_EXCEPTION(VideoOpenError, VideoProviderError); 93 94 /// Error of some sort occurred while decoding a frame 95 DEFINE_EXCEPTION(VideoDecodeError, VideoProviderError); 96