summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-12-30 11:08:44 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-12-30 11:08:44 +0000
commit92f20f876f7efac016d9b69aa01fe3d2f0fc6f68 (patch)
tree6ff28373a4f412ce4e63a733117cb6631c917af7 /libmpcodecs
parent427039acff27c8d9b605d9b807d6f3a2c15830aa (diff)
downloadmpv-92f20f876f7efac016d9b69aa01fe3d2f0fc6f68.tar.bz2
mpv-92f20f876f7efac016d9b69aa01fe3d2f0fc6f68.tar.xz
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30138 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/img_format.c37
-rw-r--r--libmpcodecs/img_format.h7
-rw-r--r--libmpcodecs/mp_image.h39
3 files changed, 50 insertions, 33 deletions
diff --git a/libmpcodecs/img_format.c b/libmpcodecs/img_format.c
index 2c83a643f7..d4f4d59f38 100644
--- a/libmpcodecs/img_format.c
+++ b/libmpcodecs/img_format.c
@@ -79,3 +79,40 @@ const char *vo_format_name(int format)
snprintf(unknown_format,20,"Unknown 0x%04x",format);
return unknown_format;
}
+
+int mp_get_chroma_shift(int format, int *x_shift, int *y_shift)
+{
+ int xs = 0, ys = 0;
+ int err = 0;
+ switch (format) {
+ case IMGFMT_I420:
+ case IMGFMT_IYUV:
+ case IMGFMT_YV12:
+ xs = 1;
+ ys = 1;
+ break;
+ case IMGFMT_IF09:
+ case IMGFMT_YVU9:
+ xs = 2;
+ ys = 2;
+ break;
+ case IMGFMT_444P:
+ xs = 0;
+ ys = 0;
+ break;
+ case IMGFMT_422P:
+ xs = 1;
+ ys = 0;
+ break;
+ case IMGFMT_411P:
+ xs = 2;
+ ys = 0;
+ break;
+ default:
+ err = 1;
+ break;
+ }
+ if (x_shift) *x_shift = xs;
+ if (y_shift) *y_shift = ys;
+ return err ? 0 : 8 + (16 >> (xs + ys));
+}
diff --git a/libmpcodecs/img_format.h b/libmpcodecs/img_format.h
index 4c917b01e4..56d96c481a 100644
--- a/libmpcodecs/img_format.h
+++ b/libmpcodecs/img_format.h
@@ -133,4 +133,11 @@ typedef struct {
const char *vo_format_name(int format);
+/**
+ * Calculates the scale shifts for the chroma planes for planar YUV
+ *
+ * \return bits-per-pixel for format if successful (i.e. format is 3 or 4-planes planar YUV), 0 otherwise
+ */
+int mp_get_chroma_shift(int format, int *x_shift, int *y_shift);
+
#endif /* MPLAYER_IMG_FORMAT_H */
diff --git a/libmpcodecs/mp_image.h b/libmpcodecs/mp_image.h
index 9e02571380..cfc42f81e7 100644
--- a/libmpcodecs/mp_image.h
+++ b/libmpcodecs/mp_image.h
@@ -133,51 +133,24 @@ static inline void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){
}
mpi->flags|=MP_IMGFLAG_YUV;
mpi->num_planes=3;
+ if (mp_get_chroma_shift(out_fmt, NULL, NULL)) {
+ mpi->flags|=MP_IMGFLAG_PLANAR;
+ mpi->bpp = mp_get_chroma_shift(out_fmt, &mpi->chroma_x_shift, &mpi->chroma_y_shift);
+ mpi->chroma_width = mpi->width >> mpi->chroma_x_shift;
+ mpi->chroma_height = mpi->height >> mpi->chroma_y_shift;
+ }
switch(out_fmt){
case IMGFMT_I420:
case IMGFMT_IYUV:
mpi->flags|=MP_IMGFLAG_SWAPPED;
case IMGFMT_YV12:
- mpi->flags|=MP_IMGFLAG_PLANAR;
- mpi->bpp=12;
- mpi->chroma_width=(mpi->width>>1);
- mpi->chroma_height=(mpi->height>>1);
- mpi->chroma_x_shift=1;
- mpi->chroma_y_shift=1;
return;
case IMGFMT_IF09:
mpi->num_planes=4;
case IMGFMT_YVU9:
- mpi->flags|=MP_IMGFLAG_PLANAR;
- mpi->bpp=9;
- mpi->chroma_width=(mpi->width>>2);
- mpi->chroma_height=(mpi->height>>2);
- mpi->chroma_x_shift=2;
- mpi->chroma_y_shift=2;
- return;
case IMGFMT_444P:
- mpi->flags|=MP_IMGFLAG_PLANAR;
- mpi->bpp=24;
- mpi->chroma_width=(mpi->width);
- mpi->chroma_height=(mpi->height);
- mpi->chroma_x_shift=0;
- mpi->chroma_y_shift=0;
- return;
case IMGFMT_422P:
- mpi->flags|=MP_IMGFLAG_PLANAR;
- mpi->bpp=16;
- mpi->chroma_width=(mpi->width>>1);
- mpi->chroma_height=(mpi->height);
- mpi->chroma_x_shift=1;
- mpi->chroma_y_shift=0;
- return;
case IMGFMT_411P:
- mpi->flags|=MP_IMGFLAG_PLANAR;
- mpi->bpp=12;
- mpi->chroma_width=(mpi->width>>2);
- mpi->chroma_height=(mpi->height);
- mpi->chroma_x_shift=2;
- mpi->chroma_y_shift=0;
return;
case IMGFMT_Y800:
case IMGFMT_Y8: