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; }
37 namespace VDPAU { class CVdpauRenderPicture; }
40 struct OpenMaxVideoBuffer;
41 class CDVDVideoCodecStageFright;
42 class CDVDMediaCodecInfo;
43 typedef void* EGLImageKHR;
46 // should be entirely filled by all codecs
47 struct DVDVideoPicture
49 double pts; // timestamp in seconds, used in the CDVDPlayer class to keep track of pts
55 uint8_t* data[4]; // [4] = alpha channel, currently not used
56 int iLineSize[4]; // [4] = alpha channel, currently not used
59 DXVA::CSurfaceContext* context;
62 VDPAU::CVdpauRenderPicture* vdpau;
65 VAAPI::CHolder* vaapi;
70 OpenMaxVideoBuffer *openMaxBuffer;
74 struct __CVBuffer *cvBufferRef;
78 CDVDVideoCodecStageFright* stf;
83 CDVDMediaCodecInfo *mediacodec;
89 double iRepeatPicture;
91 unsigned int iFrameType : 4; // see defines above // 1->I, 2->P, 3->B, 0->Undef
92 unsigned int color_matrix : 4;
93 unsigned int color_range : 1; // 1 indicate if we have a full range of color
94 unsigned int chroma_position;
95 unsigned int color_primaries;
96 unsigned int color_transfer;
97 unsigned int extended_format;
100 int8_t* qscale_table; // Quantization parameters, primarily used by filters
105 unsigned int iHeight;
106 unsigned int iDisplayWidth; // width of the picture without black bars
107 unsigned int iDisplayHeight; // height of the picture without black bars
109 ERenderFormat format;
112 struct DVDVideoUserData
118 #define DVP_FLAG_TOP_FIELD_FIRST 0x00000001
119 #define DVP_FLAG_REPEAT_TOP_FIELD 0x00000002 //Set to indicate that the top field should be repeated
120 #define DVP_FLAG_ALLOCATED 0x00000004 //Set to indicate that this has allocated data
121 #define DVP_FLAG_INTERLACED 0x00000008 //Set to indicate that this frame is interlaced
123 #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped
124 #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data
126 // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2!
128 #define DVP_QSCALE_UNKNOWN 0
129 #define DVP_QSCALE_MPEG1 1
130 #define DVP_QSCALE_MPEG2 2
131 #define DVP_QSCALE_H264 3
133 class CDVDStreamInfo;
134 class CDVDCodecOption;
135 class CDVDCodecOptions;
137 // VC_ messages, messages can be combined
138 #define VC_ERROR 0x00000001 // an error occured, no other messages will be returned
139 #define VC_BUFFER 0x00000002 // the decoder needs more data
140 #define VC_PICTURE 0x00000004 // the decoder got a picture, call Decode(NULL, 0) again to parse the rest of the data
141 #define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data
142 #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again
148 virtual ~CDVDVideoCodec() {}
151 * Open the decoder, returns true on success
153 virtual bool Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) = 0;
156 * Dispose, Free all resources
158 virtual void Dispose() = 0;
161 * returns one or a combination of VC_ messages
162 * pData and iSize can be NULL, this means we should flush the rest of the data.
164 virtual int Decode(uint8_t* pData, int iSize, double dts, double pts) = 0;
168 * Should be the same as calling Dispose and Open after each other
170 virtual void Reset() = 0;
173 * returns true if successfull
174 * the data is valid until the next Decode call
176 virtual bool GetPicture(DVDVideoPicture* pDvdVideoPicture) = 0;
180 * returns true if successfull
181 * the data is cleared to zero
183 virtual bool ClearPicture(DVDVideoPicture* pDvdVideoPicture)
185 memset(pDvdVideoPicture, 0, sizeof(DVDVideoPicture));
190 * returns true if successfull
191 * the data is valid until the next Decode call
192 * userdata can be anything, for now we use it for closed captioning
194 virtual bool GetUserData(DVDVideoUserData* pDvdVideoUserData)
196 pDvdVideoUserData->data = NULL;
197 pDvdVideoUserData->size = 0;
202 * will be called by video player indicating if a frame will eventually be dropped
203 * codec can then skip actually decoding the data, just consume the data set picture headers
205 virtual void SetDropState(bool bDrop) = 0;
208 * will be called by video player indicating the playback speed. see DVD_PLAYSPEED_NORMAL,
209 * DVD_PLAYSPEED_PAUSE and friends.
211 virtual void SetSpeed(int iSpeed) {};
214 * returns the number of demuxer bytes in any internal buffers
216 virtual int GetDataSize(void)
222 * returns the time in seconds for demuxer bytes in any internal buffers
224 virtual double GetTimeSize(void)
231 FILTER_DEINTERLACE_YADIF = 0x1, /* use first deinterlace mode */
232 FILTER_DEINTERLACE_ANY = 0xf, /* use any deinterlace mode */
233 FILTER_DEINTERLACE_FLAGGED = 0x10, /* only deinterlace flagged frames */
234 FILTER_DEINTERLACE_HALFED = 0x20, /* do half rate deinterlacing */
235 FILTER_ROTATE = 0x40, /* rotate image according to the codec hints */
239 * set the type of filters that should be applied at decoding stage if possible
241 virtual unsigned int SetFilters(unsigned int filters) { return 0u; }
245 * should return codecs name
247 virtual const char* GetName() = 0;
251 * How many packets should player remember, so codec
252 * can recover should something cause it to flush
253 * outside of players control
255 virtual unsigned GetConvergeCount()
262 * Number of references to old pictures that are allowed to
263 * be retained when calling decode on the next demux packet
265 virtual unsigned GetAllowedReferences() { return 0; }