On Fri, Feb 12, 2010 at 10:28:58PM +0100, Giorgio wrote: > // to set/get/query special features/parameters > static int control(sh_video_t *sh,int cmd,void* arg,...){ > + theora_struct_t *context = (theora_struct_t *)sh->context; Useless cast. > switch(cmd) { > case VDCTRL_QUERY_FORMAT: > - if ((*((int*)arg)) == IMGFMT_YV12) > - return CONTROL_TRUE; > + if ((*((int*)arg)) == IMGFMT_YV12 && context->inf.pixelformat == OC_PF_420) return CONTROL_TRUE; > + if ((*((int*)arg)) == IMGFMT_422P && context->inf.pixelformat == OC_PF_422) return CONTROL_TRUE; > + if ((*((int*)arg)) == IMGFMT_444P && context->inf.pixelformat == OC_PF_444) return CONTROL_TRUE; Make a function that converts the context->inf.pixelformat to the corresponding IMGFMT_ and use that in both places. > return CONTROL_FALSE; > } > - > return CONTROL_UNKNOWN; Unrelated/cosmetic change. > @@ -73,6 +75,8 @@ > switch(sh->codec->outfmt[sh->outfmtidx]) > { > case IMGFMT_YV12: /* well, this should work... */ break; > + case IMGFMT_422P: break; > + case IMGFMT_444P: break; > default: > mp_msg (MSGT_DECVIDEO,MSGL_ERR,"Unsupported out_fmt: 0x%X\n", > sh->codec->outfmt[sh->outfmtidx]); I removed this useless piece of code. > @@ -133,7 +137,14 @@ > > mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Theora video init ok!\n"); > > - return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_height,IMGFMT_YV12); > + switch(context->inf.pixelformat) { > + case OC_PF_420: > + return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_height,IMGFMT_YV12); > + case OC_PF_422: > + return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_height,IMGFMT_422P); > + case OC_PF_444: > + return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_height,IMGFMT_444P); > + } Trailing whitespace and also code duplication (see my suggestion about the conversion function for how to avoid it. Apart from that I think it looks ok.