Diffstat (limited to 'noncore/multimedia/opieplayer2/xinevideowidget.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.cpp | 97 |
1 files changed, 69 insertions, 28 deletions
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp index 9e86041..211791b 100644 --- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp +++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp @@ -1,29 +1,30 @@ /* - This file is part of the Opie Project +Â Â Â Â Â Â Â Â This file is part of the Opie Project - Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> +Â Â Â Â Â Â Â Copyright (c) 2002 Max Reiss <harlekin@handhelds.org> + Copyright (c) 2002 L. Potter <ljp@llornkcor.com> Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> =. .=l. - .>+-= - _;:, .> :=|. This program is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This program 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 GNU -..}^=.= = ; Library General Public License for more -++= -. .` .: details. - : = ...= . :.=- - -. .:....=;==+<; You should have received a copy of the GNU - -_. . . )=. = Library General Public License along with - -- :-=` this library; see the file COPYING.LIB. +Â Â Â Â Â Â .>+-= +Â _;:, Â Â .> Â Â :=|. This program is free software; you can +.> <`_, Â > Â . Â <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- Â : the terms of the GNU General Public +.="- .-=="i, Â Â .._ License as published by the Free Software +Â - . Â .-<_> Â Â .<> Foundation; either version 2 of the License, +Â Â Â ._= =} Â Â Â : or (at your option) any later version. +Â Â .%`+i> Â Â Â _;_. +Â Â .i_,=:_. Â Â Â -<s. This program 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 GNU +..}^=.= Â Â Â = Â Â Â ; Library General Public License for more +++= Â -. Â Â .` Â Â .: details. +Â : Â Â = Â ...= . :.=- +Â -. Â .:....=;==+<; You should have received a copy of the GNU +Â -_. . . Â )=. Â = Library General Public License along with +Â Â -- Â Â Â Â :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, @@ -32,4 +33,7 @@ */ +#include "xinevideowidget.h" +#include <opie2/odebug.h> + #include <qimage.h> #include <qdirectpainter_qws.h> @@ -40,5 +44,6 @@ #include <qpe/resource.h> -#include "xinevideowidget.h" +#include <pthread.h> + @@ -122,4 +127,5 @@ XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name ) m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8; m_rotation = 0; + m_lastsize = 0; } @@ -127,10 +133,23 @@ XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name ) XineVideoWidget::~XineVideoWidget ( ) { + ThreadUtil::AutoLock a(m_bufmutex); + if (m_buff) { + delete[]m_buff; + m_lastsize=0; + m_buff = 0; + } + if (m_logo) { delete m_logo; } +} void XineVideoWidget::clear ( ) { + ThreadUtil::AutoLock a(m_bufmutex); + if (m_buff) { + delete[]m_buff; + m_lastsize=0; m_buff = 0; + } repaint ( false ); } @@ -153,4 +172,14 @@ QSize XineVideoWidget::videoSize() const void XineVideoWidget::paintEvent ( QPaintEvent * ) { + ThreadUtil::AutoLock a(m_bufmutex); + QPainter p ( this ); + p. fillRect ( rect (), black ); + if (m_logo) + p. drawImage ( 0, 0, *m_logo ); +} + +void XineVideoWidget::paintEvent2 ( QPaintEvent * ) +{ + ThreadUtil::AutoLock a(m_bufmutex); if ( m_buff == 0 ) { QPainter p ( this ); @@ -273,5 +302,20 @@ void XineVideoWidget::setLogo ( QImage* logo ) void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl ) { + // mutex area for AutoLock + { + if (m_bufmutex.isLocked()) { + // no time to wait - drop frame + return; + } + ThreadUtil::AutoLock a(m_bufmutex); bool rot90 = (( -m_rotation ) & 1 ); + int l = h*m_bytes_per_pixel*w; + if (l>m_lastsize) { + if (m_buff) { + delete[]m_buff; + } + m_buff = new uchar[l]; + m_lastsize=l; + } if ( rot90 ) { // if the rotation is 90 or 270 we have to swap width / height @@ -284,12 +328,9 @@ void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl ) m_thisframe. setRect (( width ( ) - w ) / 2, ( height ( ) - h ) / 2, w , h ); - m_buff = img; + memcpy(m_buff,img,m_lastsize); m_bytes_per_line_frame = bpl; + } // Release Mutex - // only repaint the area that *really* needs to be repainted - - repaint ((( m_thisframe & m_lastframe ) != m_lastframe ) ? m_lastframe : m_thisframe, false ); - // ensure that we always have a valid frame! - m_buff = 0; + paintEvent2(0); } |