74a9ccb49d
"enable thread locking in libavcodec This is required for a multithreaded application using ffmpeg from another thread." "Prevent the audio from videos from hanging on exit if they are paused. The video decoder already has similar logic." "Add a way to retrieve the creation time for MPEG-4 files." "fmpeg, improve wait for close logic Both audio and video destructors have been succesfully using the logic, if(isRunning()) { m_exit = true; join(); } since it was introduced, but the close routines are using, m_exit = true; if(isRunning() && waitForThreadToExit) { while(isRunning()) { OpenThreads::Thread::YieldCurrentThread(); } } which not only is it doing an unnecessary busy wait, but it doesn't guaranteed that the other thread has terminated, just that it has progressed far enough that OpenThreads has set the thread status as not running. Like the destructor set the m_exit after checking isRunning() to avoid the race condition of not getting to join() because the thread was running, but isRunning() returns false. Now that FFmpeg*close is fixed, call it from the destructor as well to have that code in only one location."
112 lines
3.4 KiB
C++
112 lines
3.4 KiB
C++
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
|
*
|
|
* This library is open source and may be redistributed and/or modified under
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
* included with this distribution, and on the openscenegraph.org website.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* OpenSceneGraph Public License for more details.
|
|
*/
|
|
|
|
#ifndef OSG_IMAGESTREAM
|
|
#define OSG_IMAGESTREAM 1
|
|
|
|
#include <osg/Image>
|
|
#include <osg/AudioStream>
|
|
|
|
namespace osg {
|
|
|
|
/**
|
|
* Image Stream class.
|
|
*/
|
|
class OSG_EXPORT ImageStream : public Image
|
|
{
|
|
public:
|
|
ImageStream();
|
|
|
|
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
|
|
ImageStream(const ImageStream& image,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
|
|
|
|
virtual Object* cloneType() const { return new ImageStream(); }
|
|
virtual Object* clone(const CopyOp& copyop) const { return new ImageStream(*this,copyop); }
|
|
virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const ImageStream*>(obj)!=0; }
|
|
virtual const char* libraryName() const { return "osg"; }
|
|
virtual const char* className() const { return "ImageStream"; }
|
|
|
|
/** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
|
|
virtual int compare(const Image& rhs) const;
|
|
|
|
enum StreamStatus
|
|
{
|
|
INVALID,
|
|
PLAYING,
|
|
PAUSED,
|
|
REWINDING
|
|
};
|
|
|
|
virtual void seek(double /*time*/) {}
|
|
|
|
virtual void play() { _status=PLAYING; }
|
|
|
|
virtual void pause() { _status=PAUSED; }
|
|
|
|
virtual void rewind() { _status=REWINDING; }
|
|
|
|
virtual void quit(bool /*waitForThreadToExit*/ = true) {}
|
|
|
|
StreamStatus getStatus() { return _status; }
|
|
|
|
|
|
enum LoopingMode
|
|
{
|
|
NO_LOOPING,
|
|
LOOPING
|
|
};
|
|
|
|
void setLoopingMode(LoopingMode mode)
|
|
{
|
|
if (_loopingMode == mode) return;
|
|
|
|
_loopingMode = mode;
|
|
applyLoopingMode();
|
|
}
|
|
|
|
LoopingMode getLoopingMode() const { return _loopingMode; }
|
|
|
|
virtual double getCreationTime() const { return HUGE_VAL; }
|
|
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; }
|
|
|
|
virtual void setTimeMultiplier(double) {}
|
|
virtual double getTimeMultiplier() const { return 0.0; }
|
|
|
|
virtual void setVolume(float) {}
|
|
virtual float getVolume() const { return 0.0f; }
|
|
|
|
typedef std::vector< osg::ref_ptr<osg::AudioStream> > AudioStreams;
|
|
void setAudioStreams(const AudioStreams& asl) { _audioStreams = asl; }
|
|
AudioStreams& getAudioStreams() { return _audioStreams; }
|
|
const AudioStreams& getAudioStreams() const { return _audioStreams; }
|
|
|
|
|
|
protected:
|
|
virtual void applyLoopingMode() {}
|
|
|
|
virtual ~ImageStream() {}
|
|
|
|
StreamStatus _status;
|
|
LoopingMode _loopingMode;
|
|
|
|
AudioStreams _audioStreams;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif
|