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

Revision 9847, 3.2 kB (checked in by robert, 5 years ago)

Introduce FFmpegAudioStream implementation

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);
67    void close();
68
69    bool readNextPacket();
70    void rewind();
71
72    void loop(bool loop);
73    bool loop() const;
74
75    double duration() const;
76
77    FFmpegDecoderAudio & audio_decoder();
78    FFmpegDecoderVideo & video_decoder();
79    FFmpegDecoderAudio const & audio_decoder() const;
80    FFmpegDecoderVideo const & video_decoder() const;
81
82protected:
83
84    enum State
85    {
86        NORMAL,
87        END_OF_STREAM,
88        REWINDING
89    };
90
91    typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
92
93    void findAudioStream();
94    void findVideoStream();
95    void flushAudioQueue();
96    void flushVideoQueue();
97    bool readNextPacketNormal();
98    bool readNextPacketEndOfStream();
99    bool readNextPacketRewinding();
100    void rewindButDontFlushQueues();
101
102    FormatContextPtr    m_format_context;
103    AVStream *            m_audio_stream;
104    AVStream *            m_video_stream;
105
106    unsigned int        m_audio_index;
107    unsigned int        m_video_index;
108
109    FFmpegClocks        m_clocks;
110    FFmpegPacket        m_pending_packet;
111    PacketQueue            m_audio_queue;
112    PacketQueue            m_video_queue;
113   
114    FFmpegDecoderAudio    m_audio_decoder;
115    FFmpegDecoderVideo    m_video_decoder;
116
117    double                m_duration;
118    double                m_start;
119
120    State                m_state;
121    bool                m_loop;
122};
123
124
125
126
127
128inline void FFmpegDecoder::loop(const bool loop)
129{
130    m_loop = loop;
131}
132
133
134inline bool FFmpegDecoder::loop() const
135{
136    return m_loop;
137}
138
139
140inline double FFmpegDecoder::duration() const
141{
142    return double(m_format_context->duration) / AV_TIME_BASE;   
143}
144
145
146inline FFmpegDecoderAudio & FFmpegDecoder::audio_decoder()
147{
148    return m_audio_decoder;
149}
150
151
152inline FFmpegDecoderVideo & FFmpegDecoder::video_decoder()
153{
154    return m_video_decoder;
155}
156
157
158inline FFmpegDecoderAudio const & FFmpegDecoder::audio_decoder() const
159{
160    return m_audio_decoder;
161}
162
163
164inline FFmpegDecoderVideo const & FFmpegDecoder::video_decoder() const
165{
166    return m_video_decoder;
167}
168
169
170
171} // namespace osgFFmpeg
172
173
174
175#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
Note: See TracBrowser for help on using the browser.