Mercurial > mplayer.hg
changeset 8006:694502344370
(de)intrleave luma & chroma idependantly
author | michael |
---|---|
date | Thu, 31 Oct 2002 22:47:51 +0000 |
parents | f8b3111f8b16 |
children | 87c979e641cb |
files | DOCS/tech/vop.txt libmpcodecs/vf_il.c |
diffstat | 2 files changed, 35 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/tech/vop.txt Thu Oct 31 20:08:50 2002 +0000 +++ b/DOCS/tech/vop.txt Thu Oct 31 22:47:51 2002 +0000 @@ -189,10 +189,9 @@ swap U & V plane MPI: EXPORT --vop il=[d|i][s][c] +-vop il=[d|i][s][:[d|i][s]] (de)interleaves lines d deinterleave i interleave - c chroma too (otherwise only luma is modified if the format is planar YUV) s swap fields (exchange even & odd lines) MPI: TEMP, accepts stride
--- a/libmpcodecs/vf_il.c Thu Oct 31 20:08:50 2002 +0000 +++ b/libmpcodecs/vf_il.c Thu Oct 31 22:47:51 2002 +0000 @@ -37,11 +37,14 @@ //===========================================================================// +typedef struct FilterParam{ + int interleave; + int swap; +}FilterParam; struct vf_priv_s { - int interleave; - int chroma; - int swap; + FilterParam lumaParam; + FilterParam chromaParam; }; @@ -85,6 +88,8 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ int w; + FilterParam *luma = &vf->priv->lumaParam; + FilterParam *chroma= &vf->priv->chromaParam; mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, @@ -96,25 +101,16 @@ w= mpi->w * mpi->bpp/8; interleave(dmpi->planes[0], mpi->planes[0], - w, mpi->h, dmpi->stride[0], mpi->stride[0], vf->priv->interleave, vf->priv->swap); + w, mpi->h, dmpi->stride[0], mpi->stride[0], luma->interleave, luma->swap); if(mpi->flags&MP_IMGFLAG_PLANAR){ int cw= mpi->w >> mpi->chroma_x_shift; int ch= mpi->h >> mpi->chroma_y_shift; - - if(vf->priv->chroma){ - interleave(dmpi->planes[1], mpi->planes[1], cw,ch, - dmpi->stride[1], mpi->stride[1], vf->priv->interleave, vf->priv->swap); - interleave(dmpi->planes[2], mpi->planes[2], cw,ch, - dmpi->stride[2], mpi->stride[2], vf->priv->interleave, vf->priv->swap); - }else{ - int y; - for(y=0; y < ch; y++) - memcpy(dmpi->planes[1] + dmpi->stride[1]*y, mpi->planes[1] + mpi->stride[1]*y, cw); - for(y=0; y < ch; y++) - memcpy(dmpi->planes[2] + dmpi->stride[2]*y, mpi->planes[2] + mpi->stride[2]*y, cw); - } + interleave(dmpi->planes[1], mpi->planes[1], cw,ch, + dmpi->stride[1], mpi->stride[1], chroma->interleave, luma->swap); + interleave(dmpi->planes[2], mpi->planes[2], cw,ch, + dmpi->stride[2], mpi->stride[2], chroma->interleave, luma->swap); } return vf_next_put_image(vf,dmpi); @@ -127,6 +123,20 @@ return vf_next_query_format(vf, fmt); } +static void parse(FilterParam *fp, char* args){ + char *pos; + char *max= strchr(args, ':'); + + if(!max) max= args + strlen(args); + + pos= strchr(args, 's'); + if(pos && pos<max) fp->swap=1; + pos= strchr(args, 'i'); + if(pos && pos<max) fp->interleave=1; + pos= strchr(args, 'd'); + if(pos && pos<max) fp->interleave=-1; +} + static int open(vf_instance_t *vf, char* args){ char *pos, *max; @@ -136,19 +146,13 @@ vf->query_format=query_format; vf->priv=malloc(sizeof(struct vf_priv_s)); memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if(args==NULL) return 0; - - max= args + strlen(args); - - pos= strchr(args, 's'); - if(pos && pos<max) vf->priv->swap=1; - pos= strchr(args, 'c'); - if(pos && pos<max) vf->priv->chroma=1; - pos= strchr(args, 'i'); - if(pos && pos<max) vf->priv->interleave=1; - pos= strchr(args, 'd'); - if(pos && pos<max) vf->priv->interleave=-1; + + if(args) + { + char *arg2= strchr(args,':'); + if(arg2) parse(&vf->priv->chromaParam, arg2+1); + parse(&vf->priv->lumaParam, args); + } return 1; }