root/OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp @ 10809

Revision 10809, 3.5 kB (checked in by robert, 4 years ago)

From Rafa Gaitan, "Current ffmpeg plugin didn't support pause and seek, I have added this
functionality and I also modified osgmovie example to support "seek"."

Note from Robert Osfield, changes osgmovie to use '>' for the seek as '+' was already used in a separate submission that had been merged.

RevLine 
[9816]1
2#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
4
5#include "FFmpegDecoderAudio.hpp"
6#include "FFmpegDecoderVideo.hpp"
7
[9826]8#include <osg/Notify>
[9816]9
10
11namespace osgFFmpeg {
12
[9826]13class FormatContextPtr
14{
15    public:
16   
17        typedef AVFormatContext T;
18   
19        explicit FormatContextPtr() : _ptr(0) {}
20        explicit FormatContextPtr(T* ptr) : _ptr(ptr) {}
21       
22        ~FormatContextPtr()
23        {
24            cleanup();
25        }
26       
27        T* get() { return _ptr; }
[9816]28
[9826]29        T * operator-> () const // never throws
30        {
31            return _ptr;
32        }
[9816]33
[9826]34        void reset(T* ptr)
35        {
36            if (ptr==_ptr) return;
37            cleanup();
38            _ptr = ptr;
39        }
40
41        void cleanup()
42        {
43            if (_ptr)
44            {
45                osg::notify(osg::NOTICE)<<"Calling av_close_input_file("<<_ptr<<")"<<std::endl;
46                av_close_input_file(_ptr);
47            }
48            _ptr = 0;
49        }
50       
51       
52
53    protected:
54   
55        T* _ptr;
56};
57
58
[9847]59class FFmpegDecoder : public osg::Referenced
[9816]60{
61public:
62
63    FFmpegDecoder();
64    ~FFmpegDecoder();
65
66    bool open(const std::string & filename);
[9869]67    void close(bool waitForThreadToExit);
[9816]68
69    bool readNextPacket();
70    void rewind();
[10809]71    void seek(double time);
72    void pause();
73    void resume();
[9816]74
75    void loop(bool loop);
76    bool loop() const;
77
78    double duration() const;
79
80    FFmpegDecoderAudio & audio_decoder();
81    FFmpegDecoderVideo & video_decoder();
82    FFmpegDecoderAudio const & audio_decoder() const;
83    FFmpegDecoderVideo const & video_decoder() const;
84
85protected:
86
87    enum State
88    {
89        NORMAL,
[10809]90        PAUSE,
[9816]91        END_OF_STREAM,
[10809]92        REWINDING,
93        SEEKING
[9816]94    };
95
96    typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
97
98    void findAudioStream();
99    void findVideoStream();
100    void flushAudioQueue();
101    void flushVideoQueue();
102    bool readNextPacketNormal();
103    bool readNextPacketEndOfStream();
104    bool readNextPacketRewinding();
[10809]105    bool readNextPacketSeeking();
106    bool readNextPacketPause();
[9816]107    void rewindButDontFlushQueues();
[10809]108    void seekButDontFlushQueues(double time);
[9816]109
110    FormatContextPtr    m_format_context;
111    AVStream *            m_audio_stream;
112    AVStream *            m_video_stream;
113
[10392]114    int                 m_audio_index;
115    int                 m_video_index;
[9816]116
117    FFmpegClocks        m_clocks;
118    FFmpegPacket        m_pending_packet;
119    PacketQueue            m_audio_queue;
120    PacketQueue            m_video_queue;
121   
122    FFmpegDecoderAudio    m_audio_decoder;
123    FFmpegDecoderVideo    m_video_decoder;
124
125    double                m_duration;
126    double                m_start;
127
128    State                m_state;
129    bool                m_loop;
130};
131
132
133
134
135
136inline void FFmpegDecoder::loop(const bool loop)
137{
138    m_loop = loop;
139}
140
141
142inline bool FFmpegDecoder::loop() const
143{
144    return m_loop;
145}
146
147
148inline double FFmpegDecoder::duration() const
149{
150    return double(m_format_context->duration) / AV_TIME_BASE;   
151}
152
153
154inline FFmpegDecoderAudio & FFmpegDecoder::audio_decoder()
155{
156    return m_audio_decoder;
157}
158
159
160inline FFmpegDecoderVideo & FFmpegDecoder::video_decoder()
161{
162    return m_video_decoder;
163}
164
165
166inline FFmpegDecoderAudio const & FFmpegDecoder::audio_decoder() const
167{
168    return m_audio_decoder;
169}
170
171
172inline FFmpegDecoderVideo const & FFmpegDecoder::video_decoder() const
173{
174    return m_video_decoder;
175}
176
177
178
179} // namespace osgFFmpeg
180
181
182
183#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
Note: See TracBrowser for help on using the browser.