Reduce amount of deprecated symbols used from FFmpeg
[blender.git] / source / gameengine / VideoTexture / VideoFFmpeg.h
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexture library
4
5 Copyright (c) 2007 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23 /** \file VideoFFmpeg.h
24  *  \ingroup bgevideotex
25  */
26  
27 #ifndef __VIDEOFFMPEG_H__
28 #define __VIDEOFFMPEG_H__
29
30 #ifdef WITH_FFMPEG
31 /* this needs to be parsed with __cplusplus defined before included through ffmpeg_compat.h */
32 #if defined(__FreeBSD__)
33 #  include <inttypes.h>
34 #endif
35 extern "C" {
36 #include <pthread.h>
37 #include "ffmpeg_compat.h"
38 #include "DNA_listBase.h"
39 #include "BLI_threads.h"
40 #include "BLI_blenlib.h"
41 }
42
43 #if LIBAVFORMAT_VERSION_INT < (49 << 16)
44 #  define FFMPEG_OLD_FRAME_RATE 1
45 #else
46 #  define FFMPEG_CODEC_IS_POINTER 1
47 #endif
48
49 #ifdef FFMPEG_CODEC_IS_POINTER
50 static inline AVCodecContext* get_codec_from_stream(AVStream* stream)
51 {
52         return stream->codec;
53 }
54 #else
55 static inline AVCodecContext* get_codec_from_stream(AVStream* stream)
56 {
57         return &stream->codec;
58 }
59 #endif
60
61 #include "VideoBase.h"
62
63 #define CACHE_FRAME_SIZE        10
64 #define CACHE_PACKET_SIZE       30
65
66 // type VideoFFmpeg declaration
67 class VideoFFmpeg : public VideoBase
68 {
69 public:
70         /// constructor
71         VideoFFmpeg (HRESULT * hRslt);
72         /// destructor
73         virtual ~VideoFFmpeg ();
74
75         /// set initial parameters
76         void initParams (short width, short height, float rate, bool image=false);
77         /// open video/image file
78         virtual void openFile (char * file);
79         /// open video capture device
80         virtual void openCam (char * driver, short camIdx);
81
82         /// release video source
83         virtual bool release (void);
84
85         /// play video
86         virtual bool play (void);
87         /// pause video
88         virtual bool pause (void);
89         /// stop video
90         virtual bool stop (void);
91         /// set play range
92         virtual void setRange (double start, double stop);
93         /// set frame rate
94         virtual void setFrameRate (float rate);
95         // some specific getters and setters
96         int getPreseek(void) { return m_preseek; }
97         void setPreseek(int preseek) { if (preseek >= 0) m_preseek = preseek; }
98         bool getDeinterlace(void) { return m_deinterlace; }
99         void setDeinterlace(bool deinterlace) { m_deinterlace = deinterlace; }
100         char *getImageName(void) { return (m_isImage) ? m_imageName.Ptr() : NULL; }
101
102 protected:
103         // format and codec information
104         AVCodec *m_codec;
105         AVFormatContext *m_formatCtx;
106         AVCodecContext *m_codecCtx;
107         // raw frame extracted from video file
108         AVFrame *m_frame;
109         // deinterlaced frame if codec requires it
110         AVFrame *m_frameDeinterlaced;
111         // decoded RGB24 frame if codec requires it
112         AVFrame *m_frameRGB;
113         // conversion from raw to RGB is done with sws_scale
114         struct SwsContext *m_imgConvertCtx;
115         // should the codec be deinterlaced?
116         bool m_deinterlace;
117         // number of frame of preseek
118         int m_preseek;
119         // order number of stream holding the video in format context
120         int m_videoStream;
121
122         // the actual frame rate
123         double m_baseFrameRate;
124
125         /// last displayed frame
126         long m_lastFrame;
127
128         /// end of file reached
129         bool m_eof;
130
131         /// flag to indicate that time is coming from application
132         bool m_externTime;
133
134         /// current file pointer position in file expressed in frame number
135         long m_curPosition;
136
137         /// time of video play start
138         double m_startTime;
139
140         /// width of capture in pixel
141         short m_captWidth;
142         
143         /// height of capture in pixel
144         short m_captHeight;
145
146         /// frame rate of capture in frames per seconds
147         float m_captRate;
148
149         /// is file an image?
150         bool m_isImage;
151
152         /// is image loading done in a separate thread?
153         bool m_isThreaded;
154
155         /// is streaming or camera?
156         bool m_isStreaming;
157
158         /// keep last image name
159         STR_String m_imageName;
160
161         /// image calculation
162         virtual void calcImage (unsigned int texId, double ts);
163
164         /// set actual position
165         void setPositions (void);
166
167         /// get actual framerate
168         double actFrameRate (void) { return m_frameRate * m_baseFrameRate; }
169
170         /// common function to video file and capture
171         int openStream(const char *filename, AVInputFormat *inputFormat, AVDictionary **formatParams);
172
173         /// check if a frame is available and load it in pFrame, return true if a frame could be retrieved
174         AVFrame* grabFrame(long frame);
175
176         /// in case of caching, put the frame back in free queue
177         void releaseFrame(AVFrame* frame);
178
179         /// start thread to load the video file/capture/stream 
180         bool startCache();
181         void stopCache();
182
183 private:
184         typedef struct {
185                 Link link;
186                 long framePosition;
187                 AVFrame *frame;
188         } CacheFrame;
189         typedef struct {
190                 Link link;
191                 AVPacket packet;
192         } CachePacket;
193
194         bool m_stopThread;
195         bool m_cacheStarted;
196         ListBase m_thread;
197         ListBase m_frameCacheBase;      // list of frames that are ready
198         ListBase m_frameCacheFree;      // list of frames that are unused
199         ListBase m_packetCacheBase;     // list of packets that are ready for decoding
200         ListBase m_packetCacheFree;     // list of packets that are unused
201         pthread_mutex_t m_cacheMutex;
202
203         AVFrame *allocFrameRGB();
204         static void *cacheThread(void *);
205 };
206
207 inline VideoFFmpeg * getFFmpeg (PyImage * self) 
208 {
209         return static_cast<VideoFFmpeg*>(self->m_image); 
210 }
211
212 #endif  //WITH_FFMPEG
213
214 #endif