Mercurial > mplayer.hg
changeset 20455:e36737b5ec2f
update vf_geq to new ff_eval API
author | ods15 |
---|---|
date | Fri, 27 Oct 2006 19:40:48 +0000 |
parents | f601726df501 |
children | 52b0d09d347a |
files | libmpcodecs/vf_geq.c |
diffstat | 1 files changed, 84 insertions(+), 77 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/vf_geq.c Fri Oct 27 19:19:40 2006 +0000 +++ b/libmpcodecs/vf_geq.c Fri Oct 27 19:40:48 2006 +0000 @@ -27,18 +27,12 @@ #include "mp_msg.h" #include "cpudetect.h" -#if 1 -double ff_eval(char *s, double *const_value, const char **const_name, - double (**func1)(void *, double), const char **func1_name, - double (**func2)(void *, double, double), char **func2_name, - void *opaque); -#endif - // Needed to bring in lrintf. #define HAVE_AV_CONFIG_H #include "libavcodec/avcodec.h" #include "libavcodec/dsputil.h" +#include "libavcodec/eval.h" #include "libavutil/common.h" /* FIXME: common.h defines printf away when HAVE_AV_CONFIG @@ -57,7 +51,7 @@ struct vf_priv_s { - char eq[3][2000]; + AVEvalExpr * e[3]; int framenum; mp_image_t *mpi; }; @@ -120,6 +114,76 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ mp_image_t *dmpi; int x,y, plane; + + if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ + // no DR, so get a new image! hope we'll get DR buffer: + vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, + MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, + mpi->w,mpi->h); + } + + dmpi= vf->dmpi; + vf->priv->mpi= mpi; + + vf_clone_mpi_attributes(dmpi, mpi); + + for(plane=0; plane<3; plane++){ + int w= mpi->w >> (plane ? mpi->chroma_x_shift : 0); + int h= mpi->h >> (plane ? mpi->chroma_y_shift : 0); + uint8_t *dst = dmpi->planes[plane]; + int dst_stride= dmpi->stride[plane]; + double const_values[]={ + M_PI, + M_E, + 0, + 0, + w, + h, + vf->priv->framenum, + w/(double)mpi->w, + h/(double)mpi->h, + 0 + }; + if (!vf->priv->e[plane]) continue; + for(y=0; y<h; y++){ + const_values[3]=y; + for(x=0; x<w; x++){ + const_values[2]=x; + dst[x+y* dst_stride]= ff_parse_eval(vf->priv->e[plane], const_values, vf); + } + } + } + + vf->priv->framenum++; + + return vf_next_put_image(vf,dmpi, pts); +} + +static void uninit(struct vf_instance_s* vf){ + if(!vf->priv) return; + + av_free(vf->priv); + vf->priv=NULL; +} + +//===========================================================================// +static int open(vf_instance_t *vf, char* args){ + char eq[3][2000] = { { 0 }, { 0 }, { 0 } }; + int plane; + + vf->config=config; + vf->put_image=put_image; +// vf->get_image=get_image; + vf->uninit=uninit; + vf->priv=av_malloc(sizeof(struct vf_priv_s)); + memset(vf->priv, 0, sizeof(struct vf_priv_s)); + + if (args) sscanf(args, "%1999s:%1999s:%1999s", eq[0], eq[1], eq[2]); + + if (!eq[1][0]) strncpy(eq[1], eq[0], sizeof(eq[0])-1); + if (!eq[2][0]) strncpy(eq[2], eq[1], sizeof(eq[0])-1); + + for(plane=0; plane<3; plane++){ static const char *const_names[]={ "PI", "E", @@ -139,77 +203,20 @@ "p", NULL }; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->w,mpi->h); - } - - dmpi= vf->dmpi; - vf->priv->mpi= mpi; - - vf_clone_mpi_attributes(dmpi, mpi); + double (*func2[])(void *, double, double)={ + lum, + cb, + cr, + plane==0 ? lum : (plane==1 ? cb : cr), + NULL + }; + char * a; + vf->priv->e[plane] = ff_parse(eq[plane], const_names, NULL, NULL, func2, func2_names, &a); - for(plane=0; plane<3; plane++){ - int w= mpi->w >> (plane ? mpi->chroma_x_shift : 0); - int h= mpi->h >> (plane ? mpi->chroma_y_shift : 0); - uint8_t *dst = dmpi->planes[plane]; - int dst_stride= dmpi->stride[plane]; - double (*func2[])(void *, double, double)={ - lum, - cb, - cr, - plane==0 ? lum : (plane==1 ? cb : cr), - NULL - }; - double const_values[]={ - M_PI, - M_E, - 0, - 0, - w, - h, - vf->priv->framenum, - w/(double)mpi->w, - h/(double)mpi->h, - 0 - }; - for(y=0; y<h; y++){ - const_values[3]=y; - for(x=0; x<w; x++){ - const_values[2]=x; - dst[x+y* dst_stride]= ff_eval(vf->priv->eq[plane], const_values, const_names, NULL, NULL, func2, func2_names, vf); - } - } + if (!vf->priv->e[plane]) { + mp_msg(MSGT_VFILTER, MSGL_ERR, "geq: error loading equation `%s': %s\n", eq[plane], a); } - - vf->priv->framenum++; - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance_s* vf){ - if(!vf->priv) return; - - av_free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int open(vf_instance_t *vf, char* args){ - vf->config=config; - vf->put_image=put_image; -// vf->get_image=get_image; - vf->uninit=uninit; - vf->priv=av_malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if (args) sscanf(args, "%1999s:%1999s:%1999s", vf->priv->eq[0], vf->priv->eq[1], vf->priv->eq[2]); - - if(!vf->priv->eq[1][0]) strncpy(vf->priv->eq[1], vf->priv->eq[0], sizeof(vf->priv->eq[0])-1); - if(!vf->priv->eq[2][0]) strncpy(vf->priv->eq[2], vf->priv->eq[1], sizeof(vf->priv->eq[0])-1); + } return 1; }