comparison libvo/vosub_vidix.c @ 7685:486b56f4b0f3

draw_image, get_image fix
author arpi
date Wed, 09 Oct 2002 21:54:58 +0000
parents eca7dbad0166
children b64f14fdadfb
comparison
equal deleted inserted replaced
7684:d4ded16d66dc 7685:486b56f4b0f3
246 dest += dstrides.y; 246 dest += dstrides.y;
247 } 247 }
248 return 0; 248 return 0;
249 } 249 }
250 250
251 static uint32_t vidix_draw_slice_packed_fast(uint8_t *image[], int stride[], int w,int h,int x,int y)
252 {
253 uint8_t *src;
254 uint8_t *dest;
255
256 UNUSED(w);
257 UNUSED(stride);
258 dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
259 dest += dstrides.y*y + x;
260 src = image[0];
261 memcpy(dest,src,h*dstrides.y);
262 return 0;
263 }
264
265 uint32_t vidix_draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) 251 uint32_t vidix_draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
266 { 252 {
267 UNUSED(image); 253 UNUSED(image);
268 UNUSED(stride); 254 UNUSED(stride);
269 UNUSED(w); 255 UNUSED(w);
274 vidix_term(); 260 vidix_term();
275 exit( EXIT_FAILURE ); 261 exit( EXIT_FAILURE );
276 return 0; 262 return 0;
277 } 263 }
278 264
265 static uint32_t vidix_draw_image(mp_image_t *mpi){
266 if(verbose > 1) printf("vosub_vidix: vidix_draw_image() was called\n");
267
268 // if -dr or -slices then do nothing:
269 if(mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK)) return VO_TRUE;
270
271 vo_server->draw_slice(mpi->planes,mpi->stride,
272 vidix_play.src.w,vidix_play.src.h,vidix_play.src.x,vidix_play.src.y);
273 return VO_TRUE;
274 }
275
279 uint32_t vidix_draw_frame(uint8_t *image[]) 276 uint32_t vidix_draw_frame(uint8_t *image[])
280 { 277 {
281 int stride[1]; 278 printf("vosub_vidix: vidix_draw_frame() was called!!!!\n");
282 if(verbose > 1) printf("vosub_vidix: vidix_draw_frame() was called\n"); 279 return -1;
283 /* Note it's very strange but sometime for YUY2 draw_frame is called */
284 if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV
285 || src_format == IMGFMT_YVU9 || src_format == IMGFMT_IF09)
286 printf("vosub_vidix: draw_frame for YUV420 called, frame cannot be written\n");
287 else
288 if(src_format == IMGFMT_RGB32 || src_format == IMGFMT_BGR32)
289 stride[0] = vidix_play.src.w*4;
290 else
291 if(src_format == IMGFMT_RGB24 || src_format == IMGFMT_BGR24)
292 stride[0] = vidix_play.src.w*3;
293 else
294 stride[0] = vidix_play.src.w*2;
295 return vo_server->draw_slice(image,stride,vidix_play.src.w,vidix_play.src.h,
296 vidix_play.src.x,vidix_play.src.y);
297 } 280 }
298 281
299 void vidix_flip_page(void) 282 void vidix_flip_page(void)
300 { 283 {
301 if(verbose > 1) printf("vosub_vidix: vidix_flip_page() was called\n"); 284 if(verbose > 1) printf("vosub_vidix: vidix_flip_page() was called\n");
574 557
575 if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV) 558 if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV)
576 vo_server->draw_slice = vidix_draw_slice_420; 559 vo_server->draw_slice = vidix_draw_slice_420;
577 else if (src_format == IMGFMT_YVU9 || src_format == IMGFMT_IF09) 560 else if (src_format == IMGFMT_YVU9 || src_format == IMGFMT_IF09)
578 vo_server->draw_slice = vidix_draw_slice_410; 561 vo_server->draw_slice = vidix_draw_slice_410;
579 else vo_server->draw_slice = 562 else vo_server->draw_slice = vidix_draw_slice_packed;
580 is_422_planes_eq ?
581 vidix_draw_slice_packed_fast:
582 vidix_draw_slice_packed;
583 } 563 }
584 return 0; 564 return 0;
585 } 565 }
586 566
587 static uint32_t vidix_get_image(mp_image_t *mpi) 567 static uint32_t vidix_get_image(mp_image_t *mpi)
588 { 568 {
589 if(mpi->type==MP_IMGTYPE_STATIC && vidix_play.num_frames>1) return VO_FALSE; 569 if(mpi->type==MP_IMGTYPE_STATIC && vidix_play.num_frames>1) return VO_FALSE;
590 if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; /* slow video ram */ 570 if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; /* slow video ram */
591 if((is_422_planes_eq || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))) && 571 if(( (mpi->stride[0]==dstrides.y && (!(mpi->flags&MP_IMGFLAG_PLANAR) ||
572 (mpi->stride[1]==dstrides.u && mpi->stride[2]==dstrides.v)) )
573 || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))) &&
592 (!forced_fourcc && !(vidix_play.flags & VID_PLAY_INTERLEAVED_UV))) 574 (!forced_fourcc && !(vidix_play.flags & VID_PLAY_INTERLEAVED_UV)))
593 { 575 {
594 if(mpi->flags&MP_IMGFLAG_ACCEPT_WIDTH){ 576 if(mpi->flags&MP_IMGFLAG_ACCEPT_WIDTH){
595 // check if only width is enough to represent strides: 577 // check if only width is enough to represent strides:
596 if(mpi->flags&MP_IMGFLAG_PLANAR){ 578 if(mpi->flags&MP_IMGFLAG_PLANAR){
620 switch (request) { 602 switch (request) {
621 case VOCTRL_QUERY_FORMAT: 603 case VOCTRL_QUERY_FORMAT:
622 return vidix_query_fourcc(*((uint32_t*)data)); 604 return vidix_query_fourcc(*((uint32_t*)data));
623 case VOCTRL_GET_IMAGE: 605 case VOCTRL_GET_IMAGE:
624 return vidix_get_image(data); 606 return vidix_get_image(data);
607 case VOCTRL_DRAW_IMAGE:
608 return vidix_draw_image(data);
625 case VOCTRL_GET_FRAME_NUM: 609 case VOCTRL_GET_FRAME_NUM:
626 *(uint32_t *)data = next_frame; 610 *(uint32_t *)data = next_frame;
627 return VO_TRUE; 611 return VO_TRUE;
628 case VOCTRL_SET_FRAME_NUM: 612 case VOCTRL_SET_FRAME_NUM:
629 next_frame = *(uint32_t *)data; 613 next_frame = *(uint32_t *)data;