comparison libmpcodecs/vd_ffmpeg.c @ 6873:1206fa765697

colorspace part cleanup and support for IMGFMT_422P, _444P i didn't removed the 422p->yuy2 conversion yet, because of swscaler can't output yuy2 and 422p->yv12 loses quality :(
author arpi
date Fri, 02 Aug 2002 19:38:59 +0000
parents 591a6c942551
children 255b150a75a5
comparison
equal deleted inserted replaced
6872:e75137e656d3 6873:1206fa765697
44 int last_aspect; 44 int last_aspect;
45 int do_slices; 45 int do_slices;
46 int do_dr1; 46 int do_dr1;
47 int vo_inited; 47 int vo_inited;
48 int convert; 48 int convert;
49 int yuy2_support; 49 int best_csp;
50 #if LIBAVCODEC_BUILD >= 4615
51 int yvu9_support;
52 #endif
53 } vd_ffmpeg_ctx; 50 } vd_ffmpeg_ctx;
54 51
55 //#ifdef FF_POSTPROCESS 52 //#ifdef FF_POSTPROCESS
56 //unsigned int lavc_pp=0; 53 //unsigned int lavc_pp=0;
57 //#endif 54 //#endif
78 }; 75 };
79 76
80 // to set/get/query special features/parameters 77 // to set/get/query special features/parameters
81 static int control(sh_video_t *sh,int cmd,void* arg,...){ 78 static int control(sh_video_t *sh,int cmd,void* arg,...){
82 vd_ffmpeg_ctx *ctx = sh->context; 79 vd_ffmpeg_ctx *ctx = sh->context;
80 AVCodecContext *avctx = ctx->avctx;
83 switch(cmd){ 81 switch(cmd){
84 case VDCTRL_QUERY_FORMAT: 82 case VDCTRL_QUERY_FORMAT:
85 switch(*((int*)arg)){ 83 if( (*((int*)arg)) == ctx->best_csp ) return CONTROL_TRUE;//supported
84 // possible conversions:
85 switch( (*((int*)arg)) ){
86 case IMGFMT_YV12: 86 case IMGFMT_YV12:
87 case IMGFMT_IYUV: 87 case IMGFMT_IYUV:
88 case IMGFMT_I420: 88 case IMGFMT_I420:
89 #if LIBAVCODEC_BUILD >= 4615 89 // "converted" using pointer/stride modification
90 if(ctx->yvu9_support) return CONTROL_FALSE; 90 if(avctx->pix_fmt==PIX_FMT_YUV420P) return CONTROL_TRUE;// u/v swap
91 else 91 if(avctx->pix_fmt==PIX_FMT_YUV422P) return CONTROL_TRUE;// half stride
92 #endif 92 break;
93 return CONTROL_TRUE; 93 #if 1
94 case IMGFMT_YUY2: 94 case IMGFMT_YUY2:
95 if(ctx->yuy2_support) return CONTROL_TRUE; 95 // converted using yuv422ptoyuy2()
96 return CONTROL_FALSE; 96 if(avctx->pix_fmt==PIX_FMT_YUV422P) return CONTROL_TRUE;
97 #if LIBAVCODEC_BUILD >= 4615 97 break;
98 case IMGFMT_YVU9: 98 }
99 if(ctx->yvu9_support) return CONTROL_TRUE; 99 #endif
100 return CONTROL_FALSE; 100 return CONTROL_FALSE;
101 #endif
102 default:
103 return CONTROL_FALSE;
104
105 }
106 } 101 }
107 return CONTROL_UNKNOWN; 102 return CONTROL_UNKNOWN;
108 } 103 }
109 104
110 // init driver 105 // init driver
281 break; 276 break;
282 } 277 }
283 sh->disp_w = avctx->width; 278 sh->disp_w = avctx->width;
284 sh->disp_h = avctx->height; 279 sh->disp_h = avctx->height;
285 ctx->vo_inited=1; 280 ctx->vo_inited=1;
286 ctx->yuy2_support=(avctx->pix_fmt==PIX_FMT_YUV422P); 281 switch(avctx->pix_fmt){
287 #if LIBAVCODEC_BUILD >= 4615 282 #if LIBAVCODEC_BUILD >= 4615
288 ctx->yvu9_support=(avctx->pix_fmt==PIX_FMT_YUV410P); 283 case PIX_FMT_YUV410P: ctx->best_csp=IMGFMT_YVU9;break; //svq1
289 #endif 284 #endif
290 if (!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h, 285 case PIX_FMT_YUV420P: ctx->best_csp=IMGFMT_YV12;break; //mpegs
291 ctx->yuy2_support ? IMGFMT_YUY2 : IMGFMT_YV12)) 286 case PIX_FMT_YUV422P: ctx->best_csp=IMGFMT_422P;break; //mjpeg
287 case PIX_FMT_YUV444P: ctx->best_csp=IMGFMT_444P;break; //???
288 case PIX_FMT_YUV422: ctx->best_csp=IMGFMT_YUY2;break; //???
289 default:
290 ctx->best_csp=0;
291 }
292 if (!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h, ctx->best_csp))
292 return -1; 293 return -1;
293 ctx->convert=(sh->codec->outfmt[sh->outfmtidx]==IMGFMT_YUY2); 294 ctx->convert=(sh->codec->outfmt[sh->outfmtidx]==IMGFMT_YUY2
295 && ctx->best_csp!=IMGFMT_YUY2); // yuv422p->yuy2 conversion
294 } 296 }
295 return 0; 297 return 0;
296 } 298 }
297 299
298 #if LIBAVCODEC_BUILD > 4615 300 #if LIBAVCODEC_BUILD > 4615
472 mpi->stride[0]=lavc_picture.linesize[0]; 474 mpi->stride[0]=lavc_picture.linesize[0];
473 mpi->stride[1]=lavc_picture.linesize[1]; 475 mpi->stride[1]=lavc_picture.linesize[1];
474 mpi->stride[2]=lavc_picture.linesize[2]; 476 mpi->stride[2]=lavc_picture.linesize[2];
475 } 477 }
476 478
477 if(avctx->pix_fmt==PIX_FMT_YUV422P){ 479 if(avctx->pix_fmt==PIX_FMT_YUV422P && mpi->chroma_y_shift==1){
478 // we have 422p but user wants yv12 (420p) 480 // we have 422p but user wants 420p
479 mpi->stride[1]*=2; 481 mpi->stride[1]*=2;
480 mpi->stride[2]*=2; 482 mpi->stride[2]*=2;
481 } 483 }
482 484
483 /* to comfirm with newer lavc style */ 485 /* to comfirm with newer lavc style */