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