summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.cpp97
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.h52
2 files changed, 97 insertions, 52 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,36 +1,40 @@
1 1
2/* 2/*
3                This file is part of the Opie Project 3                This file is part of the Opie Project
4 4
5 Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> 5              Copyright (c) 2002 Max Reiss <harlekin@handhelds.org>
6 Copyright (c) 2002 L. Potter <ljp@llornkcor.com>
6 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> 7 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org>
7 =. 8 =.
8 .=l. 9 .=l.
9           .>+-= 10           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 11 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 12.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU General Public 13:`=1 )Y*s>-.--   : the terms of the GNU General Public
13.="- .-=="i,     .._ License as published by the Free Software 14.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 15 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 16     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 17    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 18    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 19     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 20    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 21    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 22  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 23..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 24++=   -.     .`     .: details.
24 :     =  ...= . :.=- 25 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 26 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 27  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 28    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 29 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 30 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 31 Boston, MA 02111-1307, USA.
31 32
32*/ 33*/
33 34
35#include "xinevideowidget.h"
36#include <opie2/odebug.h>
37
34#include <qimage.h> 38#include <qimage.h>
35#include <qdirectpainter_qws.h> 39#include <qdirectpainter_qws.h>
36#include <qgfx_qws.h> 40#include <qgfx_qws.h>
@@ -39,7 +43,8 @@
39 43
40#include <qpe/resource.h> 44#include <qpe/resource.h>
41 45
42#include "xinevideowidget.h" 46#include <pthread.h>
47
43 48
44 49
45// 0 deg rot: copy a line from src to dst (use libc memcpy) 50// 0 deg rot: copy a line from src to dst (use libc memcpy)
@@ -121,17 +126,31 @@ XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name )
121 m_bytes_per_line_fb = qt_screen-> linestep ( ); 126 m_bytes_per_line_fb = qt_screen-> linestep ( );
122 m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8; 127 m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8;
123 m_rotation = 0; 128 m_rotation = 0;
129 m_lastsize = 0;
124} 130}
125 131
126 132
127XineVideoWidget::~XineVideoWidget ( ) 133XineVideoWidget::~XineVideoWidget ( )
128{ 134{
135 ThreadUtil::AutoLock a(m_bufmutex);
136 if (m_buff) {
137 delete[]m_buff;
138 m_lastsize=0;
139 m_buff = 0;
140 }
141 if (m_logo) {
129 delete m_logo; 142 delete m_logo;
130} 143}
144}
131 145
132void XineVideoWidget::clear ( ) 146void XineVideoWidget::clear ( )
133{ 147{
148 ThreadUtil::AutoLock a(m_bufmutex);
149 if (m_buff) {
150 delete[]m_buff;
151 m_lastsize=0;
134 m_buff = 0; 152 m_buff = 0;
153 }
135 repaint ( false ); 154 repaint ( false );
136} 155}
137 156
@@ -152,6 +171,16 @@ QSize XineVideoWidget::videoSize() const
152 171
153void XineVideoWidget::paintEvent ( QPaintEvent * ) 172void XineVideoWidget::paintEvent ( QPaintEvent * )
154{ 173{
174 ThreadUtil::AutoLock a(m_bufmutex);
175 QPainter p ( this );
176 p. fillRect ( rect (), black );
177 if (m_logo)
178 p. drawImage ( 0, 0, *m_logo );
179}
180
181void XineVideoWidget::paintEvent2 ( QPaintEvent * )
182{
183 ThreadUtil::AutoLock a(m_bufmutex);
155 if ( m_buff == 0 ) { 184 if ( m_buff == 0 ) {
156 QPainter p ( this ); 185 QPainter p ( this );
157 p. fillRect ( rect ( ), black ); 186 p. fillRect ( rect ( ), black );
@@ -272,7 +301,22 @@ void XineVideoWidget::setLogo ( QImage* logo )
272 301
273void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl ) 302void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl )
274{ 303{
304 // mutex area for AutoLock
305 {
306 if (m_bufmutex.isLocked()) {
307 // no time to wait - drop frame
308 return;
309 }
310 ThreadUtil::AutoLock a(m_bufmutex);
275 bool rot90 = (( -m_rotation ) & 1 ); 311 bool rot90 = (( -m_rotation ) & 1 );
312 int l = h*m_bytes_per_pixel*w;
313 if (l>m_lastsize) {
314 if (m_buff) {
315 delete[]m_buff;
316 }
317 m_buff = new uchar[l];
318 m_lastsize=l;
319 }
276 320
277 if ( rot90 ) { // if the rotation is 90 or 270 we have to swap width / height 321 if ( rot90 ) { // if the rotation is 90 or 270 we have to swap width / height
278 int d = w; 322 int d = w;
@@ -283,14 +327,11 @@ void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl )
283 m_lastframe = m_thisframe; 327 m_lastframe = m_thisframe;
284 m_thisframe. setRect (( width ( ) - w ) / 2, ( height ( ) - h ) / 2, w , h ); 328 m_thisframe. setRect (( width ( ) - w ) / 2, ( height ( ) - h ) / 2, w , h );
285 329
286 m_buff = img; 330 memcpy(m_buff,img,m_lastsize);
287 m_bytes_per_line_frame = bpl; 331 m_bytes_per_line_frame = bpl;
332 } // Release Mutex
288 333
289 // only repaint the area that *really* needs to be repainted 334 paintEvent2(0);
290
291 repaint ((( m_thisframe & m_lastframe ) != m_lastframe ) ? m_lastframe : m_thisframe, false );
292 // ensure that we always have a valid frame!
293 m_buff = 0;
294} 335}
295 336
296void XineVideoWidget::resizeEvent ( QResizeEvent * ) 337void XineVideoWidget::resizeEvent ( QResizeEvent * )
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.h b/noncore/multimedia/opieplayer2/xinevideowidget.h
index 8b3a3ea..7f00aaa 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.h
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.h
@@ -1,29 +1,31 @@
1
1/* 2/*
2                This file is part of the Opie Project 3                This file is part of the Opie Project
3 4
4 Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> 5              Copyright (c) 2002 Max Reiss <harlekin@handhelds.org>
6 Copyright (c) 2002 L. Potter <ljp@llornkcor.com>
5 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> 7 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org>
6 =. 8 =.
7 .=l. 9 .=l.
8           .>+-= 10           .>+-=
9 _;:,     .>    :=|. This program is free software; you can 11 _;:,     .>    :=|. This program is free software; you can
10.> <`_,   >  .   <= redistribute it and/or modify it under 12.> <`_,   >  .   <= redistribute it and/or modify it under
11:`=1 )Y*s>-.--   : the terms of the GNU General Public 13:`=1 )Y*s>-.--   : the terms of the GNU General Public
12.="- .-=="i,     .._ License as published by the Free Software 14.="- .-=="i,     .._ License as published by the Free Software
13 - .   .-<_>     .<> Foundation; either version 2 of the License, 15 - .   .-<_>     .<> Foundation; either version 2 of the License,
14     ._= =}       : or (at your option) any later version. 16     ._= =}       : or (at your option) any later version.
15    .%`+i>       _;_. 17    .%`+i>       _;_.
16    .i_,=:_.      -<s. This program is distributed in the hope that 18    .i_,=:_.      -<s. This program is distributed in the hope that
17     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 19     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
18    : ..    .:,     . . . without even the implied warranty of 20    : ..    .:,     . . . without even the implied warranty of
19    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 21    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
20  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 22  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
21..}^=.=       =       ; Library General Public License for more 23..}^=.=       =       ; Library General Public License for more
22++=   -.     .`     .: details. 24++=   -.     .`     .: details.
23 :     =  ...= . :.=- 25 :     =  ...= . :.=-
24 -.   .:....=;==+<; You should have received a copy of the GNU 26 -.   .:....=;==+<; You should have received a copy of the GNU
25  -_. . .   )=.  = Library General Public License along with 27  -_. . .   )=.  = Library General Public License along with
26    --        :-=` this library; see the file COPYING.LIB. 28    --        :-=` this library; see the file COPYING.LIB.
27 If not, write to the Free Software Foundation, 29 If not, write to the Free Software Foundation,
28 Inc., 59 Temple Place - Suite 330, 30 Inc., 59 Temple Place - Suite 330,
29 Boston, MA 02111-1307, USA. 31 Boston, MA 02111-1307, USA.
@@ -31,7 +33,6 @@
31*/ 33*/
32 34
33 35
34
35#include <qwidget.h> 36#include <qwidget.h>
36 37
37#include "lib.h" 38#include "lib.h"
@@ -53,8 +54,9 @@ public:
53 QSize videoSize() const; 54 QSize videoSize() const;
54 55
55protected: 56protected:
56 void paintEvent( QPaintEvent *p ); 57 void paintEvent2( QPaintEvent *p );
57 void resizeEvent ( QResizeEvent *r ); 58 virtual void paintEvent(QPaintEvent*);
59 virtual void resizeEvent ( QResizeEvent *r );
58 60
59 void mouseReleaseEvent ( QMouseEvent *e ); 61 void mouseReleaseEvent ( QMouseEvent *e );
60 62
@@ -70,7 +72,9 @@ private:
70 int m_bytes_per_line_fb; 72 int m_bytes_per_line_fb;
71 int m_bytes_per_line_frame; 73 int m_bytes_per_line_frame;
72 int m_bytes_per_pixel; 74 int m_bytes_per_pixel;
75 int m_lastsize;
73 QImage *m_logo; 76 QImage *m_logo;
74 mutable int m_rotation; 77 mutable int m_rotation;
78 ThreadUtil::Mutex m_bufmutex;
75}; 79};
76 80