-rw-r--r-- | noncore/multimedia/opieplayer2/lib.cpp | 29 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/lib.h | 2 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/nullvideo.c | 11 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/videowidget.cpp | 18 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/videowidget.h | 3 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinecontrol.cpp | 6 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinecontrol.h | 2 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.cpp | 95 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.h | 20 |
9 files changed, 126 insertions, 60 deletions
diff --git a/noncore/multimedia/opieplayer2/lib.cpp b/noncore/multimedia/opieplayer2/lib.cpp index eb57b67..00c534a 100644 --- a/noncore/multimedia/opieplayer2/lib.cpp +++ b/noncore/multimedia/opieplayer2/lib.cpp @@ -70,16 +70,11 @@ Lib::Lib(XineVideoWidget* widget) { // test loading m_videoOutput = ::init_video_out_plugin( m_config, NULL ); if (m_wid != 0 ) { printf("!0\n" ); - ::null_set_gui_width( m_videoOutput, m_wid->image()->width() ); - ::null_set_gui_height(m_videoOutput, m_wid->image()->height() ); + resize ( m_wid-> size ( )); ::null_set_mode( m_videoOutput, qt_screen->depth(), qt_screen->pixelType() ); - m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8; - QImage image = Resource::loadImage(""); - image = image.smoothScale( m_wid->width(), m_wid->height() ); - QImage* img = new QImage( image ); - m_wid->setImage( img ); + m_wid-> setImage ( new QImage ( Resource::loadImage(""))); m_wid->repaint(); } null_display_handler( m_videoOutput, xine_display_frame, @@ -99,8 +94,16 @@ Lib::~Lib() { //delete m_audioOutput; } +void Lib::resize ( const QSize &s ) +{ + if ( s. width ( ) && s. height ( )) { + ::null_set_gui_width( m_videoOutput, s. width() ); + ::null_set_gui_height(m_videoOutput, s. height() ); + } +} + QCString Lib::version() { QCString str( xine_get_str_version() ); return str; }; @@ -186,24 +189,18 @@ void Lib::xine_event_handler( void* user_data, xine_event_t* t ) { ((Lib*)user_data)->handleXineEvent( t ); } void Lib::xine_display_frame( void* user_data, uint8_t *frame, int width, int height, int bytes ) { -// printf("display x frame"); - ((Lib*)user_data)->drawFrame( frame, width, height, bytes ); -// printf("displayed x frame\n"); + + ((Lib*)user_data)->drawFrame( frame, width, height, bytes ); } void Lib::drawFrame( uint8_t* frame, int width, int height, int bytes ) { if (!m_video ) { qWarning("not showing video now"); return; } // qWarning("called draw frame %d %d", width, height); - QSize size = m_wid->size(); - int xoffset = (size.width() - width) / 2; - int yoffset = (size.height() - height) / 2; - int linestep = qt_screen->linestep(); - - m_wid->setImage( frame, yoffset, xoffset, width, height, linestep, bytes, m_bytes_per_pixel ); + m_wid->setImage( frame, width, height, bytes ); // m_wid->repaint(false); } diff --git a/noncore/multimedia/opieplayer2/lib.h b/noncore/multimedia/opieplayer2/lib.h index d568a32..a15f362 100644 --- a/noncore/multimedia/opieplayer2/lib.h +++ b/noncore/multimedia/opieplayer2/lib.h @@ -31,8 +31,10 @@ namespace XINE { int minorVersion()/*const*/; int subVersion()/*const*/; + void resize ( const QSize &s ); + int play( const QString& fileName, int startPos = 0, int start_time = 0 ); void stop() /*const*/; diff --git a/noncore/multimedia/opieplayer2/nullvideo.c b/noncore/multimedia/opieplayer2/nullvideo.c index 3a18a40..5ee8d5d 100644 --- a/noncore/multimedia/opieplayer2/nullvideo.c +++ b/noncore/multimedia/opieplayer2/nullvideo.c @@ -63,8 +63,9 @@ struct opie_frame_s { double ratio_factor; int ideal_width; int ideal_height; int output_width, output_height; + int gui_width, gui_height; uint8_t *chunk[3]; yuv2rgb_t *yuv2rgb; uint8_t *rgb_dst; @@ -292,9 +293,10 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, || (ratio_code != frame->ratio_code) || (flags != frame->flags) || (format != frame->format) || (this->user_ratio != frame->user_ratio) - || this->gui_changed ) { + || (this->gui_width != frame-> gui_width ) + || (this-> gui_height != frame-> gui_height)) { frame->width = width; frame->height = height; frame->ratio_code = ratio_code; @@ -302,9 +304,10 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, frame->format = format; frame->user_ratio = this->user_ratio; this->gui_changed = 0; // frame->show_video = this->m_show_video; - + frame->gui_width = this->gui_width; + frame->gui_height = this->gui_height; null_compute_ideal_size (this, frame); null_compute_rgb_size (this, frame); @@ -535,10 +538,10 @@ vo_driver_t* init_video_out_plugin( config_values_t* conf, vo->m_video_fullscreen = 0; vo->m_is_scaling = 0; vo->user_ratio = ASPECT_AUTO; vo->display_ratio = 1.0; - vo->gui_width = 200; - vo->gui_height = 150; + vo->gui_width = 16; + vo->gui_height = 8; vo->frameDis = NULL; /* install callback handlers*/ vo->vo_driver.get_capabilities = null_get_capabilities; diff --git a/noncore/multimedia/opieplayer2/videowidget.cpp b/noncore/multimedia/opieplayer2/videowidget.cpp index 48caf00..af06079 100644 --- a/noncore/multimedia/opieplayer2/videowidget.cpp +++ b/noncore/multimedia/opieplayer2/videowidget.cpp @@ -109,8 +109,12 @@ VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) : slider->setBackgroundPixmap( Resource::loadPixmap( backgroundPix ) ); slider->setFocusPolicy( QWidget::NoFocus ); slider->setGeometry( QRect( 7, 250, 220, 20 ) ); + videoFrame = new XineVideoWidget ( this, "Video frame" ); + + connect ( videoFrame, SIGNAL( videoResized ( const QSize & )), this, SIGNAL( videoResized ( const QSize & ))); + connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); @@ -126,10 +130,8 @@ VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) : setFullscreen( mediaPlayerState->fullscreen() ); setPaused( mediaPlayerState->paused() ); setPlaying( mediaPlayerState->playing() ); - videoFrame = new XineVideoWidget( 240, 155 ,this, "Video frame" ); - } VideoWidget::~VideoWidget() { @@ -278,13 +280,15 @@ void VideoWidget::makeVisible() { setBackgroundMode( QWidget::NoBackground ); showFullScreen(); resize( qApp->desktop()->size() ); slider->hide(); + videoFrame-> setGeometry ( 0, 0, width ( ), height ( )); } else { setBackgroundPixmap( Resource::loadPixmap( backgroundPix ) ); showNormal(); showMaximized(); slider->show(); + videoFrame->setGeometry( QRect( 10, 20, 220, 160 ) ); } } @@ -293,13 +297,13 @@ void VideoWidget::paintEvent( QPaintEvent * ) { if ( mediaPlayerState->fullscreen() ) { // Clear the background p.setBrush( QBrush( Qt::black ) ); - videoFrame->setGeometry( QRect( 0, 0 , 240 ,340 ) ); +// videoFrame->setGeometry( QRect( 0, 0 , 240 ,320 ) ); } else { - videoFrame->setGeometry( QRect( 0, 15 , 240 ,170 ) ); + // videoFrame->setGeometry( QRect( 0, 15 , 240 ,170 ) ); // draw the buttons for ( int i = 0; i < numButtons; i++ ) { paintButton( &p, i ); @@ -381,4 +385,10 @@ void VideoWidget::keyReleaseEvent( QKeyEvent *e) } XineVideoWidget* VideoWidget::vidWidget() { return videoFrame; } + + +void VideoWidget::setFullscreen ( bool b ) +{ + setToggleButton( VideoFullscreen, b ); +}
\ No newline at end of file diff --git a/noncore/multimedia/opieplayer2/videowidget.h b/noncore/multimedia/opieplayer2/videowidget.h index 0122d5d..fc53f89 100644 --- a/noncore/multimedia/opieplayer2/videowidget.h +++ b/noncore/multimedia/opieplayer2/videowidget.h @@ -63,16 +63,17 @@ public slots: void sliderPressed( ); void sliderReleased( ); void setPaused( bool b) { setToggleButton( VideoPause, b ); } void setPlaying( bool b) { setToggleButton( VideoPlay, b ); } - void setFullscreen( bool b ) { setToggleButton( VideoFullscreen, b ); } + void setFullscreen( bool b ); void makeVisible(); void setPosition( long ); void setLength( long ); void setView( char ); signals: void sliderMoved( long ); + void videoResized ( const QSize &s ); protected: void paintEvent( QPaintEvent *pe ); void mouseMoveEvent( QMouseEvent *event ); diff --git a/noncore/multimedia/opieplayer2/xinecontrol.cpp b/noncore/multimedia/opieplayer2/xinecontrol.cpp index 19a9172..33889d0 100644 --- a/noncore/multimedia/opieplayer2/xinecontrol.cpp +++ b/noncore/multimedia/opieplayer2/xinecontrol.cpp @@ -42,8 +42,9 @@ extern VideoWidget *videoUI; XineControl::XineControl( QObject *parent, const char *name ) : QObject( parent, name ) { libXine = new XINE::Lib(videoUI->vidWidget() ); + connect ( videoUI, SIGNAL( videoResized ( const QSize & )), this, SLOT( videoResized ( const QSize & ))); connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( pause(bool) ) ); connect( this, SIGNAL( positionChanged( long ) ), mediaPlayerState, SLOT( updatePosition( long ) ) ); connect( this, SIGNAL( positionChanged( long ) ), mediaPlayerState, SLOT( setPosition( long ) ) ); connect( mediaPlayerState, SIGNAL( playingToggled( bool ) ), this, SLOT( stop( bool ) ) ); @@ -127,4 +128,9 @@ void XineControl::setFullscreen( bool isSet ) { void XineControl::seekTo( long second ) { // libXine-> } + +void XineControl::videoResized ( const QSize &s ) +{ + libXine-> resize ( s ); +} diff --git a/noncore/multimedia/opieplayer2/xinecontrol.h b/noncore/multimedia/opieplayer2/xinecontrol.h index 295d2b4..4a61f32 100644 --- a/noncore/multimedia/opieplayer2/xinecontrol.h +++ b/noncore/multimedia/opieplayer2/xinecontrol.h @@ -55,8 +55,10 @@ public slots: // get length of media file and set it void length(); long position(); + void videoResized ( const QSize &s ); + private: XINE::Lib *libXine; MediaDetect mdetect; long m_currentTime; diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp index 4b69044..98446a0 100644 --- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp +++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp @@ -37,13 +37,15 @@ #include <qgfx_qws.h> #include <qdirectpainter_qws.h> #include <qgfx_qws.h> #include <qsize.h> +#include <qapplication.h> #include <qpe/resource.h> #include "xinevideowidget.h" + static inline void memcpy_rev ( void *dst, void *src, size_t len ) { ((char *) src ) += len; @@ -73,23 +75,21 @@ static inline void memcpy_step_rev ( void *dst, void *src, size_t len, size_t st } } -XineVideoWidget::XineVideoWidget( int width, - int height, - QWidget* parent, - const char* name ) +XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name ) : QWidget ( parent, name, WRepaintNoErase | WResizeNoErase ) { - m_image = new QImage ( width, height, qt_screen-> depth ( )); - m_buff = 0; setBackgroundMode ( NoBackground ); - /* QImage image = Resource::loadImage("SoundPlayer"); - image = image.smoothScale( width, height ); - - m_image = new QImage( image );*/ + + m_image = 0; + m_buff = 0; + m_bytes_per_line_fb = qt_screen-> linestep ( ); + m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8; + m_rotation = 0; } + XineVideoWidget::~XineVideoWidget ( ) { delete m_image; } @@ -105,9 +105,10 @@ void XineVideoWidget::paintEvent ( QPaintEvent * ) //qWarning( "painting <<<" ); if ( m_buff == 0 ) { QPainter p ( this ); p. fillRect ( rect ( ), black ); - p. drawImage ( 0, 0, *m_image ); + if ( m_image ) + p. drawImage ( 0, 0, *m_image ); //qWarning ( "logo\n" ); } else { // qWarning ( "paintevent\n" ); @@ -116,9 +117,9 @@ void XineVideoWidget::paintEvent ( QPaintEvent * ) { QDirectPainter dp ( this ); - int rot = dp. transformOrientation ( ); + int rot = dp. transformOrientation ( ) + m_rotation; uchar *fb = dp. frameBuffer ( ); uchar *frame = m_buff; // rot == 0 ? m_buff : m_buff + ( m_thisframe. height ( ) - 1 ) * m_bytes_per_line_frame; @@ -196,35 +197,71 @@ void XineVideoWidget::paintEvent ( QPaintEvent * ) } //qWarning( "painting >>>" ); } -int XineVideoWidget::height ( ) const -{ - return m_image-> height ( ); -} - -int XineVideoWidget::width ( ) const -{ - return m_image-> width ( ); -} void XineVideoWidget::setImage ( QImage* image ) { delete m_image; m_image = image; } -void XineVideoWidget::setImage( uchar* image, int yoffsetXLine, - int xoffsetXBytes, int width, - int height, int linestep, int bytes, int bpp ) +void XineVideoWidget::setImage ( uchar* img, int w, int h, int bpl ) { + bool rot90 = (( -m_rotation ) & 1 ); + + if ( rot90 ) { + int d = w; + w = h; + h = d; + } m_lastframe = m_thisframe; - m_thisframe. setRect ( xoffsetXBytes, yoffsetXLine, width, height ); + m_thisframe. setRect (( width ( ) - w ) / 2, ( height ( ) - h ) / 2, w , h ); - m_buff = image; - m_bytes_per_line_fb = linestep; - m_bytes_per_line_frame = bytes; - m_bytes_per_pixel = bpp; +// qDebug ( "Frame: %d,%d - %dx%d", ( width ( ) - w ) / 2, ( height ( ) - h ) / 2, w , h ); + + m_buff = img; + m_bytes_per_line_frame = bpl; repaint ((( m_thisframe & m_lastframe ) != m_lastframe ) ? m_lastframe : m_thisframe, false ); } + +void XineVideoWidget::resizeEvent ( QResizeEvent * ) +{ + QSize s = size ( ); + bool fs = ( s == qApp-> desktop ( )-> size ( )); + + m_rotation = fs ? -qt_screen-> transformOrientation ( ) : 0; + + if ( fs && qt_screen-> isTransformed ( )) { + s = qt_screen-> mapToDevice ( s ); + } + +// qDebug ( "\n\nResize: %dx%d, Rot: %d", s.width(),s.height(),m_rotation ); + + emit videoResized ( s ); +} + + +void XineVideoWidget::mousePressEvent ( QMouseEvent *me ) +{ + QWidget *p = parentWidget ( ); + + if ( p ) { + QMouseEvent pme ( QEvent::MouseButtonPress, mapToParent ( me-> pos ( )), me-> globalPos ( ), me-> button ( ), me-> state ( )); + + QApplication::sendEvent ( p, &pme ); + } +} + +void XineVideoWidget::mouseReleaseEvent ( QMouseEvent *me ) +{ + QWidget *p = parentWidget ( ); + + if ( p ) { + QMouseEvent pme ( QEvent::MouseButtonRelease, mapToParent ( me-> pos ( )), me-> globalPos ( ), me-> button ( ), me-> state ( )); + + QApplication::sendEvent ( p, &pme ); + } +} + diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.h b/noncore/multimedia/opieplayer2/xinevideowidget.h index 7d9a6d2..2fc627d 100644 --- a/noncore/multimedia/opieplayer2/xinevideowidget.h +++ b/noncore/multimedia/opieplayer2/xinevideowidget.h @@ -34,23 +34,31 @@ #include <qwidget.h> +#include "lib.h" + class QImage; class XineVideoWidget : public QWidget { Q_OBJECT public: - XineVideoWidget( int width, int height, QWidget* parent, const char* name ); + XineVideoWidget( QWidget* parent, const char* name ); ~XineVideoWidget(); QImage *image() { return m_image; }; void setImage( QImage* image ); - void setImage( uchar* image, int yoffsetXLine, int xoffsetXBytes, - int width, int height, int linestep, int bytes, int bpp); - int width() const; - int height() const; + void setImage( uchar* image, int width, int height, int linestep); void clear() ; + protected: void paintEvent( QPaintEvent* p ); + void resizeEvent ( QResizeEvent *r ); + + void mousePressEvent ( QMouseEvent *e ); + void mouseReleaseEvent ( QMouseEvent *e ); + +signals: + void videoResized ( const QSize &s ); + private: QRect m_lastframe; QRect m_thisframe; @@ -58,7 +66,7 @@ private: int m_bytes_per_line_fb; int m_bytes_per_line_frame; int m_bytes_per_pixel; QImage* m_image; - + int m_rotation; }; |