diff options
Diffstat (limited to 'libmpcodecs/img_format.c')
-rw-r--r-- | libmpcodecs/img_format.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/libmpcodecs/img_format.c b/libmpcodecs/img_format.c index 7d20a77cc7..31cb3591bb 100644 --- a/libmpcodecs/img_format.c +++ b/libmpcodecs/img_format.c @@ -37,6 +37,13 @@ const char *vo_format_name(int format) case IMGFMT_CLPL: return "Planar CLPL"; case IMGFMT_Y800: return "Planar Y800"; case IMGFMT_Y8: return "Planar Y8"; + case IMGFMT_420P16_LE: return "Planar 420P 16-bit little-endian"; + case IMGFMT_420P16_BE: return "Planar 420P 16-bit big-endian"; + case IMGFMT_422P16_LE: return "Planar 422P 16-bit little-endian"; + case IMGFMT_422P16_BE: return "Planar 422P 16-bit big-endian"; + case IMGFMT_444P16_LE: return "Planar 444P 16-bit little-endian"; + case IMGFMT_444P16_BE: return "Planar 444P 16-bit big-endian"; + case IMGFMT_420A: return "Planar 420P with alpha"; case IMGFMT_444P: return "Planar 444P"; case IMGFMT_422P: return "Planar 422P"; case IMGFMT_411P: return "Planar 411P"; @@ -79,3 +86,60 @@ 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 bpp; + int bpp_factor = 1; + int err = 0; + switch (format) { + case IMGFMT_420P16_LE: + case IMGFMT_420P16_BE: + bpp_factor = 2; + case IMGFMT_420A: + 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_444P16_LE: + case IMGFMT_444P16_BE: + bpp_factor = 2; + case IMGFMT_444P: + xs = 0; + ys = 0; + break; + case IMGFMT_422P16_LE: + case IMGFMT_422P16_BE: + bpp_factor = 2; + case IMGFMT_422P: + xs = 1; + ys = 0; + break; + case IMGFMT_411P: + xs = 2; + ys = 0; + break; + case IMGFMT_440P: + xs = 0; + ys = 1; + break; + default: + err = 1; + break; + } + if (x_shift) *x_shift = xs; + if (y_shift) *y_shift = ys; + bpp = 8 + (16 >> (xs + ys)); + if (format == IMGFMT_420A) + bpp += 8; + bpp *= bpp_factor; + return err ? 0 : bpp; +} |