4 * Copyright (C) 2005-2013 Team XBMC
7 * This Program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * This Program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with XBMC; see the file COPYING. If not, see
19 * <http://www.gnu.org/licenses/>.
26 #include "cores/VideoRenderers/RenderFormats.h"
28 // when modifying these structures, make sure you update all codecs accordingly
29 #define FRAME_TYPE_UNDEF 0
30 #define FRAME_TYPE_I 1
31 #define FRAME_TYPE_P 2
32 #define FRAME_TYPE_B 3
33 #define FRAME_TYPE_D 4
35 namespace DXVA { class CSurfaceContext; }
36 namespace VAAPI { struct CHolder; }
40 struct OpenMaxVideoBuffer;
42 // should be entirely filled by all codecs
43 struct DVDVideoPicture
45 double pts; // timestamp in seconds, used in the CDVDPlayer class to keep track of pts
51 uint8_t* data[4]; // [4] = alpha channel, currently not used
52 int iLineSize[4]; // [4] = alpha channel, currently not used
55 DXVA::CSurfaceContext* context;
61 VAAPI::CHolder* vaapi;
66 OpenMaxVideoBuffer *openMaxBuffer;
70 struct __CVBuffer *cvBufferRef;
76 double iRepeatPicture;
78 unsigned int iFrameType : 4; // see defines above // 1->I, 2->P, 3->B, 0->Undef
79 unsigned int color_matrix : 4;
80 unsigned int color_range : 1; // 1 indicate if we have a full range of color
81 unsigned int chroma_position;
82 unsigned int color_primaries;
83 unsigned int color_transfer;
84 unsigned int extended_format;
86 int8_t* qscale_table; // Quantization parameters, primarily used by filters
92 unsigned int iDisplayWidth; // width of the picture without black bars
93 unsigned int iDisplayHeight; // height of the picture without black bars
98 struct DVDVideoUserData
104 #define DVP_FLAG_TOP_FIELD_FIRST 0x00000001
105 #define DVP_FLAG_REPEAT_TOP_FIELD 0x00000002 //Set to indicate that the top field should be repeated
106 #define DVP_FLAG_ALLOCATED 0x00000004 //Set to indicate that this has allocated data
107 #define DVP_FLAG_INTERLACED 0x00000008 //Set to indicate that this frame is interlaced
109 #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped
110 #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data
112 // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2!
114 #define DVP_QSCALE_UNKNOWN 0
115 #define DVP_QSCALE_MPEG1 1
116 #define DVP_QSCALE_MPEG2 2
117 #define DVP_QSCALE_H264 3
119 class CDVDStreamInfo;
120 class CDVDCodecOption;
121 class CDVDCodecOptions;
123 // VC_ messages, messages can be combined
124 #define VC_ERROR 0x00000001 // an error occured, no other messages will be returned
125 #define VC_BUFFER 0x00000002 // the decoder needs more data
126 #define VC_PICTURE 0x00000004 // the decoder got a picture, call Decode(NULL, 0) again to parse the rest of the data
127 #define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data
128 #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again
134 virtual ~CDVDVideoCodec() {}
137 * Open the decoder, returns true on success
139 virtual bool Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) = 0;
142 * Dispose, Free all resources
144 virtual void Dispose() = 0;
147 * returns one or a combination of VC_ messages
148 * pData and iSize can be NULL, this means we should flush the rest of the data.
150 virtual int Decode(uint8_t* pData, int iSize, double dts, double pts) = 0;
154 * Should be the same as calling Dispose and Open after each other
156 virtual void Reset() = 0;
159 * returns true if successfull
160 * the data is valid until the next Decode call
162 virtual bool GetPicture(DVDVideoPicture* pDvdVideoPicture) = 0;
166 * returns true if successfull
167 * the data is cleared to zero
169 virtual bool ClearPicture(DVDVideoPicture* pDvdVideoPicture)
171 memset(pDvdVideoPicture, 0, sizeof(DVDVideoPicture));
176 * returns true if successfull
177 * the data is valid until the next Decode call
178 * userdata can be anything, for now we use it for closed captioning
180 virtual bool GetUserData(DVDVideoUserData* pDvdVideoUserData)
182 pDvdVideoUserData->data = NULL;
183 pDvdVideoUserData->size = 0;
188 * will be called by video player indicating if a frame will eventually be dropped
189 * codec can then skip actually decoding the data, just consume the data set picture headers
191 virtual void SetDropState(bool bDrop) = 0;
194 * will be called by video player indicating the playback speed. see DVD_PLAYSPEED_NORMAL,
195 * DVD_PLAYSPEED_PAUSE and friends.
197 virtual void SetSpeed(int iSpeed) {};
200 * returns the number of demuxer bytes in any internal buffers
202 virtual int GetDataSize(void)
208 * returns the time in seconds for demuxer bytes in any internal buffers
210 virtual double GetTimeSize(void)
217 FILTER_DEINTERLACE_YADIF = 0x1, /* use first deinterlace mode */
218 FILTER_DEINTERLACE_ANY = 0xf, /* use any deinterlace mode */
219 FILTER_DEINTERLACE_FLAGGED = 0x10, /* only deinterlace flagged frames */
220 FILTER_DEINTERLACE_HALFED = 0x20, /* do half rate deinterlacing */
221 FILTER_ROTATE = 0x40, /* rotate image according to the codec hints */
225 * set the type of filters that should be applied at decoding stage if possible
227 virtual unsigned int SetFilters(unsigned int filters) { return 0u; }
231 * should return codecs name
233 virtual const char* GetName() = 0;
237 * How many packets should player remember, so codec
238 * can recover should something cause it to flush
239 * outside of players control
241 virtual unsigned GetConvergeCount()
248 * Number of references to old pictures that are allowed to
249 * be retained when calling decode on the next demux packet
251 virtual unsigned GetAllowedReferences() { return 0; }