Mercurial > mplayer.hg
changeset 30096:76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
author | reimar |
---|---|
date | Wed, 30 Dec 2009 11:08:44 +0000 |
parents | 40bd6cdd6db9 |
children | 9d724e6def3e |
files | libmpcodecs/img_format.c libmpcodecs/img_format.h libmpcodecs/mp_image.h |
diffstat | 3 files changed, 50 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/img_format.c Tue Dec 29 22:16:28 2009 +0000 +++ b/libmpcodecs/img_format.c Wed Dec 30 11:08:44 2009 +0000 @@ -79,3 +79,40 @@ 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)); +}
--- a/libmpcodecs/img_format.h Tue Dec 29 22:16:28 2009 +0000 +++ b/libmpcodecs/img_format.h Wed Dec 30 11:08:44 2009 +0000 @@ -133,4 +133,11 @@ 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 */
--- a/libmpcodecs/mp_image.h Tue Dec 29 22:16:28 2009 +0000 +++ b/libmpcodecs/mp_image.h Wed Dec 30 11:08:44 2009 +0000 @@ -133,51 +133,24 @@ } 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: