summaryrefslogtreecommitdiff
path: root/noncore
authorzecke <zecke>2002-07-11 22:44:54 (UTC)
committer zecke <zecke>2002-07-11 22:44:54 (UTC)
commitd2c7228d2efe6f47ef5b7ec04157fcead775be74 (patch) (unidiff)
tree95584eff5b953cc4ac908da028ef3c66c75b28cd /noncore
parent1651f048bb129b8e748a01c514d84c8626e0f1e2 (diff)
downloadopie-d2c7228d2efe6f47ef5b7ec04157fcead775be74.zip
opie-d2c7228d2efe6f47ef5b7ec04157fcead775be74.tar.gz
opie-d2c7228d2efe6f47ef5b7ec04157fcead775be74.tar.bz2
broken video widget
Diffstat (limited to 'noncore') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/lib.cpp65
-rw-r--r--noncore/multimedia/opieplayer2/lib.h6
-rw-r--r--noncore/multimedia/opieplayer2/nullvideo.c542
-rw-r--r--noncore/multimedia/opieplayer2/opieplayer2.pro6
-rw-r--r--noncore/multimedia/opieplayer2/videowidget.cpp12
-rw-r--r--noncore/multimedia/opieplayer2/videowidget.h2
-rw-r--r--noncore/multimedia/opieplayer2/xinecontrol.cpp6
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.cpp81
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.h13
-rw-r--r--noncore/multimedia/opieplayer2/zeckeplayer.pro2
10 files changed, 659 insertions, 76 deletions
diff --git a/noncore/multimedia/opieplayer2/lib.cpp b/noncore/multimedia/opieplayer2/lib.cpp
index 3f2eea6..aa37cd7 100644
--- a/noncore/multimedia/opieplayer2/lib.cpp
+++ b/noncore/multimedia/opieplayer2/lib.cpp
@@ -4,2 +4,4 @@
4//#include <qpe/qpeapplication.h> 4//#include <qpe/qpeapplication.h>
5#include <qimage.h>
6#include <qpe/resource.h>
5 7
@@ -7,2 +9,5 @@
7 9
10#include <qgfx_qws.h>
11#include <qdirectpainter_qws.h>
12
8#include "xinevideowidget.h" 13#include "xinevideowidget.h"
@@ -11,2 +16,4 @@
11 16
17typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame,
18 int width, int height,int bytes );
12 19
@@ -20,3 +27,6 @@ extern "C" {
20 void null_set_scaling( vo_driver_t* self, int scale ); 27 void null_set_scaling( vo_driver_t* self, int scale );
21 28 void null_set_gui_width( vo_driver_t* self, int width );
29 void null_set_gui_height( vo_driver_t* self, int height );
30 void null_set_mode( vo_driver_t* self, int depth, int rgb );
31 void null_display_handler(vo_driver_t* self, display_xine_frame_t t, void* user_data);
22} 32}
@@ -25,3 +35,5 @@ using namespace XINE;
25 35
26Lib::Lib(XineVideoWidget* /*widget*/) { 36Lib::Lib(XineVideoWidget* widget) {
37 m_video = false;
38 m_wid = widget;
27 printf("Lib"); 39 printf("Lib");
@@ -42,5 +54,6 @@ Lib::Lib(XineVideoWidget* /*widget*/) {
42 // test code 54 // test code
43 m_videoOutput = xine_load_video_output_plugin(m_config, "fb", 55/* m_videoOutput = xine_load_video_output_plugin(m_config, "fb",
44 VISUAL_TYPE_FB, 56 VISUAL_TYPE_FB,
45 0 ); 57 0 );
58*/
46 59
@@ -50,3 +63,3 @@ Lib::Lib(XineVideoWidget* /*widget*/) {
50 while ( ( out = files[i] ) != 0 ) { 63 while ( ( out = files[i] ) != 0 ) {
51 printf("Audio %s\n", out ); 64 printf("Video %s\n", out );
52 i++; 65 i++;
@@ -58,2 +71,18 @@ Lib::Lib(XineVideoWidget* /*widget*/) {
58 m_videoOutput = ::init_video_out_plugin( m_config, NULL ); 71 m_videoOutput = ::init_video_out_plugin( m_config, NULL );
72 if (m_wid != 0 ) {
73 printf("!0\n" );
74 ::null_set_gui_width( m_videoOutput, m_wid->image()->width() );
75 ::null_set_gui_height(m_videoOutput, m_wid->image()->height() );
76 ::null_set_mode( m_videoOutput, qt_screen->depth(), qt_screen->pixelType() );
77 m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8;
78 QImage image = Resource::loadImage("SoundPlayer");
79 image = image.smoothScale( m_wid->width(), m_wid->height() );
80 QImage* img = new QImage( image );
81 m_wid->setImage( img );
82 m_wid->repaint();
83 }
84 null_display_handler( m_videoOutput,
85 xine_display_frame,
86 this );
87
59 m_xine = xine_init( m_videoOutput, 88 m_xine = xine_init( m_videoOutput,
@@ -91,3 +120,6 @@ int Lib::play( const QString& fileName,
91 int start_time ) { 120 int start_time ) {
92 QString str = fileName; 121 QString str = fileName.stripWhiteSpace();
122 //workaround OpiePlayer bug
123 if (str.right(1) == QString::fromLatin1("/") )
124 str = str.mid( str.length() -1 );
93 return xine_play( m_xine, QFile::encodeName(str.utf8() ).data(), 125 return xine_play( m_xine, QFile::encodeName(str.utf8() ).data(),
@@ -134,2 +166,3 @@ void Lib::handleXineEvent( xine_event_t* t ) {
134void Lib::setShowVideo( bool video ) { 166void Lib::setShowVideo( bool video ) {
167 m_video = video;
135 ::null_set_show_video( m_videoOutput, video ); 168 ::null_set_show_video( m_videoOutput, video );
@@ -154 +187,23 @@ void Lib::xine_event_handler( void* user_data, xine_event_t* t ) {
154} 187}
188void Lib::xine_display_frame( void* user_data, uint8_t *frame,
189 int width, int height, int bytes ) {
190 printf("display x frame");
191 ((Lib*)user_data)->drawFrame( frame, width, height, bytes );
192 printf("displayed x frame\n");
193}
194void Lib::drawFrame( uint8_t* frame, int width, int height, int bytes ) {
195 if (!m_video ) {
196 qWarning("not showing video now");
197 return;
198 }
199 qWarning("called draw frame %d %d", width, height);
200
201 QSize size = m_wid->size();
202 int xoffset = (size.width() - width) / 2;
203 int yoffset = (size.height() - height) / 2;
204 int linestep = qt_screen->linestep();
205
206 m_wid->setImage( frame, yoffset, xoffset, width, height, linestep, bytes, m_bytes_per_pixel );
207 m_wid->repaint();
208
209}
diff --git a/noncore/multimedia/opieplayer2/lib.h b/noncore/multimedia/opieplayer2/lib.h
index 1d0d3af..d568a32 100644
--- a/noncore/multimedia/opieplayer2/lib.h
+++ b/noncore/multimedia/opieplayer2/lib.h
@@ -94,2 +94,5 @@ namespace XINE {
94 private: 94 private:
95 int m_bytes_per_pixel;
96 bool m_video:1;
97 XineVideoWidget *m_wid;
95 xine_t *m_xine; 98 xine_t *m_xine;
@@ -100,4 +103,7 @@ namespace XINE {
100 void handleXineEvent( xine_event_t* t ); 103 void handleXineEvent( xine_event_t* t );
104 void drawFrame( uint8_t* frame, int width, int height, int bytes );
101 // C -> C++ bridge for the event system 105 // C -> C++ bridge for the event system
102 static void xine_event_handler( void* user_data, xine_event_t* t); 106 static void xine_event_handler( void* user_data, xine_event_t* t);
107 static void xine_display_frame( void* user_data, uint8_t* frame ,
108 int width, int height, int bytes );
103 }; 109 };
diff --git a/noncore/multimedia/opieplayer2/nullvideo.c b/noncore/multimedia/opieplayer2/nullvideo.c
index 8badb7b..e50d7b5 100644
--- a/noncore/multimedia/opieplayer2/nullvideo.c
+++ b/noncore/multimedia/opieplayer2/nullvideo.c
@@ -5,2 +5,4 @@
5 5
6#include <math.h>
7
6#include <xine/video_out.h> 8#include <xine/video_out.h>
@@ -10,2 +12,10 @@
10 12
13#include <pthread.h>
14#include "alphablend.h"
15#include "yuv2rgb.h"
16
17/* the caller for our event draw handler */
18typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame,
19 int width, int height,int bytes );
20
11typedef struct null_driver_s null_driver_t; 21typedef struct null_driver_s null_driver_t;
@@ -18,2 +28,21 @@ struct null_driver_s {
18 int m_is_scaling; 28 int m_is_scaling;
29 int depth, bpp, bytes_per_pixel;
30 int yuv2rgb_mode;
31 int yuv2rgb_swap;
32 int zuv2rgb_gamma;
33 uint8_t *yuv2rgb_cmap;
34 yuv2rgb_factory_t *yuv2rgb_factory;
35 vo_overlay_t *overlay;
36 int user_ratio;
37 double output_scale_factor;
38 int last_frame_output_width;
39 int last_frame_output_height;
40 int gui_width;
41 int gui_height;
42 int gui_changed;
43 double display_ratio;
44 void* caller;
45 display_xine_frame_t frameDis;
46
47
19}; 48};
@@ -24,5 +53,5 @@ struct opie_frame_s {
24 int version; 53 int version;
25 int m_width; 54 int width;
26 int m_height; 55 int height;
27 int m_ratio_code; 56 int ratio_code;
28 int format; 57 int format;
@@ -31,2 +60,3 @@ struct opie_frame_s {
31 60
61 double ratio_factor;
32 int ideal_width; 62 int ideal_width;
@@ -35,2 +65,4 @@ struct opie_frame_s {
35 uint8_t *chunk[3]; 65 uint8_t *chunk[3];
66
67 yuv2rgb_t *yuv2rgb;
36 uint8_t *rgb_dst; 68 uint8_t *rgb_dst;
@@ -42,3 +74,3 @@ struct opie_frame_s {
42 74
43 75 int show_video;
44 null_driver_t *output; 76 null_driver_t *output;
@@ -52,2 +84,42 @@ static uint32_t null_get_capabilities(vo_driver_t *self ){
52 84
85static void null_frame_copy (vo_frame_t *vo_img, uint8_t **src) {
86 opie_frame_t *frame = (opie_frame_t *) vo_img ;
87 printf("frame copy\n");
88 if(!frame->show_video ){ printf("no video\n"); return; } // no video
89
90 if (frame->format == IMGFMT_YV12) {
91 frame->yuv2rgb->yuv2rgb_fun (frame->yuv2rgb, frame->rgb_dst,
92 src[0], src[1], src[2]);
93 } else {
94
95 frame->yuv2rgb->yuy22rgb_fun (frame->yuv2rgb, frame->rgb_dst,
96 src[0]);
97
98 }
99
100 frame->rgb_dst += frame->stripe_inc;
101 printf("returning\n");
102}
103
104static void null_frame_field (vo_frame_t *vo_img, int which_field) {
105
106 opie_frame_t *frame = (opie_frame_t *) vo_img ;
107 printf("field\n\n");
108
109 switch (which_field) {
110 case VO_TOP_FIELD:
111 frame->rgb_dst = (uint8_t *)frame->data;
112 frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line;
113 break;
114 case VO_BOTTOM_FIELD:
115 frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ;
116 frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line;
117 break;
118 case VO_BOTH_FIELDS:
119 frame->rgb_dst = (uint8_t *)frame->data;
120 break;
121 }
122}
123
124
53/* take care of the frame*/ 125/* take care of the frame*/
@@ -56,8 +128,6 @@ static void null_frame_dispose( vo_frame_t* vo_img){
56 printf("frame_dispose\n"); 128 printf("frame_dispose\n");
129 if( frame->data )
130 free( frame->data );
57 free (frame); 131 free (frame);
58} 132}
59static void null_frame_field( vo_frame_t* frame, int inti ){
60 printf("frame_field\n");
61 /* not needed */
62}
63 133
@@ -67,4 +137,8 @@ static vo_frame_t* null_alloc_frame( vo_driver_t* self ){
67 null_driver_t* this = (null_driver_t*)self; 137 null_driver_t* this = (null_driver_t*)self;
68 opie_frame_t* frame = (opie_frame_t*)malloc ( sizeof(opie_frame_t) ); 138 opie_frame_t* frame;
139 frame = (opie_frame_t*)malloc ( sizeof(opie_frame_t) );
140
69 memset( frame, 0, sizeof( opie_frame_t) ); 141 memset( frame, 0, sizeof( opie_frame_t) );
142 pthread_mutex_init (&frame->frame.mutex, NULL);
143
70 printf("alloc_frame\n"); 144 printf("alloc_frame\n");
@@ -73,3 +147,3 @@ static vo_frame_t* null_alloc_frame( vo_driver_t* self ){
73 frame->output = this; 147 frame->output = this;
74 148 frame->show_video = this->m_show_video;
75 /* initialize the frame*/ 149 /* initialize the frame*/
@@ -77,6 +151,11 @@ static vo_frame_t* null_alloc_frame( vo_driver_t* self ){
77 /*frame.frame.free = null_frame_free;*/ 151 /*frame.frame.free = null_frame_free;*/
78 frame->frame.copy = NULL; 152 frame->frame.copy = null_frame_copy;
79 frame->frame.field = null_frame_field; 153 frame->frame.field = null_frame_field;
80 frame->frame.dispose = null_frame_dispose; 154 frame->frame.dispose = null_frame_dispose;
81 155 frame->yuv2rgb = 0;
156 /*
157 * colorspace converter for this frame
158 */
159 frame->yuv2rgb = this->yuv2rgb_factory->create_converter (this->yuv2rgb_factory);
160
82 161
@@ -84,2 +163,114 @@ static vo_frame_t* null_alloc_frame( vo_driver_t* self ){
84} 163}
164
165// size specific
166static void null_compute_ideal_size (null_driver_t *this, opie_frame_t *frame) {
167
168 if (!this->m_is_scaling || !this->m_show_video) {
169 printf("Not scaling\n");
170 frame->ideal_width = frame->width;
171 frame->ideal_height = frame->height;
172 frame->ratio_factor = 1.0;
173
174 } else {
175
176 double image_ratio, desired_ratio, corr_factor;
177
178 image_ratio = (double) frame->width / (double) frame->height;
179
180 switch (frame->user_ratio) {
181 case ASPECT_AUTO:
182 switch (frame->ratio_code) {
183 case XINE_ASPECT_RATIO_ANAMORPHIC: /* anamorphic */
184 desired_ratio = 16.0 /9.0;
185 break;
186 case XINE_ASPECT_RATIO_211_1: /* 2.11:1 */
187 desired_ratio = 2.11/1.0;
188 break;
189 case XINE_ASPECT_RATIO_SQUARE: /* square pels */
190 case XINE_ASPECT_RATIO_DONT_TOUCH: /* probably non-mpeg stream => don't touch aspect ratio */
191 desired_ratio = image_ratio;
192 break;
193 case 0: /* forbidden -> 4:3 */
194 printf ("video_out_fb: invalid ratio, using 4:3\n");
195 default:
196 printf ("video_out_fb: unknown aspect ratio (%d) in stream => using 4:3\n",
197 frame->ratio_code);
198 case XINE_ASPECT_RATIO_4_3: /* 4:3 */
199 desired_ratio = 4.0 / 3.0;
200 break;
201 }
202 break;
203 case ASPECT_ANAMORPHIC:
204 desired_ratio = 16.0 / 9.0;
205 break;
206 case ASPECT_DVB:
207 desired_ratio = 2.0 / 1.0;
208 break;
209 case ASPECT_SQUARE:
210 desired_ratio = image_ratio;
211 break;
212 case ASPECT_FULL:
213 default:
214 desired_ratio = 4.0 / 3.0;
215 }
216
217 frame->ratio_factor = this->display_ratio * desired_ratio;
218
219 corr_factor = frame->ratio_factor / image_ratio ;
220
221 if (fabs(corr_factor - 1.0) < 0.005) {
222 frame->ideal_width = frame->width;
223 frame->ideal_height = frame->height;
224
225 } else {
226
227 if (corr_factor >= 1.0) {
228 frame->ideal_width = frame->width * corr_factor + 0.5;
229 frame->ideal_height = frame->height;
230 } else {
231 frame->ideal_width = frame->width;
232 frame->ideal_height = frame->height / corr_factor + 0.5;
233 }
234
235 }
236 }
237 printf("return from helper\n");
238}
239
240static void null_compute_rgb_size (null_driver_t *this, opie_frame_t *frame) {
241
242 double x_factor, y_factor;
243
244 /*
245 * make the frame fit into the given destination area
246 */
247
248 x_factor = (double) this->gui_width / (double) frame->ideal_width;
249 y_factor = (double) this->gui_height / (double) frame->ideal_height;
250
251 if ( x_factor < y_factor ) {
252 frame->output_width = (double) frame->ideal_width * x_factor ;
253 frame->output_height = (double) frame->ideal_height * x_factor ;
254 } else {
255 frame->output_width = (double) frame->ideal_width * y_factor ;
256 frame->output_height = (double) frame->ideal_height * y_factor ;
257 }
258
259#define LOG 1
260#ifdef LOG
261 printf("video_out_fb: frame source %d x %d => screen output %d x %d%s\n",
262 frame->width, frame->height,
263 frame->output_width, frame->output_height,
264 ( frame->width != frame->output_width
265 || frame->height != frame->output_height
266 ? ", software scaling"
267 : "" )
268 );
269#endif
270}
271
272
273// size specific
274
275
85static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, 276static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img,
@@ -93,43 +284,214 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img,
93 284
94 if(frame->chunk[0] ){ 285 flags &= VO_BOTH_FIELDS;
95 free( frame->chunk[0] ); 286
96 frame->chunk[0] = NULL; 287 /* find out if we need to adapt this frame */
97 } 288
98 if(frame->chunk[1] ){ 289 if ((width != frame->width)
99 free ( frame->chunk[1] ); 290 || (height != frame->height)
100 frame->chunk[1] = NULL; 291 || (ratio_code != frame->ratio_code)
101 } 292 || (flags != frame->flags)
102 if(frame->chunk[2] ){ 293 || (format != frame->format)
103 free ( frame->chunk[2] ); 294 || (this->user_ratio != frame->user_ratio)
104 frame->chunk[2] = NULL; 295 || this->gui_changed ) {
105 } 296
297 frame->width = width;
298 frame->height = height;
299 frame->ratio_code = ratio_code;
300 frame->flags = flags;
301 frame->format = format;
302 frame->user_ratio = this->user_ratio;
303 this->gui_changed = 0;
304 frame->show_video = this->m_show_video;
305
306
307 null_compute_ideal_size (this, frame);
308 null_compute_rgb_size (this, frame);
309
310 /*
311 * (re-) allocate
312 */
313 if( frame->data ) {
314 if(frame->chunk[0] ){
315 free( frame->chunk[0] );
316 frame->chunk[0] = NULL;
317 }
318 if(frame->chunk[1] ){
319 free ( frame->chunk[1] );
320 frame->chunk[1] = NULL;
321 }
322 if(frame->chunk[2] ){
323 free ( frame->chunk[2] );
324 frame->chunk[2] = NULL;
325 }
326 free ( frame->data );
327 }
328 printf("after freeing\n");
329 frame->data = xine_xmalloc (frame->output_width * frame->output_height *
330 this->bytes_per_pixel );
106 331
332 if( format == IMGFMT_YV12 ) {
333 int image_size = width * height; /* cast ouch*/
334 frame->frame.base[0] = xine_xmalloc_aligned(16, image_size,
335 (void **)&frame->chunk[0] );
336 frame->frame.base[1] = xine_xmalloc_aligned(16, image_size,
337 (void **)&frame->chunk[1] );
338 frame->frame.base[2] = xine_xmalloc_aligned(16, image_size,
339 (void **)&frame->chunk[2] );
340 }else{
341 int image_size = width * height; /* cast ouch*/
342 frame->frame.base[0] = xine_xmalloc_aligned(16, image_size,
343 (void **)&frame->chunk[0] );
344 frame->chunk[1] = NULL;
345 frame->chunk[2] = NULL;
346 }
107 347
108 if( format == IMGFMT_YV12 ) { 348 frame->format = format;
109 int image_size = width * height; /* cast ouch*/ 349 frame->width = width;
110 frame->frame.base[0] = xine_xmalloc_aligned(16, image_size, 350 frame->height = height;
111 (void **)&frame->chunk[0] ); 351
112 frame->frame.base[1] = xine_xmalloc_aligned(16, image_size, 352 frame->stripe_height = 16 * frame->output_height / frame->height;
113 (void **)&frame->chunk[1] ); 353 frame->bytes_per_line = frame->output_width * this->bytes_per_pixel;
114 frame->frame.base[2] = xine_xmalloc_aligned(16, image_size, 354
115 (void **)&frame->chunk[2] ); 355 /*
116 }else{ 356 * set up colorspace converter
117 int image_size = width * height; /* cast ouch*/ 357 */
118 frame->frame.base[0] = xine_xmalloc_aligned(16, image_size, 358 if(this->m_show_video ){
119 (void **)&frame->chunk[0] ); 359 printf("showing video\n");
120 frame->chunk[1] = NULL; 360
121 frame->chunk[2] = NULL; 361 switch (flags) {
362 case VO_TOP_FIELD:
363 case VO_BOTTOM_FIELD:
364 frame->yuv2rgb->configure (frame->yuv2rgb,
365 frame->width,
366 16,
367 frame->width*2,
368 frame->width,
369 frame->output_width,
370 frame->stripe_height,
371 frame->bytes_per_line*2);
372 frame->yuv_stride = frame->bytes_per_line*2;
373 break;
374 case VO_BOTH_FIELDS:
375 frame->yuv2rgb->configure (frame->yuv2rgb,
376 frame->width,
377 16,
378 frame->width,
379 frame->width/2,
380 frame->output_width,
381 frame->stripe_height,
382 frame->bytes_per_line);
383 frame->yuv_stride = frame->bytes_per_line;
384 break;
385 }
386 }
122 } 387 }
388 printf("after gui changed\n");
389 /*
390 * reset dest pointers
391 */
123 392
393 if (frame->data) {
394 switch (flags) {
395 case VO_TOP_FIELD:
396 frame->rgb_dst = (uint8_t *)frame->data;
397 frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line;
398 break;
399 case VO_BOTTOM_FIELD:
400 frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ;
401 frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line;
402 break;
403 case VO_BOTH_FIELDS:
404 frame->rgb_dst = (uint8_t *)frame->data;
405 frame->stripe_inc = frame->stripe_height * frame->bytes_per_line;
406 break;
407 }
408 }
409 printf("done\n");
124} 410}
125static void null_display_frame( vo_driver_t* self, vo_frame_t *frame ){ 411static void null_display_frame( vo_driver_t* self, vo_frame_t *frame_gen ){
412 null_driver_t* this = (null_driver_t*) self;
413 opie_frame_t* frame = (opie_frame_t*)frame_gen;
414 display_xine_frame_t display = this->frameDis;
415
126 printf("display frame\n"); 416 printf("display frame\n");
417 // if( this->m_show_video ) { // return if not displaying
418 printf("calling home aye\n" );
419 if( display != NULL ) {
420 (*display)(this->caller, frame->data,
421 frame->output_width, frame->output_height,
422 this->bytes_per_pixel );
423 printf("display done hope you enyoyed the frame");
424 }
425 // }
426
427 frame->frame.displayed (&frame->frame);
127} 428}
128static void null_overlay_blend( vo_driver_t* self, vo_frame_t* frame, 429
129 vo_overlay_t* overlay ){ 430
130 /* sure */ 431// blending related
432
433
434static void null_overlay_clut_yuv2rgb(null_driver_t *this, vo_overlay_t *overlay,
435 opie_frame_t *frame) {
436 int i;
437 clut_t* clut = (clut_t*) overlay->color;
438 if (!overlay->rgb_clut) {
439 for (i = 0; i < sizeof(overlay->color)/sizeof(overlay->color[0]); i++) {
440 *((uint32_t *)&clut[i]) =
441 frame->yuv2rgb->yuv2rgb_single_pixel_fun (frame->yuv2rgb,
442 clut[i].y, clut[i].cb, clut[i].cr);
443 }
444 overlay->rgb_clut++;
445 }
446 if (!overlay->clip_rgb_clut) {
447 clut = (clut_t*) overlay->clip_color;
448 for (i = 0; i < sizeof(overlay->color)/sizeof(overlay->color[0]); i++) {
449 *((uint32_t *)&clut[i]) =
450 frame->yuv2rgb->yuv2rgb_single_pixel_fun(frame->yuv2rgb,
451 clut[i].y, clut[i].cb, clut[i].cr);
452 }
453 overlay->clip_rgb_clut++;
454 }
455}
456
457static void null_overlay_blend (vo_driver_t *this_gen, vo_frame_t *frame_gen, vo_overlay_t *overlay) {
458 null_driver_t *this = (null_driver_t *) this_gen;
459 opie_frame_t *frame = (opie_frame_t *) frame_gen;
460
461 printf("overlay blend\n");
462 if(!this->m_show_video || frame->output_width == 0 || frame->output_height== 0)
463 return;
464
465 /* Alpha Blend here */
466 if (overlay->rle) {
467 if( !overlay->rgb_clut || !overlay->clip_rgb_clut)
468 null_overlay_clut_yuv2rgb(this,overlay,frame);
469
470 switch(this->bpp) {
471 case 16:
472 blend_rgb16( (uint8_t *)frame->data, overlay,
473 frame->output_width, frame->output_height,
474 frame->width, frame->height);
475 break;
476 case 24:
477 blend_rgb24( (uint8_t *)frame->data, overlay,
478 frame->output_width, frame->output_height,
479 frame->width, frame->height);
480 break;
481 case 32:
482 blend_rgb32( (uint8_t *)frame->data, overlay,
483 frame->output_width, frame->output_height,
484 frame->width, frame->height);
485 break;
486 default:
487 /* It should never get here */
488 break;
489 }
490 }
131} 491}
492
493
132static int null_get_property( vo_driver_t* self, 494static int null_get_property( vo_driver_t* self,
133 int property ){ 495 int property ){
134 printf("property get]n"); 496 printf("property get\n");
135 return 0; 497 return 0;
@@ -167,2 +529,5 @@ vo_driver_t* init_video_out_plugin( config_values_t* conf,
167 vo = (null_driver_t*)malloc( sizeof(null_driver_t ) ); 529 vo = (null_driver_t*)malloc( sizeof(null_driver_t ) );
530
531 /* memset? */
532 memset(vo,0, sizeof(null_driver_t ) );
168 vo->m_show_video = 0; // false 533 vo->m_show_video = 0; // false
@@ -170,16 +535,20 @@ vo_driver_t* init_video_out_plugin( config_values_t* conf,
170 vo->m_is_scaling = 0; 535 vo->m_is_scaling = 0;
171 /* memset? */ 536 vo->user_ratio = ASPECT_AUTO;
537 vo->display_ratio = 1.0;
538 vo->gui_width = 200;
539 vo->gui_height = 150;
540 vo->frameDis = NULL;
172 541
173 /* install callback handlers*/ 542 /* install callback handlers*/
174 vo->vo_driver.get_capabilities = null_get_capabilities; 543 vo->vo_driver.get_capabilities = null_get_capabilities;
175 vo->vo_driver.alloc_frame = null_alloc_frame; 544 vo->vo_driver.alloc_frame = null_alloc_frame;
176 vo->vo_driver.update_frame_format = null_update_frame_format; 545 vo->vo_driver.update_frame_format = null_update_frame_format;
177 vo->vo_driver.display_frame = null_display_frame; 546 vo->vo_driver.display_frame = null_display_frame;
178 vo->vo_driver.overlay_blend = null_overlay_blend; 547 vo->vo_driver.overlay_blend = null_overlay_blend;
179 vo->vo_driver.get_property = null_get_property; 548 vo->vo_driver.get_property = null_get_property;
180 vo->vo_driver.set_property = null_set_property; 549 vo->vo_driver.set_property = null_set_property;
181 vo->vo_driver.get_property_min_max = null_get_property_min_max; 550 vo->vo_driver.get_property_min_max = null_get_property_min_max;
182 vo->vo_driver.gui_data_exchange = null_gui_data_exchange; 551 vo->vo_driver.gui_data_exchange = null_gui_data_exchange;
183 vo->vo_driver.exit = null_exit; 552 vo->vo_driver.exit = null_exit;
184 vo->vo_driver.redraw_needed = null_redraw_needed; 553 vo->vo_driver.redraw_needed = null_redraw_needed;
185 554
@@ -187,3 +556,5 @@ vo_driver_t* init_video_out_plugin( config_values_t* conf,
187 /* capabilities */ 556 /* capabilities */
188 vo->m_capabilities = /*VO_CAP_COPIES_IMAGE |*/ VO_CAP_YV12 | VO_CAP_BRIGHTNESS; 557 vo->m_capabilities = VO_CAP_COPIES_IMAGE | VO_CAP_YUY2 | VO_CAP_YV12;
558 vo->yuv2rgb_factory = yuv2rgb_factory_init (MODE_16_RGB, vo->yuv2rgb_swap,
559 vo->yuv2rgb_cmap);
189 printf("done initialisation\n"); 560 printf("done initialisation\n");
@@ -235,6 +606,61 @@ void null_set_scaling( vo_driver_t* self, int scale ){
235void null_set_gui_width( vo_driver_t* self, int width ){ 606void null_set_gui_width( vo_driver_t* self, int width ){
236 607 ((null_driver_t*)self)->gui_width = width;
237} 608}
238void null_set_gui_height( vo_driver_t* self, int height ){ 609void null_set_gui_height( vo_driver_t* self, int height ){
239 610 ((null_driver_t*)self)->gui_height = height;
611}
612void null_set_mode( vo_driver_t* self, int depth, int rgb ){
613 null_driver_t* this = (null_driver_t*)self;
614
615 this->bytes_per_pixel = (depth + 7 ) / 8;
616 this->bpp = this->bytes_per_pixel * 8;
617 this->depth = depth;
618 printf("depth %d %d\n", depth, this->bpp);
619 printf("pixeltype %d\n", rgb );
620 switch ( this->depth ){
621 case 32:
622 if( rgb == 0 )
623 this->yuv2rgb_mode = MODE_32_RGB;
624 else
625 this->yuv2rgb_mode = MODE_32_BGR;
626 case 24:
627 if( this->bpp == 32 ) {
628 if(rgb == 0 )
629 this->yuv2rgb_mode = MODE_32_RGB;
630 else
631 this->yuv2rgb_mode = MODE_32_BGR;
632 }else{
633 if( rgb == 0 )
634 this->yuv2rgb_mode = MODE_24_RGB;
635 else
636 this->yuv2rgb_mode = MODE_24_BGR;
637 };
638 break;
639 case 16:
640 if( rgb == 0 )
641 this->yuv2rgb_mode = MODE_16_RGB;
642 else
643 this->yuv2rgb_mode = MODE_16_BGR;
644 break;
645 case 15:
646 if( rgb == 0 )
647 this->yuv2rgb_mode = MODE_15_RGB;
648 else
649 this->yuv2rgb_mode = MODE_15_BGR;
650 break;
651 case 8:
652 if( rgb == 0 )
653 this->yuv2rgb_mode = MODE_8_RGB;
654 else
655 this->yuv2rgb_mode = MODE_8_BGR;
656 break;
657 };
658 //free(this->yuv2rgb_factory );
659 // this->yuv2rgb_factory = yuv2rgb_factory_init (this->yuv2rgb_mode, this->yuv2rgb_swap,
660 // this->yuv2rgb_cmap);
661};
662void null_display_handler(vo_driver_t* self, display_xine_frame_t t, void* user_data) {
663 null_driver_t* this = (null_driver_t*) self;
664 this->caller = user_data;
665 this->frameDis = t;
240} 666}
diff --git a/noncore/multimedia/opieplayer2/opieplayer2.pro b/noncore/multimedia/opieplayer2/opieplayer2.pro
index a2cb987..448dd34 100644
--- a/noncore/multimedia/opieplayer2/opieplayer2.pro
+++ b/noncore/multimedia/opieplayer2/opieplayer2.pro
@@ -6,3 +6,4 @@ HEADERS = playlistselection.h mediaplayerstate.h xinecontrol.h mediadetect.h\
6 videowidget.h audiowidget.h playlistwidget.h mediaplayer.h inputDialog.h \ 6 videowidget.h audiowidget.h playlistwidget.h mediaplayer.h inputDialog.h \
7 frame.h lib.h xinevideowidget.h 7 frame.h lib.h xinevideowidget.h \
8 alphablend.h yuv2rgb.h
8SOURCES = main.cpp \ 9SOURCES = main.cpp \
@@ -10,3 +11,4 @@ SOURCES = main.cpp \
10 videowidget.cpp audiowidget.cpp playlistwidget.cpp mediaplayer.cpp inputDialog.cpp \ 11 videowidget.cpp audiowidget.cpp playlistwidget.cpp mediaplayer.cpp inputDialog.cpp \
11 frame.cpp lib.cpp nullvideo.c xinevideowidget.cpp 12 frame.cpp lib.cpp nullvideo.c xinevideowidget.cpp \
13 alphablend.c yuv2rgb.c yuv2rgb_mlib.c yuv2rgb_mmx.c
12TARGET = opieplayer2 14TARGET = opieplayer2
diff --git a/noncore/multimedia/opieplayer2/videowidget.cpp b/noncore/multimedia/opieplayer2/videowidget.cpp
index 8fdb3d3..d3898a0 100644
--- a/noncore/multimedia/opieplayer2/videowidget.cpp
+++ b/noncore/multimedia/opieplayer2/videowidget.cpp
@@ -290,4 +290,4 @@ void VideoWidget::paintEvent( QPaintEvent * ) {
290 // Clear the background 290 // Clear the background
291 p.setBrush( QBrush( Qt::black ) ); 291// p.setBrush( QBrush( Qt::black ) );
292 p.drawRect( rect() ); 292 //p.drawRect( rect() );
293 293
@@ -298,4 +298,4 @@ void VideoWidget::paintEvent( QPaintEvent * ) {
298 // Clear the movie screen first 298 // Clear the movie screen first
299 p.setBrush( QBrush( Qt::black ) ); 299// p.setBrush( QBrush( Qt::black ) );
300 p.drawRect( 9, 20, 220, 160 ); 300// p.drawRect( 9, 20, 220, 160 );
301 301
@@ -311,2 +311,3 @@ void VideoWidget::paintEvent( QPaintEvent * ) {
311 slider->repaint( TRUE ); 311 slider->repaint( TRUE );
312 //videoFrame->repaint( TRUE );
312 } 313 }
@@ -384 +385,4 @@ void VideoWidget::keyReleaseEvent( QKeyEvent *e)
384} 385}
386XineVideoWidget* VideoWidget::vidWidget() {
387 return videoFrame;
388}
diff --git a/noncore/multimedia/opieplayer2/videowidget.h b/noncore/multimedia/opieplayer2/videowidget.h
index 9ab91ac..8f98889 100644
--- a/noncore/multimedia/opieplayer2/videowidget.h
+++ b/noncore/multimedia/opieplayer2/videowidget.h
@@ -59,3 +59,3 @@ public:
59 bool playVideo(); 59 bool playVideo();
60 60 XineVideoWidget* vidWidget();
61public slots: 61public slots:
diff --git a/noncore/multimedia/opieplayer2/xinecontrol.cpp b/noncore/multimedia/opieplayer2/xinecontrol.cpp
index 893ac41..3be9fa4 100644
--- a/noncore/multimedia/opieplayer2/xinecontrol.cpp
+++ b/noncore/multimedia/opieplayer2/xinecontrol.cpp
@@ -37,9 +37,9 @@
37#include "mediaplayerstate.h" 37#include "mediaplayerstate.h"
38 38#include "videowidget.h"
39 39
40extern MediaPlayerState *mediaPlayerState; 40extern MediaPlayerState *mediaPlayerState;
41 41extern VideoWidget *videoUI;
42XineControl::XineControl( QObject *parent, const char *name ) 42XineControl::XineControl( QObject *parent, const char *name )
43 : QObject( parent, name ) { 43 : QObject( parent, name ) {
44 libXine = new XINE::Lib(); 44 libXine = new XINE::Lib(videoUI->vidWidget() );
45 45
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp
index e02ee7c..d665f16 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp
@@ -5,3 +5,3 @@
5              Copyright (c) 2002 Max Reiss <harlekin@handhelds.org> 5              Copyright (c) 2002 Max Reiss <harlekin@handhelds.org>
6 Copyright (c) 2002 L. Potter <ljp@llornkcor.com> 6 Copyright (c) 2002 LJP <>
7 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> 7 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org>
@@ -35,3 +35,8 @@
35#include <qimage.h> 35#include <qimage.h>
36#include <qpainter.h>
36#include <qgfx_qws.h> 37#include <qgfx_qws.h>
38#include <qdirectpainter_qws.h>
39#include <qsize.h>
40
41#include <qpe/resource.h>
37 42
@@ -46,2 +51,8 @@ XineVideoWidget::XineVideoWidget( int width,
46 m_image = new QImage( width, height, qt_screen->depth() ); 51 m_image = new QImage( width, height, qt_screen->depth() );
52 m_buff = 0;
53 setBackgroundMode( NoBackground);
54/* QImage image = Resource::loadImage("SoundPlayer");
55 image = image.smoothScale( width, height );
56
57 m_image = new QImage( image );*/
47} 58}
@@ -50,4 +61,70 @@ XineVideoWidget::~XineVideoWidget() {
50} 61}
62void XineVideoWidget::clear() {
63 m_buff = 0;
64 repaint();
65}
51void XineVideoWidget::paintEvent( QPaintEvent* e ) { 66void XineVideoWidget::paintEvent( QPaintEvent* e ) {
52 QWidget::paintEvent( e ); 67 qWarning("painting");
68 QPainter p(this );
69 p.setBrush( QBrush( Qt::black ) );
70 p.drawRect( rect() );
71 if (m_buff == 0 )
72 p.drawImage( 0, 0, *m_image );
73 else {
74 qWarning("paitnevent\n");
75
76 QDirectPainter dp( this );
77 uchar* dst = dp.frameBuffer() + (m_yOff + dp.yOffset() ) * linestep +
78 (m_xOff + dp.xOffset() ) * m_bytes_per_pixel;
79 uchar* frame = m_buff;
80 for(int y = 0; y < m_Height; y++ ) {
81 memcpy( dst, frame, m_bytes );
82 frame += m_bytes;
83 dst += linestep;
84 }
85 // QVFB hack by MArtin Jones
86// QPainter dp2(this);
87 // dp2.fillRect( rect(), QBrush( NoBrush ) );
88 }
89// QWidget::paintEvent( e );
90}
91int XineVideoWidget::height() const{
92 return m_image->height();
93}
94int XineVideoWidget::width() const{
95 return m_image->width();
96}
97void XineVideoWidget::setImage( QImage* image ) {
98 delete m_image;
99 m_image = image;
100}
101void XineVideoWidget::setImage( uchar* image, int yoffsetXLine,
102 int xoffsetXBytes, int width,
103 int height, int linestep, int bytes, int bpp ) {
104/* if (m_buff != 0 )
105 free(m_buff );
106*/
107 m_buff = image;
108 m_yOff = yoffsetXLine;
109 m_xOff = xoffsetXBytes;
110 m_Width = width;
111 m_Height = height;
112 this->linestep = linestep;
113 m_bytes = bytes;
114 m_bytes_per_pixel = bpp;
115 ////
116 qWarning("width %d %d", width, height );
117/* QDirectPainter dp( this );
118 uchar* dst = dp.frameBuffer() + (m_yOff + dp.yOffset() ) * linestep +
119 (m_xOff + dp.xOffset() ) * m_bytes_per_pixel;
120 uchar* frame = m_buff;
121 for(int y = 0; y < m_Height; y++ ) {
122 memcpy( dst, frame, m_bytes );
123 frame += m_bytes;
124 dst += linestep;
125 }
126 // QVFB hack
127 QPainter dp2(this);
128 dp2.fillRect( rect(), QBrush( NoBrush ) );
129*/
53} 130}
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.h b/noncore/multimedia/opieplayer2/xinevideowidget.h
index 46bb98b..b670fa0 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.h
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.h
@@ -44,2 +44,8 @@ public:
44 QImage *image() { return m_image; }; 44 QImage *image() { return m_image; };
45 void setImage( QImage* image );
46 void setImage( uchar* image, int yoffsetXLine, int xoffsetXBytes,
47 int width, int height, int linestep, int bytes, int bpp);
48 int width() const;
49 int height() const;
50 void clear() ;
45protected: 51protected:
@@ -47,2 +53,9 @@ protected:
47private: 53private:
54 int m_wid;
55 int m_height;
56 int m_yOff, m_xOff;
57 uchar* m_buff;
58 int m_Width, m_Height, linestep;
59 int m_bytes;
60 int m_bytes_per_pixel;
48 QImage* m_image; 61 QImage* m_image;
diff --git a/noncore/multimedia/opieplayer2/zeckeplayer.pro b/noncore/multimedia/opieplayer2/zeckeplayer.pro
index a1683e2..18ee623 100644
--- a/noncore/multimedia/opieplayer2/zeckeplayer.pro
+++ b/noncore/multimedia/opieplayer2/zeckeplayer.pro
@@ -5,3 +5,3 @@ CONFIG = qt warn_on release
5 HEADERS = frame.h lib.h 5 HEADERS = frame.h lib.h
6 SOURCES = nullvideo.o frame.cpp lib.cpp mainTest.cpp 6 SOURCES = alphablend.c yuv2rgb.c nullvideo.o frame.cpp lib.cpp mainTest.cpp
7 INCLUDEPATH+= $(OPIEDIR)/include /opt/QtPalmtop/include 7 INCLUDEPATH+= $(OPIEDIR)/include /opt/QtPalmtop/include