Files
OpenSceneGraph/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp

119 lines
2.7 KiB
C++

#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
#include <OpenThreads/Thread>
#include <osg/Timer>
#include "FFmpegClocks.hpp"
#include "FFmpegPacket.hpp"
#include <osg/AudioStream>
#include "BoundedMessageQueue.hpp"
namespace osgFFmpeg {
class FFmpegDecoderAudio : public OpenThreads::Thread
{
public:
typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
typedef void (* PublishFunc) (const FFmpegDecoderAudio & decoder, void * user_data);
FFmpegDecoderAudio(PacketQueue & packets, FFmpegClocks & clocks);
~FFmpegDecoderAudio();
void open(AVStream * stream);
void pause(bool pause);
void close(bool waitForThreadToExit);
void setVolume(float volume);
float getVolume() const;
virtual void run();
void setAudioSink(osg::ref_ptr<osg::AudioSink> audio_sink);
void fillBuffer(void * buffer, size_t size);
bool validContext() const;
int frequency() const;
int nbChannels() const;
osg::AudioStream::SampleFormat sampleFormat() const;
private:
typedef osg::ref_ptr<osg::AudioSink> SinkPtr;
typedef std::vector<uint8_t> Buffer;
void decodeLoop();
void adjustBufferEndTps(size_t buffer_size);
size_t decodeFrame(void * buffer, size_t size);
PacketQueue & m_packets;
FFmpegClocks & m_clocks;
AVStream * m_stream;
AVCodecContext * m_context;
FFmpegPacket m_packet;
const uint8_t * m_packet_data;
int m_bytes_remaining;
Buffer m_audio_buffer;
size_t m_audio_buf_size;
size_t m_audio_buf_index;
int m_frequency;
int m_nb_channels;
osg::AudioStream::SampleFormat m_sample_format;
SinkPtr m_audio_sink;
osg::Timer m_pause_timer;
bool m_end_of_stream;
bool m_paused;
volatile bool m_exit;
};
inline bool FFmpegDecoderAudio::validContext() const
{
return m_context != 0;
}
inline int FFmpegDecoderAudio::frequency() const
{
return m_frequency;
}
inline int FFmpegDecoderAudio::nbChannels() const
{
return m_nb_channels;
}
inline osg::AudioStream::SampleFormat FFmpegDecoderAudio::sampleFormat() const
{
return m_sample_format;
}
} // namespace osgFFmpeg
#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H