Ported across from using boost pointers, and prepped for integration of audio interface into core OSG
This commit is contained in:
parent
eef4801ba7
commit
116655c7c5
@ -1,12 +1,12 @@
|
|||||||
|
|
||||||
#ifndef HEADER_GUARD_OSGFFMPEG_AUDIO_SINK_INTERFACE_H
|
#ifndef OSG_AUDIOSINKINTERFACE_H
|
||||||
#define HEADER_GUARD_OSGFFMPEG_AUDIO_SINK_INTERFACE_H
|
#define OSG_AUDIOSINKINTERFACE_H
|
||||||
|
|
||||||
#include <osg/Object>
|
#include <osg/Object>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace osgFFmpeg
|
namespace osg
|
||||||
{
|
{
|
||||||
|
|
||||||
class AudioSinkInterface : public osg::Object
|
class AudioSinkInterface : public osg::Object
|
||||||
|
@ -46,7 +46,7 @@ bool FFmpegDecoder::open(const std::string & filename)
|
|||||||
if (av_open_input_file(&p_format_context, filename.c_str(), 0, 0, 0) != 0)
|
if (av_open_input_file(&p_format_context, filename.c_str(), 0, 0, 0) != 0)
|
||||||
throw std::runtime_error("av_open_input_file() failed");
|
throw std::runtime_error("av_open_input_file() failed");
|
||||||
|
|
||||||
m_format_context.reset(p_format_context, av_close_input_file);
|
m_format_context.reset(p_format_context);
|
||||||
|
|
||||||
// Retrieve stream info
|
// Retrieve stream info
|
||||||
if (av_find_stream_info(p_format_context) < 0)
|
if (av_find_stream_info(p_format_context) < 0)
|
||||||
|
@ -2,15 +2,58 @@
|
|||||||
#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
|
#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
|
||||||
#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
|
#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_H
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
|
||||||
|
|
||||||
#include "FFmpegDecoderAudio.hpp"
|
#include "FFmpegDecoderAudio.hpp"
|
||||||
#include "FFmpegDecoderVideo.hpp"
|
#include "FFmpegDecoderVideo.hpp"
|
||||||
|
|
||||||
|
#include <osg/Notify>
|
||||||
|
|
||||||
|
|
||||||
namespace osgFFmpeg {
|
namespace osgFFmpeg {
|
||||||
|
|
||||||
|
class FormatContextPtr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef AVFormatContext T;
|
||||||
|
|
||||||
|
explicit FormatContextPtr() : _ptr(0) {}
|
||||||
|
explicit FormatContextPtr(T* ptr) : _ptr(ptr) {}
|
||||||
|
|
||||||
|
~FormatContextPtr()
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
T* get() { return _ptr; }
|
||||||
|
|
||||||
|
T * operator-> () const // never throws
|
||||||
|
{
|
||||||
|
return _ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset(T* ptr)
|
||||||
|
{
|
||||||
|
if (ptr==_ptr) return;
|
||||||
|
cleanup();
|
||||||
|
_ptr = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
if (_ptr)
|
||||||
|
{
|
||||||
|
osg::notify(osg::NOTICE)<<"Calling av_close_input_file("<<_ptr<<")"<<std::endl;
|
||||||
|
av_close_input_file(_ptr);
|
||||||
|
}
|
||||||
|
_ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
T* _ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class FFmpegDecoder
|
class FFmpegDecoder
|
||||||
@ -45,7 +88,6 @@ protected:
|
|||||||
REWINDING
|
REWINDING
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef boost::shared_ptr<AVFormatContext> FormatContextPtr;
|
|
||||||
typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
|
typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
|
||||||
|
|
||||||
void findAudioStream();
|
void findAudioStream();
|
||||||
|
@ -106,7 +106,7 @@ void FFmpegDecoderAudio::run()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FFmpegDecoderAudio::setAudioSink(osg::ref_ptr<AudioSinkInterface> audio_sink)
|
void FFmpegDecoderAudio::setAudioSink(osg::ref_ptr<osg::AudioSinkInterface> audio_sink)
|
||||||
{
|
{
|
||||||
// The FFmpegDecoderAudio object takes the responsability of destroying the audio_sink.
|
// The FFmpegDecoderAudio object takes the responsability of destroying the audio_sink.
|
||||||
m_audio_sink = audio_sink;
|
m_audio_sink = audio_sink;
|
||||||
|
@ -30,7 +30,7 @@ public:
|
|||||||
void open(AVStream * stream);
|
void open(AVStream * stream);
|
||||||
virtual void run();
|
virtual void run();
|
||||||
|
|
||||||
void setAudioSink(osg::ref_ptr<AudioSinkInterface> audio_sink);
|
void setAudioSink(osg::ref_ptr<osg::AudioSinkInterface> audio_sink);
|
||||||
void fillBuffer(void * buffer, size_t size);
|
void fillBuffer(void * buffer, size_t size);
|
||||||
|
|
||||||
bool validContext() const;
|
bool validContext() const;
|
||||||
@ -41,7 +41,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
//typedef boost::shared_ptr<AVFrame> FramePtr;
|
//typedef boost::shared_ptr<AVFrame> FramePtr;
|
||||||
typedef osg::ref_ptr<AudioSinkInterface> SinkPtr;
|
typedef osg::ref_ptr<osg::AudioSinkInterface> SinkPtr;
|
||||||
typedef std::vector<uint8_t> Buffer;
|
typedef std::vector<uint8_t> Buffer;
|
||||||
|
|
||||||
void decodeLoop();
|
void decodeLoop();
|
||||||
|
@ -72,10 +72,10 @@ void FFmpegDecoderVideo::open(AVStream * const stream)
|
|||||||
throw std::runtime_error("avcodec_open() failed");
|
throw std::runtime_error("avcodec_open() failed");
|
||||||
|
|
||||||
// Allocate video frame
|
// Allocate video frame
|
||||||
m_frame.reset(avcodec_alloc_frame(), av_free);
|
m_frame.reset(avcodec_alloc_frame());
|
||||||
|
|
||||||
// Allocate converted RGB frame
|
// Allocate converted RGB frame
|
||||||
m_frame_rgba.reset(avcodec_alloc_frame(), av_free);
|
m_frame_rgba.reset(avcodec_alloc_frame());
|
||||||
m_buffer_rgba.resize(avpicture_get_size(PIX_FMT_RGB32, width(), height()));
|
m_buffer_rgba.resize(avpicture_get_size(PIX_FMT_RGB32, width(), height()));
|
||||||
m_buffer_rgba_public.resize(m_buffer_rgba.size());
|
m_buffer_rgba_public.resize(m_buffer_rgba.size());
|
||||||
|
|
||||||
|
@ -13,7 +13,46 @@
|
|||||||
|
|
||||||
namespace osgFFmpeg {
|
namespace osgFFmpeg {
|
||||||
|
|
||||||
|
class FramePtr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef AVFrame T;
|
||||||
|
|
||||||
|
explicit FramePtr() : _ptr(0) {}
|
||||||
|
explicit FramePtr(T* ptr) : _ptr(ptr) {}
|
||||||
|
|
||||||
|
~FramePtr()
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
T* get() { return _ptr; }
|
||||||
|
|
||||||
|
T * operator-> () const // never throws
|
||||||
|
{
|
||||||
|
return _ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset(T* ptr)
|
||||||
|
{
|
||||||
|
if (ptr==_ptr) return;
|
||||||
|
cleanup();
|
||||||
|
_ptr = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
if (_ptr) av_free(_ptr);
|
||||||
|
_ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
T* _ptr;
|
||||||
|
};
|
||||||
|
|
||||||
class FFmpegDecoderVideo : public OpenThreads::Thread
|
class FFmpegDecoderVideo : public OpenThreads::Thread
|
||||||
{
|
{
|
||||||
@ -40,7 +79,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef boost::shared_ptr<AVFrame> FramePtr;
|
|
||||||
typedef std::vector<uint8_t> Buffer;
|
typedef std::vector<uint8_t> Buffer;
|
||||||
|
|
||||||
void decodeLoop();
|
void decodeLoop();
|
||||||
|
@ -121,13 +121,12 @@ void FFmpegImageStream::quit(bool waitForThreadToExit)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FFmpegImageStream::setAudioSink(osg::ref_ptr<AudioSinkInterface> audio_sink)
|
void FFmpegImageStream::setAudioSink(osg::AudioSinkInterface* audio_sink)
|
||||||
{
|
{
|
||||||
m_decoder->audio_decoder().setAudioSink(audio_sink);
|
m_decoder->audio_decoder().setAudioSink(audio_sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FFmpegImageStream::fillAudioBuffer(void * const buffer, const size_t size)
|
void FFmpegImageStream::fillAudioBuffer(void * const buffer, const size_t size)
|
||||||
{
|
{
|
||||||
m_decoder->audio_decoder().fillBuffer(buffer, size);
|
m_decoder->audio_decoder().fillBuffer(buffer, size);
|
||||||
|
@ -53,7 +53,8 @@ namespace osgFFmpeg
|
|||||||
virtual void rewind();
|
virtual void rewind();
|
||||||
virtual void quit(bool waitForThreadToExit = true);
|
virtual void quit(bool waitForThreadToExit = true);
|
||||||
|
|
||||||
void setAudioSink(osg::ref_ptr<AudioSinkInterface> audio_sink);
|
virtual void setAudioSink(osg::AudioSinkInterface* audio_sink);
|
||||||
|
|
||||||
void fillAudioBuffer(void * const buffer, const size_t size);
|
void fillAudioBuffer(void * const buffer, const size_t size);
|
||||||
|
|
||||||
double duration() const;
|
double duration() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user