Mercurial > mplayer.hg
changeset 5523:8d55957fa018
colorspace conversion support
author | arpi |
---|---|
date | Sun, 07 Apr 2002 21:33:42 +0000 |
parents | 545c13161589 |
children | a66cad52c339 |
files | libmpcodecs/vf_scale.c |
diffstat | 1 files changed, 56 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/vf_scale.c Sun Apr 07 20:21:37 2002 +0000 +++ b/libmpcodecs/vf_scale.c Sun Apr 07 21:33:42 2002 +0000 @@ -6,6 +6,7 @@ #include "../config.h" #include "../mp_msg.h" +#include "../libvo/img_format.h" #include "../mp_image.h" #include "vf.h" @@ -14,25 +15,58 @@ struct vf_priv_s { int w,h; + unsigned int fmt; SwsContext *ctx; }; //===========================================================================// +static unsigned int outfmt_list[]={ + IMGFMT_BGR32, + IMGFMT_BGR24, + IMGFMT_BGR16, + IMGFMT_BGR15, + IMGFMT_YV12, + IMGFMT_I420, + IMGFMT_IYUV, + NULL +}; + static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){ + unsigned int* p=outfmt_list; + unsigned int best=0; + // find the best outfmt: + while(*p){ + int ret=vf_next_query_format(vf,*p); + mp_msg(MSGT_VFILTER,MSGL_V,"scale: query(%s) -> %d\n",vo_format_name(*p),ret&3); + if(ret&2){ best=*p; break;} // no conversion -> bingo! + if(ret&1 && !best) best=*p; // best with conversion + ++p; + } + if(!best){ + printf("SwScale: no supported outfmt found :(\n"); + return 0; + } + // calculate the missing parameters: if(vf->priv->w<=0) vf->priv->w=width; if(vf->priv->h<=0) vf->priv->h=height; + + printf("SwScale scaling %dx%d %s to %dx%d %s \n", + width,height,vo_format_name(outfmt), + vf->priv->w,vf->priv->h,vo_format_name(best)); + // new swscaler: vf->priv->ctx=getSwsContextFromCmdLine(width,height,outfmt, - vf->priv->w,vf->priv->h,outfmt); + vf->priv->w,vf->priv->h,best); if(!vf->priv->ctx){ // error... printf("Couldn't init SwScaler for this setup\n"); return 0; } + vf->priv->fmt=best; return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,outfmt); } @@ -40,7 +74,7 @@ mp_image_t *dmpi; // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, + dmpi=vf_get_image(vf->next,vf->priv->fmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, vf->priv->w, vf->priv->h); @@ -51,6 +85,26 @@ //===========================================================================// +// supported Input formats: YV12, I420, IYUV, YUY2, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8, Y800 + +static int query_format(struct vf_instance_s* vf, unsigned int fmt){ + switch(fmt){ + case IMGFMT_YV12: + case IMGFMT_I420: + case IMGFMT_IYUV: + case IMGFMT_YUY2: + case IMGFMT_BGR32: + case IMGFMT_BGR24: + case IMGFMT_BGR16: + case IMGFMT_BGR15: + case IMGFMT_RGB32: + case IMGFMT_RGB24: + case IMGFMT_Y800: + return 3; //vf_next_query_format(vf,fmt); + } + return 0; +} + static int open(vf_instance_t *vf, char* args){ vf->config=config; vf->put_image=put_image;