From b6bffdd02f67b32bf513acd6db9e0b42676db306 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 11 Mar 2009 15:12:46 +0000 Subject: [PATCH] From Tanguy Fautre, Clean up of the FFmpeg plugin's class API/AudioStream API. Implementation of isImageTransparent(). Implementation of Image:g/setPixelAspectRatio() --- include/osg/AudioStream | 1 - include/osg/Image | 4 +++ include/osg/ImageStream | 4 +-- src/osg/Image.cpp | 29 +++++++++---------- src/osgPlugins/ffmpeg/FFmpegAudioStream.cpp | 6 ---- src/osgPlugins/ffmpeg/FFmpegAudioStream.hpp | 1 - src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp | 1 - src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp | 10 +++---- src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp | 8 +++--- src/osgPlugins/ffmpeg/FFmpegImageStream.cpp | 30 ++++++++------------ src/osgPlugins/ffmpeg/FFmpegImageStream.hpp | 8 ++---- 11 files changed, 44 insertions(+), 58 deletions(-) diff --git a/include/osg/AudioStream b/include/osg/AudioStream index b1b105039..3be9bd9bc 100644 --- a/include/osg/AudioStream +++ b/include/osg/AudioStream @@ -59,7 +59,6 @@ class OSG_EXPORT AudioStream : public osg::Object virtual void consumeAudioBuffer(void * const buffer, const size_t size) = 0; - virtual bool audioStream() const = 0; virtual int audioFrequency() const = 0; virtual int audioNbChannels() const = 0; diff --git a/include/osg/Image b/include/osg/Image index 0253aef59..f82a9a01d 100644 --- a/include/osg/Image +++ b/include/osg/Image @@ -185,6 +185,9 @@ class OSG_EXPORT Image : public Object void setPacking(unsigned int packing) { _packing = packing; } inline unsigned int getPacking() const { return _packing; } + + inline void setPixelAspectRatio(float pixelAspectRatio) { _pixelAspectRatio = pixelAspectRatio; } + inline float getPixelAspectRatio() const { return _pixelAspectRatio; } /** Return the number of bits required for each pixel. */ inline unsigned int getPixelSizeInBits() const { return computePixelSizeInBits(_pixelFormat,_dataType); } @@ -346,6 +349,7 @@ class OSG_EXPORT Image : public Object GLenum _pixelFormat; GLenum _dataType; unsigned int _packing; + float _pixelAspectRatio; AllocationMode _allocationMode; unsigned char* _data; diff --git a/include/osg/ImageStream b/include/osg/ImageStream index d9449c707..2749cd296 100644 --- a/include/osg/ImageStream +++ b/include/osg/ImageStream @@ -78,7 +78,8 @@ class OSG_EXPORT ImageStream : public Image virtual double getLength() const { return 0.0; } - + virtual double getFrameRate() const { return 0.0; } + virtual void setReferenceTime(double) {} virtual double getReferenceTime() const { return 0.0; } @@ -88,7 +89,6 @@ class OSG_EXPORT ImageStream : public Image virtual void setVolume(float) {} virtual float getVolume() const { return 0.0f; } - typedef std::vector< osg::ref_ptr > AudioStreams; void setAudioStreams(const AudioStreams& asl) { _audioStreams = asl; } AudioStreams& getAudioStreams() { return _audioStreams; } diff --git a/src/osg/Image.cpp b/src/osg/Image.cpp index e308ea621..93c888156 100644 --- a/src/osg/Image.cpp +++ b/src/osg/Image.cpp @@ -33,23 +33,21 @@ using namespace osg; using namespace std; Image::Image() - :Object(true) + :Object(true), + _fileName(""), + _writeHint(NO_PREFERENCE), + _origin(BOTTOM_LEFT), + _s(0), _t(0), _r(0), + _internalTextureFormat(0), + _pixelFormat(0), + _dataType(0), + _packing(4), + _pixelAspectRatio(1.0), + _allocationMode(USE_NEW_DELETE), + _data(0L), + _modifiedCount(0) { setDataVariance(STATIC); - - _fileName = ""; - _writeHint = NO_PREFERENCE; - _origin = BOTTOM_LEFT; - _s = _t = _r = 0; - _internalTextureFormat = 0; - _pixelFormat = (unsigned int)0; - _dataType = (unsigned int)0; - _packing = 4; - - _allocationMode = USE_NEW_DELETE; - _data = (unsigned char *)0L; - - _modifiedCount = 0; } Image::Image(const Image& image,const CopyOp& copyop): @@ -62,6 +60,7 @@ Image::Image(const Image& image,const CopyOp& copyop): _pixelFormat(image._pixelFormat), _dataType(image._dataType), _packing(image._packing), + _pixelAspectRatio(image._pixelAspectRatio), _data(0L), _modifiedCount(image._modifiedCount), _mipmapData(image._mipmapData) diff --git a/src/osgPlugins/ffmpeg/FFmpegAudioStream.cpp b/src/osgPlugins/ffmpeg/FFmpegAudioStream.cpp index 8e6809e38..89ce71069 100644 --- a/src/osgPlugins/ffmpeg/FFmpegAudioStream.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegAudioStream.cpp @@ -51,12 +51,6 @@ double FFmpegAudioStream::duration() const } -bool FFmpegAudioStream::audioStream() const -{ - return m_decoder->audio_decoder().validContext(); -} - - int FFmpegAudioStream::audioFrequency() const { diff --git a/src/osgPlugins/ffmpeg/FFmpegAudioStream.hpp b/src/osgPlugins/ffmpeg/FFmpegAudioStream.hpp index 2d6c741f8..5143989fd 100644 --- a/src/osgPlugins/ffmpeg/FFmpegAudioStream.hpp +++ b/src/osgPlugins/ffmpeg/FFmpegAudioStream.hpp @@ -21,7 +21,6 @@ namespace osgFFmpeg void consumeAudioBuffer(void * const buffer, const size_t size); - bool audioStream() const; int audioFrequency() const; int audioNbChannels() const; osg::AudioStream::SampleFormat audioSampleFormat() const; diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp index fd78b8a9e..77252cec2 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp @@ -130,7 +130,6 @@ void FFmpegDecoderAudio::setAudioSink(osg::ref_ptr audio_sink) void FFmpegDecoderAudio::fillBuffer(void * const buffer, size_t size) { - size_t filled = 0; uint8_t * dst_buffer = reinterpret_cast(buffer); while (size != 0) diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp index 6744fe3e5..fe6ffa43b 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp @@ -222,15 +222,15 @@ void FFmpegDecoderVideo::decodeLoop() void FFmpegDecoderVideo::findAspectRatio() { - double ratio = 0.0; + float ratio = 0.0f; if (m_context->sample_aspect_ratio.num != 0) - ratio = (av_q2d(m_context->sample_aspect_ratio) * m_width) / m_height; + ratio = float(av_q2d(m_context->sample_aspect_ratio)); - if (ratio <= 0.0) - ratio = double(m_width) / double(m_height); + if (ratio <= 0.0f) + ratio = 1.0f; - m_aspect_ratio = ratio; + m_pixel_aspect_ratio = ratio; } int FFmpegDecoderVideo::convert(AVPicture *dst, int dst_pix_fmt, const AVPicture *src, diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp index 2b86e42d5..abe9b1e38 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp @@ -74,7 +74,7 @@ public: int width() const; int height() const; - double aspectRatio() const; + float pixelAspectRatio() const; bool alphaChannel() const; double frameRate() const; const uint8_t * image() const; @@ -114,7 +114,7 @@ private: PublishFunc m_publish_func; double m_frame_rate; - double m_aspect_ratio; + float m_pixel_aspect_ratio; int m_width; int m_height; size_t m_next_frame_index; @@ -155,9 +155,9 @@ inline int FFmpegDecoderVideo::height() const } -inline double FFmpegDecoderVideo::aspectRatio() const +inline float FFmpegDecoderVideo::pixelAspectRatio() const { - return m_aspect_ratio; + return m_pixel_aspect_ratio; } diff --git a/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp b/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp index 6b849aacd..83c80444f 100644 --- a/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp @@ -18,7 +18,7 @@ FFmpegImageStream::FFmpegImageStream() : m_commands(0), m_frame_published_flag(false) { - setOrigin(osg::Image::BOTTOM_LEFT); + setOrigin(osg::Image::TOP_LEFT); std::auto_ptr decoder(new FFmpegDecoder); std::auto_ptr commands(new CommandQueue); @@ -71,9 +71,9 @@ bool FFmpegImageStream::open(const std::string & filename) m_decoder->video_decoder().width(), m_decoder->video_decoder().height(), 1, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE, const_cast(m_decoder->video_decoder().image()), NO_DELETE ); - - setOrigin(osg::Image::TOP_LEFT); + setPixelAspectRatio(m_decoder->video_decoder().pixelAspectRatio()); + m_decoder->video_decoder().setUserData(this); m_decoder->video_decoder().setPublishCallback(publishNewFrame); @@ -140,33 +140,27 @@ void FFmpegImageStream::quit(bool waitForThreadToExit) } -double FFmpegImageStream::duration() const +double FFmpegImageStream::getLength() const { return m_decoder->duration(); } -bool FFmpegImageStream::videoAlphaChannel() const +double FFmpegImageStream::getFrameRate() const +{ + return m_decoder->video_decoder().frameRate(); +} + + + +bool FFmpegImageStream::isImageTranslucent() const { return m_decoder->video_decoder().alphaChannel(); } -double FFmpegImageStream::videoAspectRatio() const -{ - return m_decoder->video_decoder().aspectRatio(); -} - - - -double FFmpegImageStream::videoFrameRate() const -{ - return m_decoder->video_decoder().frameRate(); -} - - void FFmpegImageStream::run() { try diff --git a/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp b/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp index 8658c62da..ec2a03ff7 100644 --- a/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp +++ b/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp @@ -32,12 +32,10 @@ namespace osgFFmpeg virtual void rewind(); virtual void quit(bool waitForThreadToExit = true); - double duration() const; - - bool videoAlphaChannel() const; - double videoAspectRatio() const; - double videoFrameRate() const; + virtual double getLength() const; + virtual double getFrameRate() const; + virtual bool isImageTranslucent() const; private: