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

Revision 10851, 2.6 kB (checked in by robert, 4 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_AUDIO_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
4
5#include <OpenThreads/Thread>
6
[10851]7#include <osg/Timer>
8
[9816]9#include "FFmpegClocks.hpp"
10#include "FFmpegPacket.hpp"
11
[9827]12#include <osg/AudioStream>
13
[9818]14#include "BoundedMessageQueue.hpp"
[9816]15
16
[9818]17
[9827]18
[9816]19namespace osgFFmpeg {
20
21
22
23class FFmpegDecoderAudio : public OpenThreads::Thread
24{
25public:
26
27    typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
28    typedef void (* PublishFunc) (const FFmpegDecoderAudio & decoder, void * user_data);
29
30    FFmpegDecoderAudio(PacketQueue & packets, FFmpegClocks & clocks);
31    ~FFmpegDecoderAudio();
32
33    void open(AVStream * stream);
[10851]34    void pause(bool pause);
[9869]35    void close(bool waitForThreadToExit);
36   
[9816]37    virtual void run();
38
[9847]39    void setAudioSink(osg::ref_ptr<osg::AudioSink> audio_sink);
[9816]40    void fillBuffer(void * buffer, size_t size);
41
42    bool validContext() const;
43    int frequency() const;
44    int nbChannels() const;
[9827]45    osg::AudioStream::SampleFormat sampleFormat() const;
[9816]46
47private:
48
[9847]49    typedef osg::ref_ptr<osg::AudioSink> SinkPtr;
[9816]50    typedef std::vector<uint8_t> Buffer;
51
52    void decodeLoop();
53    void adjustBufferEndTps(size_t buffer_size);
54    size_t decodeFrame(void * buffer, size_t size);
55
56
[10851]57    PacketQueue &                       m_packets;
58    FFmpegClocks &                      m_clocks;
59    AVStream *                          m_stream;
60    AVCodecContext *                    m_context;
61    FFmpegPacket                        m_packet;
62    const uint8_t *                     m_packet_data;
63    int                                 m_bytes_remaining;
[9816]64
[10851]65    Buffer                              m_audio_buffer;
66    size_t                              m_audio_buf_size;
67    size_t                              m_audio_buf_index;
[9816]68
[10851]69    int                                 m_frequency;
70    int                                 m_nb_channels;
71    osg::AudioStream::SampleFormat      m_sample_format;
[9816]72
[10851]73    SinkPtr                             m_audio_sink;
[9816]74
[10851]75    osg::Timer                          m_pause_timer;
76
77    bool                                m_end_of_stream;
78    bool                                m_paused;
79    volatile bool                       m_exit;
[9816]80};
81
82
83
84
85
86inline bool FFmpegDecoderAudio::validContext() const
87{
88    return m_context != 0;
89}
90
91
92inline int FFmpegDecoderAudio::frequency() const
93{
94    return m_frequency;
95}
96
97
98inline int FFmpegDecoderAudio::nbChannels() const
99{
100    return m_nb_channels;
101}
102
103
[9827]104inline osg::AudioStream::SampleFormat FFmpegDecoderAudio::sampleFormat() const
[9816]105{
106    return m_sample_format;
107}
108
109
110
111} // namespace osgFFmpeg
112
113
114
115#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
Note: See TracBrowser for help on using the browser.