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

Revision 10851, 3.5 kB (checked in by robert, 5 years ago)

From Julen Garcia,"I've been lately working also with the ffmpeg plugin and I implemented pause(), seek() and getReferenceTime(). I think that I have solved the internal clock issues (maybe not in the most elegant way :?"

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();
[9816]73
74    void loop(bool loop);
75    bool loop() const;
76
77    double duration() const;
[10851]78    double reference();
[9816]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;
[10851]111    AVStream *          m_audio_stream;
112    AVStream *          m_video_stream;
[9816]113
[10392]114    int                 m_audio_index;
115    int                 m_video_index;
[9816]116
117    FFmpegClocks        m_clocks;
118    FFmpegPacket        m_pending_packet;
[10851]119    PacketQueue         m_audio_queue;
120    PacketQueue         m_video_queue;
[9816]121   
[10851]122    FFmpegDecoderAudio  m_audio_decoder;
123    FFmpegDecoderVideo  m_video_decoder;
[9816]124
[10851]125    double              m_duration;
126    double              m_start;
[9816]127
[10851]128    State               m_state;
[9816]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
[10851]153inline double FFmpegDecoder::reference()
154{
155    return m_clocks.getCurrentTime();   
156}
[9816]157
[10851]158
[9816]159inline FFmpegDecoderAudio & FFmpegDecoder::audio_decoder()
160{
161    return m_audio_decoder;
162}
163
164
165inline FFmpegDecoderVideo & FFmpegDecoder::video_decoder()
166{
167    return m_video_decoder;
168}
169
170
171inline FFmpegDecoderAudio const & FFmpegDecoder::audio_decoder() const
172{
173    return m_audio_decoder;
174}
175
176
177inline FFmpegDecoderVideo const & FFmpegDecoder::video_decoder() const
178{
179    return m_video_decoder;
180}
181
182
183
184} // namespace osgFFmpeg
185
186
187
188#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
Note: See TracBrowser for help on using the browser.