VideoTexture module.
[blender-staging.git] / source / gameengine / VideoTexture / VideoFFmpeg.h
1 /* $Id$
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 #if !defined VIDEOFFMPEG_H
23 #define VIDEOFFMPEG_H
24
25 #ifdef WITH_FFMPEG
26 extern "C" {
27 #include <ffmpeg/avformat.h>
28 #include <ffmpeg/avcodec.h>
29 #include <ffmpeg/rational.h>
30 #include <ffmpeg/swscale.h>
31 }
32
33 #if LIBAVFORMAT_VERSION_INT < (49 << 16)
34 #define FFMPEG_OLD_FRAME_RATE 1
35 #else
36 #define FFMPEG_CODEC_IS_POINTER 1
37 #endif
38
39 #ifdef FFMPEG_CODEC_IS_POINTER
40 static inline AVCodecContext* get_codec_from_stream(AVStream* stream)
41 {
42         return stream->codec;
43 }
44 #else
45 static inline AVCodecContext* get_codec_from_stream(AVStream* stream)
46 {
47         return &stream->codec;
48 }
49 #endif
50
51 #include "VideoBase.h"
52
53
54 // type VideoFFmpeg declaration
55 class VideoFFmpeg : public VideoBase
56 {
57 public:
58         /// constructor
59         VideoFFmpeg (HRESULT * hRslt);
60         /// destructor
61         virtual ~VideoFFmpeg ();
62
63         /// set initial parameters
64         void initParams (short width, short height, float rate);
65         /// open video file
66         virtual void openFile (char * file);
67         /// open video capture device
68         virtual void openCam (char * driver, short camIdx);
69
70         /// release video source
71         virtual bool release (void);
72
73         /// play video
74         virtual bool play (void);
75         /// stop/pause video
76         virtual bool stop (void);
77
78         /// set play range
79         virtual void setRange (double start, double stop);
80         /// set frame rate
81         virtual void setFrameRate (float rate);
82         // some specific getters and setters
83         int getPreseek(void) { return m_preseek; }
84         void setPreseek(int preseek) { if (preseek >= 0) m_preseek = preseek; }
85         bool getDeinterlace(void) { return m_deinterlace; }
86         void setDeinterlace(bool deinterlace) { m_deinterlace = deinterlace; }
87
88 protected:
89
90         // format and codec information
91         AVCodec *m_codec;
92         AVFormatContext *m_formatCtx;
93         AVCodecContext *m_codecCtx;
94         // raw frame extracted from video file
95         AVFrame *m_frame;
96         // deinterlaced frame if codec requires it
97         AVFrame *m_frameDeinterlaced;
98         // decoded RGB24 frame if codec requires it
99         AVFrame *m_frameBGR;
100         // conversion from raw to RGB is done with sws_scale
101         struct SwsContext *m_imgConvertCtx;
102         // should the codec be deinterlaced?
103         bool m_deinterlace;
104         // number of frame of preseek
105         int m_preseek;
106         // order number of stream holding the video in format context
107         int m_videoStream;
108
109         // the actual frame rate
110         double m_baseFrameRate;
111
112         /// last displayed frame
113         long m_lastFrame;
114
115         /// current file pointer position in file expressed in frame number
116         long m_curPosition;
117
118         /// time of video play start
119         double m_startTime;
120
121         /// width of capture in pixel
122         short m_captWidth;
123         
124         /// height of capture in pixel
125         short m_captHeight;
126
127         /// frame rate of capture in frames per seconds
128         float m_captRate;
129
130         /// image calculation
131         virtual void calcImage (unsigned int texId);
132
133         /// load frame from video
134         void loadFrame (void);
135
136         /// set actual position
137         void setPositions (void);
138
139         /// get actual framerate
140         double actFrameRate (void) { return m_frameRate * m_baseFrameRate; }
141
142         /// common function to video file and capture
143         int openStream(const char *filename, AVInputFormat *inputFormat, AVFormatParameters *formatParams);
144
145         /// check if a frame is available and load it in pFrame, return true if a frame could be retrieved
146         bool grabFrame(long frame);
147
148         /// return the frame in RGB24 format, the image data is found in AVFrame.data[0]
149         AVFrame* getFrame(void) { return m_frameBGR; }
150 };
151
152 inline VideoFFmpeg * getFFmpeg (PyImage * self) 
153 {
154         return static_cast<VideoFFmpeg*>(self->m_image); 
155 }
156
157 #endif  //WITH_FFMPEG
158
159 #endif