Mercurial > mplayer.hg
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; |