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