summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/videowidget.cpp
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/videowidget.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/videowidget.cpp363
1 files changed, 182 insertions, 181 deletions
diff --git a/core/multimedia/opieplayer/videowidget.cpp b/core/multimedia/opieplayer/videowidget.cpp
index 1f128a4..12ae4fd 100644
--- a/core/multimedia/opieplayer/videowidget.cpp
+++ b/core/multimedia/opieplayer/videowidget.cpp
@@ -1,33 +1,34 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20
20#include <qpe/resource.h> 21#include <qpe/resource.h>
21#include "mediaplayerplugininterface.h" 22#include <qpe/mediaplayerplugininterface.h>
22#include <qwidget.h> 23#include <qwidget.h>
23#include <qpainter.h> 24#include <qpainter.h>
24#include <qpixmap.h> 25#include <qpixmap.h>
25#include <qslider.h> 26#include <qslider.h>
26#include <qdrawutil.h> 27#include <qdrawutil.h>
27#include "videowidget.h" 28#include "videowidget.h"
28#include "mediaplayerstate.h" 29#include "mediaplayerstate.h"
29 30
30 31
31#ifdef Q_WS_QWS 32#ifdef Q_WS_QWS
32# define USE_DIRECT_PAINTER 33# define USE_DIRECT_PAINTER
33# include <qdirectpainter_qws.h> 34# include <qdirectpainter_qws.h>
@@ -57,367 +58,367 @@ MediaButton videoButtons[] = {
57 { 5+3*32+xo, 200+yo, TRUE, FALSE, FALSE, 2 }, // pause 58 { 5+3*32+xo, 200+yo, TRUE, FALSE, FALSE, 2 }, // pause
58 { 5+4*32+xo, 200+yo, FALSE, FALSE, FALSE, 3 }, // next 59 { 5+4*32+xo, 200+yo, FALSE, FALSE, FALSE, 3 }, // next
59 { 5+5*32+xo, 200+yo, FALSE, FALSE, FALSE, 8 }, // playlist 60 { 5+5*32+xo, 200+yo, FALSE, FALSE, FALSE, 8 }, // playlist
60 { 5+6*32+xo, 200+yo, TRUE, FALSE, FALSE, 9 } // fullscreen 61 { 5+6*32+xo, 200+yo, TRUE, FALSE, FALSE, 9 } // fullscreen
61}; 62};
62 63
63 64
64static const int numButtons = (sizeof(videoButtons)/sizeof(MediaButton)); 65static const int numButtons = (sizeof(videoButtons)/sizeof(MediaButton));
65 66
66 67
67VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) : 68VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) :
68 QWidget( parent, name, f ), scaledWidth( 0 ), scaledHeight( 0 ) { 69 QWidget( parent, name, f ), scaledWidth( 0 ), scaledHeight( 0 ) {
69 setCaption( tr("OpiePlayer") ); 70 setCaption( tr("MediaPlayer") );
70 setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); 71 setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) );
71 pixmaps[0] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButton0a" ) ); 72 pixmaps[0] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButton0a" ) );
72 pixmaps[1] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButton0b" ) ); 73 pixmaps[1] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButton0b" ) );
73 pixmaps[2] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaControls0" ) ); 74 pixmaps[2] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaControls0" ) );
74 currentFrame = new QImage( 220 + 2, 160, (QPixmap::defaultDepth() == 16) ? 16 : 32 ); 75 currentFrame = new QImage( 220 + 2, 160, (QPixmap::defaultDepth() == 16) ? 16 : 32 );
75 76
76 slider = new QSlider( Qt::Horizontal, this ); 77 slider = new QSlider( Qt::Horizontal, this );
77 slider->setMinValue( 0 ); 78 slider->setMinValue( 0 );
78 slider->setMaxValue( 1 ); 79 slider->setMaxValue( 1 );
79 slider->setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); 80 slider->setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) );
80 slider->setFocusPolicy( QWidget::NoFocus ); 81 slider->setFocusPolicy( QWidget::NoFocus );
81 slider->setGeometry( QRect( 7, 250, 220, 20 ) ); 82 slider->setGeometry( QRect( 7, 250, 220, 20 ) );
82 83
83 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); 84 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
84 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); 85 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
85 86
86 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); 87 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) );
87 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 88 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
88 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); 89 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
89 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) ); 90 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) );
90 connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); 91 connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) );
91 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) ); 92 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) );
92 93
93 // Intialise state 94 // Intialise state
94 setLength( mediaPlayerState->length() ); 95 setLength( mediaPlayerState->length() );
95 setPosition( mediaPlayerState->position() ); 96 setPosition( mediaPlayerState->position() );
96 setFullscreen( mediaPlayerState->fullscreen() ); 97 setFullscreen( mediaPlayerState->fullscreen() );
97 setPaused( mediaPlayerState->paused() ); 98 setPaused( mediaPlayerState->paused() );
98 setPlaying( mediaPlayerState->playing() ); 99 setPlaying( mediaPlayerState->playing() );
99} 100}
100 101
101 102
102VideoWidget::~VideoWidget() { 103VideoWidget::~VideoWidget() {
103 for ( int i = 0; i < 3; i++ ) 104 for ( int i = 0; i < 3; i++ )
104 delete pixmaps[i]; 105 delete pixmaps[i];
105 delete currentFrame; 106 delete currentFrame;
106} 107}
107 108
108 109
109static bool videoSliderBeingMoved = FALSE; 110static bool videoSliderBeingMoved = FALSE;
110 111
111 112
112void VideoWidget::sliderPressed() { 113void VideoWidget::sliderPressed() {
113 videoSliderBeingMoved = TRUE; 114 videoSliderBeingMoved = TRUE;
114} 115}
115 116
116 117
117void VideoWidget::sliderReleased() { 118void VideoWidget::sliderReleased() {
118 videoSliderBeingMoved = FALSE; 119 videoSliderBeingMoved = FALSE;
119 if ( slider->width() == 0 ) 120 if ( slider->width() == 0 )
120 return; 121 return;
121 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); 122 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width());
122 mediaPlayerState->setPosition( val ); 123 mediaPlayerState->setPosition( val );
123} 124}
124 125
125 126
126void VideoWidget::setPosition( long i ) { 127void VideoWidget::setPosition( long i ) {
127 updateSlider( i, mediaPlayerState->length() ); 128 updateSlider( i, mediaPlayerState->length() );
128} 129}
129 130
130 131
131void VideoWidget::setLength( long max ) { 132void VideoWidget::setLength( long max ) {
132 updateSlider( mediaPlayerState->position(), max ); 133 updateSlider( mediaPlayerState->position(), max );
133} 134}
134 135
135 136
136void VideoWidget::setView( char view ) { 137void VideoWidget::setView( char view ) {
137 if ( view == 'v' ) { 138 if ( view == 'v' ) {
138 makeVisible(); 139 makeVisible();
139 } else { 140 } else {
140 // Effectively blank the view next time we show it so it looks nicer 141 // Effectively blank the view next time we show it so it looks nicer
141 scaledWidth = 0; 142 scaledWidth = 0;
142 scaledHeight = 0; 143 scaledHeight = 0;
143 hide(); 144 hide();
144 } 145 }
145} 146}
146 147
147 148
148void VideoWidget::updateSlider( long i, long max ) { 149void VideoWidget::updateSlider( long i, long max ) {
149 // Will flicker too much if we don't do this 150 // Will flicker too much if we don't do this
150 if ( max == 0 ) 151 if ( max == 0 )
151 return; 152 return;
152 int width = slider->width(); 153 int width = slider->width();
153 int val = int((double)i * width / max); 154 int val = int((double)i * width / max);
154 if ( !mediaPlayerState->fullscreen() && !videoSliderBeingMoved ) { 155 if ( !mediaPlayerState->fullscreen() && !videoSliderBeingMoved ) {
155 if ( slider->value() != val ) 156 if ( slider->value() != val )
156 slider->setValue( val ); 157 slider->setValue( val );
157 if ( slider->maxValue() != width ) 158 if ( slider->maxValue() != width )
158 slider->setMaxValue( width ); 159 slider->setMaxValue( width );
159 } 160 }
160} 161}
161 162
162 163
163void VideoWidget::setToggleButton( int i, bool down ) { 164void VideoWidget::setToggleButton( int i, bool down ) {
164 if ( down != videoButtons[i].isDown ) 165 if ( down != videoButtons[i].isDown )
165 toggleButton( i ); 166 toggleButton( i );
166} 167}
167 168
168 169
169void VideoWidget::toggleButton( int i ) { 170void VideoWidget::toggleButton( int i ) {
170 videoButtons[i].isDown = !videoButtons[i].isDown; 171 videoButtons[i].isDown = !videoButtons[i].isDown;
171 QPainter p(this); 172 QPainter p(this);
172 paintButton ( &p, i ); 173 paintButton ( &p, i );
173} 174}
174 175
175 176
176void VideoWidget::paintButton( QPainter *p, int i ) { 177void VideoWidget::paintButton( QPainter *p, int i ) {
177 int x = videoButtons[i].xPos; 178 int x = videoButtons[i].xPos;
178 int y = videoButtons[i].yPos; 179 int y = videoButtons[i].yPos;
179 int offset = 10 + videoButtons[i].isDown; 180 int offset = 10 + videoButtons[i].isDown;
180 p->drawPixmap( x, y, *pixmaps[videoButtons[i].isDown] ); 181 p->drawPixmap( x, y, *pixmaps[videoButtons[i].isDown] );
181 p->drawPixmap( x + 1 + offset, y + offset, *pixmaps[2], 9 * videoButtons[i].controlType, 0, 9, 9 ); 182 p->drawPixmap( x + 1 + offset, y + offset, *pixmaps[2], 9 * videoButtons[i].controlType, 0, 9, 9 );
182} 183}
183 184
184 185
185void VideoWidget::mouseMoveEvent( QMouseEvent *event ) { 186void VideoWidget::mouseMoveEvent( QMouseEvent *event ) {
186 for ( int i = 0; i < numButtons; i++ ) { 187 for ( int i = 0; i < numButtons; i++ ) {
187 int x = videoButtons[i].xPos; 188 int x = videoButtons[i].xPos;
188 int y = videoButtons[i].yPos; 189 int y = videoButtons[i].yPos;
189 if ( event->state() == QMouseEvent::LeftButton ) { 190 if ( event->state() == QMouseEvent::LeftButton ) {
190 // The test to see if the mouse click is inside the circular button or not 191 // The test to see if the mouse click is inside the circular button or not
191 // (compared with the radius squared to avoid a square-root of our distance) 192 // (compared with the radius squared to avoid a square-root of our distance)
192 int radius = 16; 193 int radius = 16;
193 QPoint center = QPoint( x + radius, y + radius ); 194 QPoint center = QPoint( x + radius, y + radius );
194 QPoint dXY = center - event->pos(); 195 QPoint dXY = center - event->pos();
195 int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); 196 int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y();
196 bool isOnButton = dist <= (radius * radius); 197 bool isOnButton = dist <= (radius * radius);
197 if ( isOnButton != videoButtons[i].isHeld ) { 198 if ( isOnButton != videoButtons[i].isHeld ) {
198 videoButtons[i].isHeld = isOnButton; 199 videoButtons[i].isHeld = isOnButton;
199 toggleButton(i); 200 toggleButton(i);
200 } 201 }
201 } else { 202 } else {
202 if ( videoButtons[i].isHeld ) { 203 if ( videoButtons[i].isHeld ) {
203 videoButtons[i].isHeld = FALSE; 204 videoButtons[i].isHeld = FALSE;
204 if ( !videoButtons[i].isToggle ) 205 if ( !videoButtons[i].isToggle )
205 setToggleButton( i, FALSE ); 206 setToggleButton( i, FALSE );
206 switch (i) { 207 switch (i) {
207 case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return; 208 case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return;
208 case VideoStop: mediaPlayerState->setPlaying(FALSE); return; 209 case VideoStop: mediaPlayerState->setPlaying(FALSE); return;
209 case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return; 210 case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return;
210 case VideoNext: mediaPlayerState->setNext(); return; 211 case VideoNext: mediaPlayerState->setNext(); return;
211 case VideoPrevious: mediaPlayerState->setPrev(); return; 212 case VideoPrevious: mediaPlayerState->setPrev(); return;
212 case VideoPlayList: mediaPlayerState->setList(); return; 213 case VideoPlayList: mediaPlayerState->setList(); return;
213 case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return; 214 case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return;
214 } 215 }
215 } 216 }
216 } 217 }
217 } 218 }
218} 219}
219 220
220 221
221void VideoWidget::mousePressEvent( QMouseEvent *event ) { 222void VideoWidget::mousePressEvent( QMouseEvent *event ) {
222 mouseMoveEvent( event ); 223 mouseMoveEvent( event );
223} 224}
224 225
225 226
226void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) { 227void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) {
227 if ( mediaPlayerState->fullscreen() ) { 228 if ( mediaPlayerState->fullscreen() ) {
228 mediaPlayerState->setFullscreen( FALSE ); 229 mediaPlayerState->setFullscreen( FALSE );
229 makeVisible(); 230 makeVisible();
230 } else { 231 } else {
231 mouseMoveEvent( event ); 232 mouseMoveEvent( event );
232 } 233 }
233} 234}
234 235
235 236
236void VideoWidget::makeVisible() { 237void VideoWidget::makeVisible() {
237 if ( mediaPlayerState->fullscreen() ) { 238 if ( mediaPlayerState->fullscreen() ) {
238 setBackgroundMode( QWidget::NoBackground ); 239 setBackgroundMode( QWidget::NoBackground );
239 showFullScreen(); 240 showFullScreen();
240 resize( qApp->desktop()->size() ); 241 resize( qApp->desktop()->size() );
241 slider->hide(); 242 slider->hide();
242 } else { 243 } else {
243 setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); 244 setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) );
244 showNormal(); 245 showNormal();
245 showMaximized(); 246 showMaximized();
246 slider->show(); 247 slider->show();
247 } 248 }
248} 249}
249 250
250 251
251void VideoWidget::paintEvent( QPaintEvent * ) { 252void VideoWidget::paintEvent( QPaintEvent * ) {
252 QPainter p( this ); 253 QPainter p( this );
253 254
254 if ( mediaPlayerState->fullscreen() ) { 255 if ( mediaPlayerState->fullscreen() ) {
255 // Clear the background 256 // Clear the background
256 p.setBrush( QBrush( Qt::black ) ); 257 p.setBrush( QBrush( Qt::black ) );
257 p.drawRect( rect() ); 258 p.drawRect( rect() );
258 259
259 // Draw the current frame 260 // Draw the current frame
260 //p.drawImage( ); // If using directpainter we won't have a copy except whats on the screen 261 //p.drawImage( ); // If using directpainter we won't have a copy except whats on the screen
261 } else { 262 } else {
262 // draw border 263 // draw border
263 qDrawShadePanel( &p, 4, 15, 230, 170, colorGroup(), TRUE, 5, NULL ); 264 qDrawShadePanel( &p, 4, 15, 230, 170, colorGroup(), TRUE, 5, NULL );
264 265
265 // Clear the movie screen first 266 // Clear the movie screen first
266 p.setBrush( QBrush( Qt::black ) ); 267 p.setBrush( QBrush( Qt::black ) );
267 p.drawRect( 9, 20, 220, 160 ); 268 p.drawRect( 9, 20, 220, 160 );
268 269
269 // draw current frame (centrally positioned from scaling to maintain aspect ratio) 270 // draw current frame (centrally positioned from scaling to maintain aspect ratio)
270 p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); 271 p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight );
271 272
272 // draw the buttons 273 // draw the buttons
273 for ( int i = 0; i < numButtons; i++ ) 274 for ( int i = 0; i < numButtons; i++ )
274 paintButton( &p, i ); 275 paintButton( &p, i );
275 276
276 // draw the slider 277 // draw the slider
277 slider->repaint( TRUE ); 278 slider->repaint( TRUE );
278 } 279 }
279} 280}
280 281
281 282
282void VideoWidget::closeEvent( QCloseEvent* ) { 283void VideoWidget::closeEvent( QCloseEvent* ) {
283 mediaPlayerState->setList(); 284 mediaPlayerState->setList();
284} 285}
285 286
286 287
287bool VideoWidget::playVideo() { 288bool VideoWidget::playVideo() {
288 bool result = FALSE; 289 bool result = FALSE;
289 290
290 int stream = 0; 291 int stream = 0;
291 292
292 int sw = mediaPlayerState->curDecoder()->videoWidth( stream ); 293 int sw = mediaPlayerState->curDecoder()->videoWidth( stream );
293 int sh = mediaPlayerState->curDecoder()->videoHeight( stream ); 294 int sh = mediaPlayerState->curDecoder()->videoHeight( stream );
294 int dd = QPixmap::defaultDepth(); 295 int dd = QPixmap::defaultDepth();
295 int w = height(); 296 int w = height();
296 int h = width(); 297 int h = width();
297 298
298 ColorFormat format = (dd == 16) ? RGB565 : BGRA8888; 299 ColorFormat format = (dd == 16) ? RGB565 : BGRA8888;
299 300
300 if ( mediaPlayerState->fullscreen() ) { 301 if ( mediaPlayerState->fullscreen() ) {
301#ifdef USE_DIRECT_PAINTER 302#ifdef USE_DIRECT_PAINTER
302 QDirectPainter p(this); 303 QDirectPainter p(this);
303 304
304 if ( ( qt_screen->transformOrientation() == 3 ) && 305 if ( ( qt_screen->transformOrientation() == 3 ) &&
305 ( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) ) { 306 ( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) ) {
306 307
307 w = 320; 308 w = 320;
308 h = 240; 309 h = 240;
309 310
310 if ( mediaPlayerState->scaled() ) { 311 if ( mediaPlayerState->scaled() ) {
311 // maintain aspect ratio 312 // maintain aspect ratio
312 if ( w * sh > sw * h ) 313 if ( w * sh > sw * h )
313 w = sw * h / sh; 314 w = sw * h / sh;
314 else 315 else
315 h = sh * w / sw; 316 h = sh * w / sw;
316 } else { 317 } else {
317 w = sw; 318 w = sw;
318 h = sh; 319 h = sh;
319 } 320 }
320 321
321 w--; // we can't allow libmpeg to overwrite. 322 w--; // we can't allow libmpeg to overwrite.
322 QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) ); 323 QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) );
323 324
324 int ox = roff.x() - height() + 2 + (height() - w) / 2; 325 int ox = roff.x() - height() + 2 + (height() - w) / 2;
325 int oy = roff.y() + (width() - h) / 2; 326 int oy = roff.y() + (width() - h) / 2;
326 int sx = 0, sy = 0; 327 int sx = 0, sy = 0;
327 328
328 uchar* fp = p.frameBuffer() + p.lineStep() * oy; 329 uchar* fp = p.frameBuffer() + p.lineStep() * oy;
329 fp += dd * ox / 8; 330 fp += dd * ox / 8;
330 uchar **jt = new uchar*[h]; 331 uchar **jt = new uchar*[h];
331 for ( int i = h; i; i-- ) { 332 for ( int i = h; i; i-- ) {
332 jt[h - i] = fp; 333 jt[h - i] = fp;
333 fp += p.lineStep(); 334 fp += p.lineStep();
334 } 335 }
335 336
336 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0; 337 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0;
337 338
338 delete [] jt; 339 delete [] jt;
339 } else { 340 } else {
340#endif 341#endif
341 QPainter p(this); 342 QPainter p(this);
342 343
343 w = 320; 344 w = 320;
344 h = 240; 345 h = 240;
345 346
346 if ( mediaPlayerState->scaled() ) { 347 if ( mediaPlayerState->scaled() ) {
347 // maintain aspect ratio 348 // maintain aspect ratio
348 if ( w * sh > sw * h ) 349 if ( w * sh > sw * h )
349 w = sw * h / sh; 350 w = sw * h / sh;
350 else 351 else
351 h = sh * w / sw; 352 h = sh * w / sw;
352 } else { 353 } else {
353 w = sw; 354 w = sw;
354 h = sh; 355 h = sh;
355 } 356 }
356 357
357 int bytes = ( dd == 16 ) ? 2 : 4; 358 int bytes = ( dd == 16 ) ? 2 : 4;
358 QImage tempFrame( w, h, bytes << 3 ); 359 QImage tempFrame( w, h, bytes << 3 );
359 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(), 360 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(),
360 0, 0, sw, sh, w, h, format, 0) == 0; 361 0, 0, sw, sh, w, h, format, 0) == 0;
361 if ( result && mediaPlayerState->fullscreen() ) { 362 if ( result && mediaPlayerState->fullscreen() ) {
362 363
363 int rw = h, rh = w; 364 int rw = h, rh = w;
364 QImage rotatedFrame( rw, rh, bytes << 3 ); 365 QImage rotatedFrame( rw, rh, bytes << 3 );
365 366
366 ushort* in = (ushort*)tempFrame.bits(); 367 ushort* in = (ushort*)tempFrame.bits();
367 ushort* out = (ushort*)rotatedFrame.bits(); 368 ushort* out = (ushort*)rotatedFrame.bits();
368 int spl = rotatedFrame.bytesPerLine() / bytes; 369 int spl = rotatedFrame.bytesPerLine() / bytes;
369 for (int x=0; x<h; x++) { 370 for (int x=0; x<h; x++) {
370 if ( bytes == 2 ) { 371 if ( bytes == 2 ) {
371 ushort* lout = out++ + (w - 1)*spl; 372 ushort* lout = out++ + (w - 1)*spl;
372 for (int y=0; y<w; y++) { 373 for (int y=0; y<w; y++) {
373 *lout=*in++; 374 *lout=*in++;
374 lout-=spl; 375 lout-=spl;
375 } 376 }
376 } else { 377 } else {
377 ulong* lout = ((ulong *)out)++ + (w - 1)*spl; 378 ulong* lout = ((ulong *)out)++ + (w - 1)*spl;
378 for (int y=0; y<w; y++) { 379 for (int y=0; y<w; y++) {
379 *lout=*((ulong*)in)++; 380 *lout=*((ulong*)in)++;
380 lout-=spl; 381 lout-=spl;
381 } 382 }
382 } 383 }
383 } 384 }
384 385
385 p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh ); 386 p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh );
386 } 387 }
387#ifdef USE_DIRECT_PAINTER 388#ifdef USE_DIRECT_PAINTER
388 } 389 }
389#endif 390#endif
390 } else { 391 } else {
391 392
392 w = 220; 393 w = 220;
393 h = 160; 394 h = 160;
394 395
395 // maintain aspect ratio 396 // maintain aspect ratio
396 if ( w * sh > sw * h ) 397 if ( w * sh > sw * h )
397 w = sw * h / sh; 398 w = sw * h / sh;
398 else 399 else
399 h = sh * w / sw; 400 h = sh * w / sw;
400 401
401 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0; 402 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0;
402 403
403 QPainter p( this ); 404 QPainter p( this );
404 405
405 // Image changed size, therefore need to blank the possibly unpainted regions first 406 // Image changed size, therefore need to blank the possibly unpainted regions first
406 if ( scaledWidth != w || scaledHeight != h ) { 407 if ( scaledWidth != w || scaledHeight != h ) {
407 p.setBrush( QBrush( Qt::black ) ); 408 p.setBrush( QBrush( Qt::black ) );
408 p.drawRect( 9, 20, 220, 160 ); 409 p.drawRect( 9, 20, 220, 160 );
409 } 410 }
410 411
411 scaledWidth = w; 412 scaledWidth = w;
412 scaledHeight = h; 413 scaledHeight = h;
413 414
414 if ( result ) { 415 if ( result ) {
415 p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); 416 p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight );
416 } 417 }
417 418
418 } 419 }
419 420
420 return result; 421 return result;
421} 422}
422 423
423 424