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

Revision 9869, 2.2 kB (checked in by robert, 6 years ago)

Fixed thread exit problems

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