[MPlayer-dev-eng] [PATCH] support -dr with more than 2 reference frames
Reimar Döffinger
Reimar.Doeffinger at stud.uni-karlsruhe.de
Fri Feb 13 16:23:42 CET 2009
Hello,
I noticed this is really necessary for VDPAU and it is pure luck it
works mostly without.
It adds a new MPIMGTYPE_NUMBERED which allows requesting a specific MPI
or the next free one, where MP_IMGFLAG_IN_USE is used to determine
which ones are free.
VDPAU only needs the feature of getting the "next free one" and not that
they are numbered, but I think there currently is some code duplication
in that regard that could now be removed.
What is your opinion about this? It seems simple enough and I think it
can't be done that wrong, but you never know...
Greetings,
Reimar Döffinger
-------------- next part --------------
diff --git a/libmpcodecs/mp_image.h b/libmpcodecs/mp_image.h
index 512f83e..94fd0d4 100644
--- a/libmpcodecs/mp_image.h
+++ b/libmpcodecs/mp_image.h
@@ -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
diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c
index cd18115..2371b0f 100644
--- a/libmpcodecs/vf.c
+++ b/libmpcodecs/vf.c
@@ -253,6 +253,7 @@ void vf_mpi_clear(mp_image_t* mpi,int x0,int y0,int w,int h){
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 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
// 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 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
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 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
// 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;
diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h
index a2617ff..e96d3fb 100644
--- a/libmpcodecs/vf.h
+++ b/libmpcodecs/vf.h
@@ -16,10 +16,13 @@ typedef struct vf_info_s {
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;
More information about the MPlayer-dev-eng
mailing list