summaryrefslogtreecommitdiff
path: root/noncore/multimedia/opieplayer2/nullvideo.c
authorzecke <zecke>2002-07-11 22:44:54 (UTC)
committer zecke <zecke>2002-07-11 22:44:54 (UTC)
commitd2c7228d2efe6f47ef5b7ec04157fcead775be74 (patch) (unidiff)
tree95584eff5b953cc4ac908da028ef3c66c75b28cd /noncore/multimedia/opieplayer2/nullvideo.c
parent1651f048bb129b8e748a01c514d84c8626e0f1e2 (diff)
downloadopie-d2c7228d2efe6f47ef5b7ec04157fcead775be74.zip
opie-d2c7228d2efe6f47ef5b7ec04157fcead775be74.tar.gz
opie-d2c7228d2efe6f47ef5b7ec04157fcead775be74.tar.bz2
broken video widget
Diffstat (limited to 'noncore/multimedia/opieplayer2/nullvideo.c') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/nullvideo.c542
1 files changed, 484 insertions, 58 deletions
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
@@ -3,11 +3,21 @@
3#include <stdlib.h> 3#include <stdlib.h>
4#include <stdio.h> 4#include <stdio.h>
5 5
6#include <math.h>
7
6#include <xine/video_out.h> 8#include <xine/video_out.h>
7#include <xine/xine_internal.h> 9#include <xine/xine_internal.h>
8#include <xine/xineutils.h> 10#include <xine/xineutils.h>
9#include <xine/configfile.h> 11#include <xine/configfile.h>
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;
12 22
13struct null_driver_s { 23struct null_driver_s {
@@ -16,23 +26,45 @@ struct null_driver_s {
16 int m_show_video; 26 int m_show_video;
17 int m_video_fullscreen; 27 int m_video_fullscreen;
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};
20typedef struct opie_frame_s opie_frame_t; 49typedef struct opie_frame_s opie_frame_t;
21struct opie_frame_s { 50struct opie_frame_s {
22 vo_frame_t frame; 51 vo_frame_t frame;
23 char* name; 52 char* name;
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;
29 int flags; 58 int flags;
30 int user_ratio; 59 int user_ratio;
31 60
61 double ratio_factor;
32 int ideal_width; 62 int ideal_width;
33 int ideal_height; 63 int ideal_height;
34 int output_width, output_height; 64 int output_width, output_height;
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;
37 int yuv_stride; 69 int yuv_stride;
38 int stripe_height, stripe_inc; 70 int stripe_height, stripe_inc;
@@ -40,7 +72,7 @@ struct opie_frame_s {
40 int bytes_per_line; 72 int bytes_per_line;
41 uint8_t *data; 73 uint8_t *data;
42 74
43 75 int show_video;
44 null_driver_t *output; 76 null_driver_t *output;
45}; 77};
46 78
@@ -50,38 +82,197 @@ static uint32_t null_get_capabilities(vo_driver_t *self ){
50 return this->m_capabilities; 82 return this->m_capabilities;
51} 83}
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*/
54static void null_frame_dispose( vo_frame_t* vo_img){ 126static void null_frame_dispose( vo_frame_t* vo_img){
55 opie_frame_t* frame = (opie_frame_t*)vo_img; 127 opie_frame_t* frame = (opie_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
64/* end take care of frames*/ 134/* end take care of frames*/
65 135
66static vo_frame_t* null_alloc_frame( vo_driver_t* self ){ 136static 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");
71 frame->name = "opie\0"; 145 frame->name = "opie\0";
72 frame->version = 1; 146 frame->version = 1;
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*/
76 frame->frame.driver = self; 150 frame->frame.driver = 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
83 return (vo_frame_t*) frame; 162 return (vo_frame_t*) frame;
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,
86 uint32_t width, uint32_t height, 277 uint32_t width, uint32_t height,
87 int ratio_code, int format, int flags ){ 278 int ratio_code, int format, int flags ){
@@ -91,47 +282,218 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img,
91 printf("update_frame_format\n"); 282 printf("update_frame_format\n");
92 printf("al crash aye?\n"); 283 printf("al crash aye?\n");
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;
136} 498}
137static int null_set_property( vo_driver_t* self, 499static int null_set_property( vo_driver_t* self,
@@ -165,27 +527,36 @@ vo_driver_t* init_video_out_plugin( config_values_t* conf,
165 void* video ){ 527 void* video ){
166 null_driver_t *vo; 528 null_driver_t *vo;
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
169 vo->m_video_fullscreen = 0; 534 vo->m_video_fullscreen = 0;
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
186 555
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");
190 return (vo_driver_t*) vo; 561 return (vo_driver_t*) vo;
191} 562}
@@ -233,8 +604,63 @@ void null_set_scaling( vo_driver_t* self, int scale ){
233} 604}
234 605
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}