From e5e2cf2d303e1df7a33dbddf5c82371e8e8ee337 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 9 Feb 2005 15:31:33 +0000 Subject: [PATCH] Created local XineImageStream class to ensure xine streams are cleaned up correctly. --- src/osgPlugins/xine/ReaderWriterXine.cpp | 220 +++++++++++++++-------- 1 file changed, 143 insertions(+), 77 deletions(-) diff --git a/src/osgPlugins/xine/ReaderWriterXine.cpp b/src/osgPlugins/xine/ReaderWriterXine.cpp index 4aa516aa5..004ac93e8 100644 --- a/src/osgPlugins/xine/ReaderWriterXine.cpp +++ b/src/osgPlugins/xine/ReaderWriterXine.cpp @@ -17,38 +17,152 @@ #include "video_out_rgb.h" -static int ready = 0; - -static void my_render_frame(uint32_t width, uint32_t height, void* data, void* userData) +namespace osgXine { - osg::Image* imageStream = (osg::Image*) userData; - - GLenum pixelFormat = GL_BGRA; -#if 0 - if (!ready) - { - imageStream->allocateImage(width,height,1,pixelFormat,GL_UNSIGNED_BYTE,1); - imageStream->setInternalTextureFormat(GL_RGBA); - } +class XineImageStream : public osg::ImageStream +{ + public: + XineImageStream() {} - osg::Timer_t start_tick = osg::Timer::instance()->tick(); - - memcpy(imageStream->data(),data,imageStream->getTotalSizeInBytes()); - - osg::notify(osg::NOTICE)<<"image memcpy size="<getTotalSizeInBytes()<<" time="<delta_m(start_tick,osg::Timer::instance()->tick())<<"ms"<levels = PXLEVEL_ALL; + visual->format = PX_RGB32; + visual->user_data = this; + visual->callback = my_render_frame; + + // set up video driver + _vo = xine_open_video_driver(_xine, "rgb", XINE_VISUAL_TYPE_RGBOUT, (void*)visual); + + // set up audio driver + char* audio_driver = getenv("OSG_XINE_AUDIO_DRIVER"); + _ao = audio_driver ? xine_open_audio_driver(_xine, audio_driver, NULL) : xine_open_audio_driver(_xine, "none", NULL); + + if (!_vo) + { + osg::notify(osg::NOTICE)<<"Failed to create video driver"<play(); + + while (!_ready) + { + osg::notify(osg::NOTICE)<<"waiting..."<_ready) + { + imageStream->allocateImage(width,height,1,pixelFormat,GL_UNSIGNED_BYTE,1); + imageStream->setInternalTextureFormat(GL_RGBA); + } + + osg::Timer_t start_tick = osg::Timer::instance()->tick(); + + memcpy(imageStream->data(),data,imageStream->getTotalSizeInBytes()); + + osg::notify(osg::NOTICE)<<"image memcpy size="<getTotalSizeInBytes()<<" time="<delta_m(start_tick,osg::Timer::instance()->tick())<<"ms"<dirty(); -#else - imageStream->setImage(width,height,1, - GL_RGB, - pixelFormat,GL_UNSIGNED_BYTE, - (unsigned char *)data, - osg::Image::NO_DELETE, - 1); -#endif - ready = 1; + imageStream->dirty(); + #else + imageStream->setImage(width,height,1, + GL_RGB, + pixelFormat,GL_UNSIGNED_BYTE, + (unsigned char *)data, + osg::Image::NO_DELETE, + 1); + #endif + imageStream->_ready = true; + } + + + xine_t* _xine; + + xine_video_port_t* _vo; + xine_audio_port_t* _ao; + + rgbout_visual_info_t* _visual; + xine_stream_t* _stream; + + bool _ready; + + protected: + + + virtual ~XineImageStream() + { + close(); + } + + void close() + { + if (_stream) + { + xine_close(_stream); + xine_dispose(_stream); + _stream = 0; + } + + + if (_ao) + { + xine_close_audio_driver(_xine, _ao); + } + + if (_vo) + { + xine_close_video_driver(_xine, _vo); + } + + } + +}; + } class ReaderWriterXine : public osgDB::ReaderWriter @@ -97,57 +211,9 @@ class ReaderWriterXine : public osgDB::ReaderWriter osg::notify(osg::NOTICE)<<"ReaderWriterXine::readImage "<< file<< std::endl; - //XineImageStream* imageStream = new XineImageStream(file.c_str()); - osg::ref_ptr imageStream = new osg::ImageStream; + osg::ref_ptr imageStream = new osgXine::XineImageStream(); - - - // create visual - rgbout_visual_info_t* visual = new rgbout_visual_info_t; - visual->levels = PXLEVEL_ALL; - visual->format = PX_RGB32; - visual->user_data = imageStream.get(); - visual->callback = my_render_frame; - - - - - // set up video driver - xine_video_port_t* vo = xine_open_video_driver(_xine, "rgb", XINE_VISUAL_TYPE_RGBOUT, (void*)visual); - - // set up audio driver - char* audio_driver = getenv("OSG_XINE_AUDIO_DRIVER"); - xine_audio_port_t* ao = audio_driver ? xine_open_audio_driver(_xine, audio_driver, NULL) : xine_open_audio_driver(_xine, "none", NULL); - - if (!vo) - { - osg::notify(osg::NOTICE)<<"Failed to create video driver"<setFileName(file); - - xine_play(stream, 0, 0); - - // imageStream->play(); - - while (!ready) - { - osg::notify(osg::NOTICE)<<"waiting..."<open(_xine, file)) return ReadResult::FILE_NOT_HANDLED; return imageStream.release(); }