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

Revision 9816, 2.4 kB (checked in by robert, 6 years ago)

From Tanguy Fautre (Aris Technologies), ffmpeg plugin

RevLine 
[9816]1
2#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
4
5#include <boost/shared_ptr.hpp>
6
7#include "FFmpegDecoderAudio.hpp"
8#include "FFmpegDecoderVideo.hpp"
9
10
11
12namespace osgFFmpeg {
13
14
15
16class FFmpegDecoder
17{
18public:
19
20    FFmpegDecoder();
21    ~FFmpegDecoder();
22
23    bool open(const std::string & filename);
24    void close();
25
26    bool readNextPacket();
27    void rewind();
28
29    void loop(bool loop);
30    bool loop() const;
31
32    double duration() const;
33
34    FFmpegDecoderAudio & audio_decoder();
35    FFmpegDecoderVideo & video_decoder();
36    FFmpegDecoderAudio const & audio_decoder() const;
37    FFmpegDecoderVideo const & video_decoder() const;
38
39protected:
40
41    enum State
42    {
43        NORMAL,
44        END_OF_STREAM,
45        REWINDING
46    };
47
48    typedef boost::shared_ptr<AVFormatContext> FormatContextPtr;
49    typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
50
51    void findAudioStream();
52    void findVideoStream();
53    void flushAudioQueue();
54    void flushVideoQueue();
55    bool readNextPacketNormal();
56    bool readNextPacketEndOfStream();
57    bool readNextPacketRewinding();
58    void rewindButDontFlushQueues();
59
60    FormatContextPtr    m_format_context;
61    AVStream *            m_audio_stream;
62    AVStream *            m_video_stream;
63
64    unsigned int        m_audio_index;
65    unsigned int        m_video_index;
66
67    FFmpegClocks        m_clocks;
68    FFmpegPacket        m_pending_packet;
69    PacketQueue            m_audio_queue;
70    PacketQueue            m_video_queue;
71   
72    FFmpegDecoderAudio    m_audio_decoder;
73    FFmpegDecoderVideo    m_video_decoder;
74
75    double                m_duration;
76    double                m_start;
77
78    State                m_state;
79    bool                m_loop;
80};
81
82
83
84
85
86inline void FFmpegDecoder::loop(const bool loop)
87{
88    m_loop = loop;
89}
90
91
92inline bool FFmpegDecoder::loop() const
93{
94    return m_loop;
95}
96
97
98inline double FFmpegDecoder::duration() const
99{
100    return double(m_format_context->duration) / AV_TIME_BASE;   
101}
102
103
104inline FFmpegDecoderAudio & FFmpegDecoder::audio_decoder()
105{
106    return m_audio_decoder;
107}
108
109
110inline FFmpegDecoderVideo & FFmpegDecoder::video_decoder()
111{
112    return m_video_decoder;
113}
114
115
116inline FFmpegDecoderAudio const & FFmpegDecoder::audio_decoder() const
117{
118    return m_audio_decoder;
119}
120
121
122inline FFmpegDecoderVideo const & FFmpegDecoder::video_decoder() const
123{
124    return m_video_decoder;
125}
126
127
128
129} // namespace osgFFmpeg
130
131
132
133#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
Note: See TracBrowser for help on using the browser.