diff options
author | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-07-20 13:53:53 +0000 |
---|---|---|
committer | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-07-20 13:53:53 +0000 |
commit | 3f558f2e9b0a1d6763fb07ef08b082667bc207b6 (patch) | |
tree | a60b4da91653f99df3274231360761e3cdeab5c7 /libmpcodecs/vd_xvid.c | |
parent | d05326c4bc7d26fbcf1c52a94f900a704026fc2a (diff) | |
download | mpv-3f558f2e9b0a1d6763fb07ef08b082667bc207b6.tar.bz2 mpv-3f558f2e9b0a1d6763fb07ef08b082667bc207b6.tar.xz |
Add direct rendering method 2
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6757 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs/vd_xvid.c')
-rw-r--r-- | libmpcodecs/vd_xvid.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/libmpcodecs/vd_xvid.c b/libmpcodecs/vd_xvid.c index 7843b4b772..732daaa9e1 100644 --- a/libmpcodecs/vd_xvid.c +++ b/libmpcodecs/vd_xvid.c @@ -7,10 +7,14 @@ #ifdef HAVE_XVID #include "vd_internal.h" +#include "cfgparser.h" #include <divx4.h> #include <xvid.h> +#ifndef XVID_CSP_EXTERN +#error "You need lastest XviD CVS" +#endif static vd_info_t info = { @@ -26,10 +30,19 @@ LIBVD_EXTERN(xvid) typedef struct { int cs; + unsigned char img_type; void* hdl; mp_image_t* mpi; } priv_t; +static int do_dr2 = 0; + +struct config xvid_dec_opts[] = { + { "dr2", &do_dr2, CONF_TYPE_FLAG, 0, 0, 1, NULL}, + { "nodr2", &do_dr2, CONF_TYPE_FLAG, 0, 1, 0, NULL}, + {NULL, NULL, 0, 0, 0, 0, NULL} +}; + // to set/get/query special features/parameters static int control(sh_video_t *sh,int cmd,void* arg,...){ return CONTROL_UNKNOWN; @@ -50,7 +63,7 @@ static int init(sh_video_t *sh){ switch(sh->codec->outfmt[sh->outfmtidx]){ case IMGFMT_YV12: - cs= XVID_CSP_USER; + cs= do_dr2 ? XVID_CSP_EXTERN : XVID_CSP_USER; break; case IMGFMT_YUY2: cs=XVID_CSP_YUY2; @@ -106,6 +119,18 @@ static int init(sh_video_t *sh){ p->hdl = dec_p.handle; sh->context = p; + switch(cs) { + case XVID_CSP_EXTERN: + p->img_type = MP_IMGTYPE_STATIC; + break; + case XVID_CSP_USER: + p->img_type = MP_IMGTYPE_EXPORT; + break; + default: + p->img_type = MP_IMGTYPE_TEMP; + break; + } + return 1; } @@ -122,10 +147,10 @@ static void uninit(sh_video_t *sh){ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ XVID_DEC_FRAME dec; DEC_PICTURE d4_pic; + XVID_DEC_PICTURE pic; priv_t* p = sh->context; - mp_image_t* mpi = mpcodecs_get_image(sh, p->cs == XVID_CSP_USER ? - MP_IMGTYPE_EXPORT : MP_IMGTYPE_TEMP, + mp_image_t* mpi = mpcodecs_get_image(sh, p->img_type, MP_IMGFLAG_ACCEPT_STRIDE, sh->disp_w,sh->disp_h); @@ -140,6 +165,15 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ case XVID_CSP_USER: dec.image = &d4_pic; break; + case XVID_CSP_EXTERN: + pic.y = mpi->planes[0]; + pic.u = mpi->planes[1]; + pic.v = mpi->planes[2]; + pic.stride_y = mpi->stride[0]; + pic.stride_u = mpi->stride[1]; + pic.stride_v = mpi->stride[2]; + dec.image = &pic; + break; default: dec.image = mpi->planes[0]; if(IMGFMT_IS_BGR(mpi->imgfmt) || IMGFMT_IS_RGB(mpi->imgfmt)) |