summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/nullvideo.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/noncore/multimedia/opieplayer2/nullvideo.c b/noncore/multimedia/opieplayer2/nullvideo.c
index 5ee8d5d..79337c2 100644
--- a/noncore/multimedia/opieplayer2/nullvideo.c
+++ b/noncore/multimedia/opieplayer2/nullvideo.c
@@ -162,69 +162,70 @@ static vo_frame_t* null_alloc_frame( vo_driver_t* self ){
162 162
163 163
164 return (vo_frame_t*) frame; 164 return (vo_frame_t*) frame;
165} 165}
166 166
167// size specific 167// size specific
168static void null_compute_ideal_size (null_driver_t *this, opie_frame_t *frame) { 168static void null_compute_ideal_size (null_driver_t *this, opie_frame_t *frame) {
169 169
170 if (!this->m_is_scaling /*|| !this->m_show_video*/) { 170 if (!this->m_is_scaling /*|| !this->m_show_video*/) {
171 printf("Not scaling\n"); 171 printf("Not scaling\n");
172 frame->ideal_width = frame->width; 172 frame->ideal_width = frame->width;
173 frame->ideal_height = frame->height; 173 frame->ideal_height = frame->height;
174 frame->ratio_factor = 1.0; 174 frame->ratio_factor = 1.0;
175 175
176 } else { 176 } else {
177 177
178 double image_ratio, desired_ratio, corr_factor; 178 double image_ratio, desired_ratio, corr_factor;
179 179
180 image_ratio = (double) frame->width / (double) frame->height; 180 image_ratio = (double) frame->width / (double) frame->height;
181 181
182 switch (frame->user_ratio) { 182 switch (frame->user_ratio) {
183 case ASPECT_AUTO: 183 case ASPECT_AUTO:
184 switch (frame->ratio_code) { 184 switch (frame->ratio_code) {
185 case XINE_ASPECT_RATIO_ANAMORPHIC: /* anamorphic */ 185 case XINE_ASPECT_RATIO_ANAMORPHIC: /* anamorphic */
186 case XINE_ASPECT_RATIO_PAN_SCAN:
186 desired_ratio = 16.0 /9.0; 187 desired_ratio = 16.0 /9.0;
187 break; 188 break;
188 case XINE_ASPECT_RATIO_211_1: /* 2.11:1 */ 189 case XINE_ASPECT_RATIO_211_1: /* 2.11:1 */
189 desired_ratio = 2.11/1.0; 190 desired_ratio = 2.11/1.0;
190 break; 191 break;
191 case XINE_ASPECT_RATIO_SQUARE: /* square pels */ 192 case XINE_ASPECT_RATIO_SQUARE: /* square pels */
192 case XINE_ASPECT_RATIO_DONT_TOUCH: /* probably non-mpeg stream => don't touch aspect ratio */ 193 case XINE_ASPECT_RATIO_DONT_TOUCH: /* probably non-mpeg stream => don't touch aspect ratio */
193 desired_ratio = image_ratio; 194 desired_ratio = image_ratio;
194 break; 195 break;
195 case 0: /* forbidden -> 4:3 */ 196 case 0: /* forbidden -> 4:3 */
196 printf ("video_out_fb: invalid ratio, using 4:3\n"); 197 printf ("video_out_fb: invalid ratio, using 4:3\n");
197 default: 198 default:
198 printf ("video_out_fb: unknown aspect ratio (%d) in stream => using 4:3\n", 199 printf ("video_out_fb: unknown aspect ratio (%d) in stream => using 4:3\n",
199 frame->ratio_code); 200 frame->ratio_code);
200 case XINE_ASPECT_RATIO_4_3: /* 4:3 */ 201 case XINE_ASPECT_RATIO_4_3: /* 4:3 */
201 desired_ratio = 4.0 / 3.0; 202 desired_ratio = 4.0 / 3.0;
202 break; 203 break;
203 } 204 }
204 break; 205 break;
205 case ASPECT_ANAMORPHIC: 206 case ASPECT_ANAMORPHIC:
206 desired_ratio = 16.0 / 9.0; 207 desired_ratio = 16.0 / 9.0;
207 break; 208 break;
208 case ASPECT_DVB: 209 case ASPECT_DVB:
209 desired_ratio = 2.0 / 1.0; 210 desired_ratio = 2.0 / 1.0;
210 break; 211 break;
211 case ASPECT_SQUARE: 212 case ASPECT_SQUARE:
212 desired_ratio = image_ratio; 213 desired_ratio = image_ratio;
213 break; 214 break;
214 case ASPECT_FULL: 215 case ASPECT_FULL:
215 default: 216 default:
216 desired_ratio = 4.0 / 3.0; 217 desired_ratio = 4.0 / 3.0;
217 } 218 }
218 219
219 frame->ratio_factor = this->display_ratio * desired_ratio; 220 frame->ratio_factor = this->display_ratio * desired_ratio;
220 221
221 corr_factor = frame->ratio_factor / image_ratio ; 222 corr_factor = frame->ratio_factor / image_ratio ;
222 223
223 if (fabs(corr_factor - 1.0) < 0.005) { 224 if (fabs(corr_factor - 1.0) < 0.005) {
224 frame->ideal_width = frame->width; 225 frame->ideal_width = frame->width;
225 frame->ideal_height = frame->height; 226 frame->ideal_height = frame->height;
226 227
227 } else { 228 } else {
228 229
229 if (corr_factor >= 1.0) { 230 if (corr_factor >= 1.0) {
230 frame->ideal_width = frame->width * corr_factor + 0.5; 231 frame->ideal_width = frame->width * corr_factor + 0.5;
@@ -313,95 +314,98 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img,
313 314
314 /* 315 /*
315 * (re-) allocate 316 * (re-) allocate
316 */ 317 */
317 if( frame->data ) { 318 if( frame->data ) {
318 if(frame->chunk[0] ){ 319 if(frame->chunk[0] ){
319 free( frame->chunk[0] ); 320 free( frame->chunk[0] );
320 frame->chunk[0] = NULL; 321 frame->chunk[0] = NULL;
321 } 322 }
322 if(frame->chunk[1] ){ 323 if(frame->chunk[1] ){
323 free ( frame->chunk[1] ); 324 free ( frame->chunk[1] );
324 frame->chunk[1] = NULL; 325 frame->chunk[1] = NULL;
325 } 326 }
326 if(frame->chunk[2] ){ 327 if(frame->chunk[2] ){
327 free ( frame->chunk[2] ); 328 free ( frame->chunk[2] );
328 frame->chunk[2] = NULL; 329 frame->chunk[2] = NULL;
329 } 330 }
330 free ( frame->data ); 331 free ( frame->data );
331 } 332 }
332 printf("after freeing\n"); 333 printf("after freeing\n");
333 frame->data = xine_xmalloc (frame->output_width * frame->output_height * 334 frame->data = xine_xmalloc (frame->output_width * frame->output_height *
334 this->bytes_per_pixel ); 335 this->bytes_per_pixel );
335 336
336 if( format == IMGFMT_YV12 ) { 337 if( format == IMGFMT_YV12 ) {
337 int image_size = width * height; /* cast ouch*/ 338 frame->frame.pitches[0] = 8*((width + 7) / 8);
338 frame->frame.base[0] = xine_xmalloc_aligned(16, image_size, 339 frame->frame.pitches[1] = 8*((width + 15) / 16);
339 (void **)&frame->chunk[0] ); 340 frame->frame.pitches[2] = 8*((width + 15) / 16);
340 frame->frame.base[1] = xine_xmalloc_aligned(16, image_size, 341 frame->frame.base[0] = xine_xmalloc_aligned (16, frame->frame.pitches[0] * height,(void **)&frame->chunk[0]);
341 (void **)&frame->chunk[1] ); 342 frame->frame.base[1] = xine_xmalloc_aligned (16, frame->frame.pitches[1] * ((height+ 1)/2), (void **)&frame->chunk[1]);
342 frame->frame.base[2] = xine_xmalloc_aligned(16, image_size, 343 frame->frame.base[2] = xine_xmalloc_aligned (16, frame->frame.pitches[2] * ((height+ 1)/2), (void **)&frame->chunk[2]);
343 (void **)&frame->chunk[2] ); 344
344 }else{ 345 }else{
345 int image_size = width * height; /* cast ouch*/ 346 frame->frame.pitches[0] = 8*((width + 3) / 4);
346 frame->frame.base[0] = xine_xmalloc_aligned(16, image_size, 347 frame->frame.pitches[1] = 8*((width + 3) / 4);
347 (void **)&frame->chunk[0] ); 348 frame->frame.pitches[2] = 8*((width + 3) / 4);
349
350 frame->frame.base[0] = xine_xmalloc_aligned (16, frame->frame.pitches[0] * height,
351 (void **)&frame->chunk[0]);
348 frame->chunk[1] = NULL; 352 frame->chunk[1] = NULL;
349 frame->chunk[2] = NULL; 353 frame->chunk[2] = NULL;
350 } 354 }
351 355
352 frame->format = format; 356 frame->format = format;
353 frame->width = width; 357 frame->width = width;
354 frame->height = height; 358 frame->height = height;
355 359
356 frame->stripe_height = 16 * frame->output_height / frame->height; 360 frame->stripe_height = 16 * frame->output_height / frame->height;
357 frame->bytes_per_line = frame->output_width * this->bytes_per_pixel; 361 frame->bytes_per_line = frame->output_width * this->bytes_per_pixel;
358 362
359 /* 363 /*
360 * set up colorspace converter 364 * set up colorspace converter
361 */ 365 */
362 if(1 /*this->m_show_video*/ ){ 366 if(1 /*this->m_show_video*/ ){
363 printf("showing video\n"); 367 printf("showing video\n");
364 368
365 switch (flags) { 369 switch (flags) {
366 case VO_TOP_FIELD: 370 case VO_TOP_FIELD:
367 case VO_BOTTOM_FIELD: 371 case VO_BOTTOM_FIELD:
368 frame->yuv2rgb->configure (frame->yuv2rgb, 372 frame->yuv2rgb->configure (frame->yuv2rgb,
369 frame->width, 373 frame->width,
370 16, 374 16,
371 frame->width*2, 375 2*frame->frame.pitches[0],
372 frame->width, 376 2*frame->frame.pitches[1],
373 frame->output_width, 377 frame->output_width,
374 frame->stripe_height, 378 frame->stripe_height,
375 frame->bytes_per_line*2); 379 frame->bytes_per_line*2);
376 frame->yuv_stride = frame->bytes_per_line*2; 380 frame->yuv_stride = frame->bytes_per_line*2;
377 break; 381 break;
378 case VO_BOTH_FIELDS: 382 case VO_BOTH_FIELDS:
379 frame->yuv2rgb->configure (frame->yuv2rgb, 383 frame->yuv2rgb->configure (frame->yuv2rgb,
380 frame->width, 384 frame->width,
381 16, 385 16,
382 frame->width, 386 frame->frame.pitches[0],
383 frame->width/2, 387 frame->frame.pitches[1],
384 frame->output_width, 388 frame->output_width,
385 frame->stripe_height, 389 frame->stripe_height,
386 frame->bytes_per_line); 390 frame->bytes_per_line);
387 frame->yuv_stride = frame->bytes_per_line; 391 frame->yuv_stride = frame->bytes_per_line;
388 break; 392 break;
389 } 393 }
390 } 394 }
391 } 395 }
392 printf("after gui changed\n"); 396 printf("after gui changed\n");
393 /* 397 /*
394 * reset dest pointers 398 * reset dest pointers
395 */ 399 */
396 400
397 if (frame->data) { 401 if (frame->data) {
398 switch (flags) { 402 switch (flags) {
399 case VO_TOP_FIELD: 403 case VO_TOP_FIELD:
400 frame->rgb_dst = (uint8_t *)frame->data; 404 frame->rgb_dst = (uint8_t *)frame->data;
401 frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line; 405 frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line;
402 break; 406 break;
403 case VO_BOTTOM_FIELD: 407 case VO_BOTTOM_FIELD:
404 frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ; 408 frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ;
405 frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line; 409 frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line;
406 break; 410 break;
407 case VO_BOTH_FIELDS: 411 case VO_BOTH_FIELDS: