Mercurial > mplayer.hg
changeset 28515:134689b7b548
Add MP_IMGTYPE_NUMBERED which gives access to the kind of mp_image_t that
are numbered and have a "in use" flag which is necessary for proper
buffer management as e.g. H.264 direct-rendering needs and is already used
successfully for the -vo vdpau work-in-progress.
author | reimar |
---|---|
date | Sat, 14 Feb 2009 08:22:49 +0000 |
parents | a796d60147fd |
children | 79b0bd20433e |
files | libmpcodecs/mp_image.h libmpcodecs/vf.c libmpcodecs/vf.h |
diffstat | 3 files changed, 25 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/mp_image.h Thu Feb 12 20:22:02 2009 +0000 +++ b/libmpcodecs/mp_image.h Sat Feb 14 08:22:49 2009 +0000 @@ -53,6 +53,8 @@ // buffer type was printed (do NOT set this flag - it's for INTERNAL USE!!!) #define MP_IMGFLAG_TYPE_DISPLAYED 0x8000 +// set if it can not be reused yet (for MP_IMGTYPE_NUMBERED) +#define MP_IMGFLAG_IN_USE 0x10000 // codec doesn't support any form of direct rendering - it has own buffer // allocation. so we just export its buffer pointers: @@ -65,6 +67,8 @@ #define MP_IMGTYPE_IP 3 // I+P+B type, requires 2+ independent static R/W and 1+ temp WO buffers #define MP_IMGTYPE_IPB 4 +// Upper 16 bits give desired buffer number, -1 means get next available +#define MP_IMGTYPE_NUMBERED 5 #define MP_MAX_PLANES 4 @@ -76,8 +80,9 @@ #define MP_IMGFIELD_INTERLACED 0x20 typedef struct mp_image_s { - unsigned short flags; + unsigned int flags; unsigned char type; + int number; unsigned char bpp; // bits/pixel. NOT depth! for RGB it will be n*8 unsigned int imgfmt; int width,height; // stored dimensions
--- a/libmpcodecs/vf.c Thu Feb 12 20:22:02 2009 +0000 +++ b/libmpcodecs/vf.c Sat Feb 14 08:22:49 2009 +0000 @@ -253,6 +253,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h){ mp_image_t* mpi=NULL; int w2; + int number = mp_imgtype >> 16; #ifdef MP_DEBUG assert(w == -1 || w >= vf->w); @@ -275,7 +276,7 @@ // Note: we should call libvo first to check if it supports direct rendering // and if not, then fallback to software buffers: - switch(mp_imgtype){ + switch(mp_imgtype & 0xff){ case MP_IMGTYPE_EXPORT: if(!vf->imgctx.export_images[0]) vf->imgctx.export_images[0]=new_mp_image(w2,h); mpi=vf->imgctx.export_images[0]; @@ -299,6 +300,19 @@ mpi=vf->imgctx.static_images[vf->imgctx.static_idx]; vf->imgctx.static_idx^=1; break; + case MP_IMGTYPE_NUMBERED: + if (number == -1) { + int i; + for (i = 0; i < NUM_NUMBERED_MPI; i++) + if (!vf->imgctx.numbered_images[i] || !(vf->imgctx.numbered_images[i]->flags & MP_IMGFLAG_IN_USE)) + break; + number = i; + } + if (number < 0 || number >= NUM_NUMBERED_MPI) return NULL; + if (!vf->imgctx.numbered_images[number]) vf->imgctx.numbered_images[number] = new_mp_image(w2,h); + mpi = vf->imgctx.numbered_images[number]; + mpi->number = number; + break; } if(mpi){ mpi->type=mp_imgtype; @@ -306,6 +320,7 @@ // keep buffer allocation status & color flags only: // mpi->flags&=~(MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE|MP_IMGFLAG_DIRECT); mpi->flags&=MP_IMGFLAG_ALLOCATED|MP_IMGFLAG_TYPE_DISPLAYED|MP_IMGFLAGMASK_COLORS; + mpi->flags |= MP_IMGFLAG_IN_USE; // accept restrictions & draw_slice flags only: mpi->flags|=mp_imgflag&(MP_IMGFLAGMASK_RESTRICTIONS|MP_IMGFLAG_DRAW_CALLBACK); if(!vf->draw_slice) mpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK;
--- a/libmpcodecs/vf.h Thu Feb 12 20:22:02 2009 +0000 +++ b/libmpcodecs/vf.h Sat Feb 14 08:22:49 2009 +0000 @@ -16,10 +16,13 @@ const void* opts; } vf_info_t; +#define NUM_NUMBERED_MPI 50 + typedef struct vf_image_context_s { mp_image_t* static_images[2]; mp_image_t* temp_images[1]; mp_image_t* export_images[1]; + mp_image_t* numbered_images[NUM_NUMBERED_MPI]; int static_idx; } vf_image_context_t;