summaryrefslogtreecommitdiffstats
path: root/video/img_format.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/img_format.c')
-rw-r--r--video/img_format.c217
1 files changed, 86 insertions, 131 deletions
diff --git a/video/img_format.c b/video/img_format.c
index e540dd24cf..bf75ba8a18 100644
--- a/video/img_format.c
+++ b/video/img_format.c
@@ -17,133 +17,87 @@
*/
#include <assert.h>
+#include <string.h>
#include <libavutil/pixfmt.h>
#include <libavutil/pixdesc.h>
-#include "config.h"
#include "video/img_format.h"
#include "video/mp_image.h"
#include "video/fmt-conversion.h"
-#include <string.h>
+#define FMT(string, id) \
+ {string, id},
+
+#define FMT_ENDIAN(string, id) \
+ {string, id}, \
+ {string "le", MP_CONCAT(id, _LE)}, \
+ {string "be", MP_CONCAT(id, _BE)}, \
struct mp_imgfmt_entry mp_imgfmt_list[] = {
- {"444p16le", IMGFMT_444P16_LE},
- {"444p16be", IMGFMT_444P16_BE},
- {"444p14le", IMGFMT_444P14_LE},
- {"444p14be", IMGFMT_444P14_BE},
- {"444p12le", IMGFMT_444P12_LE},
- {"444p12be", IMGFMT_444P12_BE},
- {"444p10le", IMGFMT_444P10_LE},
- {"444p10be", IMGFMT_444P10_BE},
- {"444p9le", IMGFMT_444P9_LE},
- {"444p9be", IMGFMT_444P9_BE},
- {"422p16le", IMGFMT_422P16_LE},
- {"422p16be", IMGFMT_422P16_BE},
- {"422p14le", IMGFMT_422P14_LE},
- {"422p14be", IMGFMT_422P14_BE},
- {"422p12le", IMGFMT_422P12_LE},
- {"422p12be", IMGFMT_422P12_BE},
- {"422p10le", IMGFMT_422P10_LE},
- {"422p10be", IMGFMT_422P10_BE},
- {"422p9le", IMGFMT_422P9_LE},
- {"422p9be", IMGFMT_422P9_BE},
- {"420p16le", IMGFMT_420P16_LE},
- {"420p16be", IMGFMT_420P16_BE},
- {"420p14le", IMGFMT_420P14_LE},
- {"420p14be", IMGFMT_420P14_BE},
- {"420p12le", IMGFMT_420P12_LE},
- {"420p12be", IMGFMT_420P12_BE},
- {"420p10le", IMGFMT_420P10_LE},
- {"420p10be", IMGFMT_420P10_BE},
- {"420p9le", IMGFMT_420P9_LE},
- {"420p9be", IMGFMT_420P9_BE},
- {"444p16", IMGFMT_444P16},
- {"444p14", IMGFMT_444P14},
- {"444p12", IMGFMT_444P12},
- {"444p10", IMGFMT_444P10},
- {"444p9", IMGFMT_444P9},
- {"422p16", IMGFMT_422P16},
- {"422p14", IMGFMT_422P14},
- {"422p12", IMGFMT_422P12},
- {"422p10", IMGFMT_422P10},
- {"420p14", IMGFMT_420P14},
- {"420p12", IMGFMT_420P12},
- {"420p10", IMGFMT_420P10},
- {"420p9", IMGFMT_420P9},
- {"420p16", IMGFMT_420P16},
- {"420a", IMGFMT_420A},
- {"444p", IMGFMT_444P},
- {"422p", IMGFMT_422P},
- {"411p", IMGFMT_411P},
- {"440p", IMGFMT_440P},
- {"yuy2", IMGFMT_YUY2},
- {"yvyu", IMGFMT_YVYU},
- {"uyvy", IMGFMT_UYVY},
- {"yvu9", IMGFMT_YVU9},
- {"if09", IMGFMT_IF09},
- {"yv12", IMGFMT_YV12},
- {"i420", IMGFMT_I420},
- {"iyuv", IMGFMT_IYUV},
- {"clpl", IMGFMT_CLPL},
- {"hm12", IMGFMT_HM12},
- {"y800", IMGFMT_Y800},
- {"y8", IMGFMT_Y8},
- {"y16ne", IMGFMT_Y16},
- {"y16le", IMGFMT_Y16LE},
- {"y16be", IMGFMT_Y16BE},
- {"nv12", IMGFMT_NV12},
- {"nv21", IMGFMT_NV21},
- {"bgr24", IMGFMT_BGR24},
- {"bgr32", IMGFMT_BGR32},
- {"bgr16", IMGFMT_BGR16},
- {"bgr15", IMGFMT_BGR15},
- {"bgr12", IMGFMT_BGR12},
- {"bgr8", IMGFMT_BGR8},
- {"bgr4", IMGFMT_BGR4},
- {"bg4b", IMGFMT_BG4B},
- {"bgr1", IMGFMT_BGR1},
- {"rgb48be", IMGFMT_RGB48BE},
- {"rgb48le", IMGFMT_RGB48LE},
- {"rgb48ne", IMGFMT_RGB48NE},
- {"rgb24", IMGFMT_RGB24},
- {"rgb32", IMGFMT_RGB32},
- {"rgb16", IMGFMT_RGB16},
- {"rgb15", IMGFMT_RGB15},
- {"rgb12", IMGFMT_RGB12},
- {"rgb8", IMGFMT_RGB8},
- {"pal8", IMGFMT_PAL8},
- {"rgb4", IMGFMT_RGB4},
- {"rg4b", IMGFMT_RG4B},
- {"rgb1", IMGFMT_RGB1},
- {"rgba", IMGFMT_RGBA},
- {"argb", IMGFMT_ARGB},
- {"bgra", IMGFMT_BGRA},
- {"abgr", IMGFMT_ABGR},
- {"bgr0", IMGFMT_BGR0},
- {"gbrp", IMGFMT_GBRP},
- {"mjpeg", IMGFMT_MJPEG},
- {"mjpg", IMGFMT_MJPEG},
- {"vdpau_h264", IMGFMT_VDPAU_H264},
- {"vdpau_mpeg1", IMGFMT_VDPAU_MPEG1},
- {"vdpau_mpeg2", IMGFMT_VDPAU_MPEG2},
- {"vdpau_mpeg4", IMGFMT_VDPAU_MPEG4},
- {"vdpau_wmv3", IMGFMT_VDPAU_WMV3},
- {"vdpau_vc1", IMGFMT_VDPAU_VC1},
+ FMT("y8", IMGFMT_Y8)
+ FMT_ENDIAN("y16", IMGFMT_Y16)
+ FMT("yuyv", IMGFMT_YUYV)
+ FMT("uyvy", IMGFMT_UYVY)
+ FMT("nv12", IMGFMT_NV12)
+ FMT("nv21", IMGFMT_NV21)
+ FMT("444p", IMGFMT_444P)
+ FMT("422p", IMGFMT_422P)
+ FMT("440p", IMGFMT_440P)
+ FMT("420p", IMGFMT_420P)
+ FMT("yv12", IMGFMT_420P) // old alias for UI
+ FMT("411p", IMGFMT_411P)
+ FMT("410p", IMGFMT_410P)
+ FMT_ENDIAN("444p16", IMGFMT_444P16)
+ FMT_ENDIAN("444p14", IMGFMT_444P14)
+ FMT_ENDIAN("444p12", IMGFMT_444P12)
+ FMT_ENDIAN("444p10", IMGFMT_444P10)
+ FMT_ENDIAN("444p9", IMGFMT_444P9)
+ FMT_ENDIAN("422p16", IMGFMT_422P16)
+ FMT_ENDIAN("422p14", IMGFMT_422P14)
+ FMT_ENDIAN("422p12", IMGFMT_422P12)
+ FMT_ENDIAN("422p10", IMGFMT_422P10)
+ FMT_ENDIAN("422p9", IMGFMT_422P9)
+ FMT_ENDIAN("420p16", IMGFMT_420P16)
+ FMT_ENDIAN("420p14", IMGFMT_420P14)
+ FMT_ENDIAN("420p12", IMGFMT_420P12)
+ FMT_ENDIAN("420p10", IMGFMT_420P10)
+ FMT_ENDIAN("420p9", IMGFMT_420P9)
+ FMT("420ap", IMGFMT_420AP)
+ FMT("argb", IMGFMT_ARGB)
+ FMT("bgra", IMGFMT_BGRA)
+ FMT("bgr0", IMGFMT_BGR0)
+ FMT("abgr", IMGFMT_ABGR)
+ FMT("rgba", IMGFMT_RGBA)
+ FMT("rgb32", IMGFMT_RGB32)
+ FMT("bgr32", IMGFMT_BGR32)
+ FMT("bgr24", IMGFMT_BGR24)
+ FMT("rgb24", IMGFMT_RGB24)
+ FMT_ENDIAN("rgb48", IMGFMT_RGB48)
+ FMT("rgb8", IMGFMT_RGB8)
+ FMT("bgr8", IMGFMT_BGR8)
+ FMT("rgb4_byte", IMGFMT_RGB4_BYTE)
+ FMT("bgr4_byte", IMGFMT_BGR4_BYTE)
+ FMT("rgb4", IMGFMT_RGB4)
+ FMT("bgr4", IMGFMT_BGR4)
+ FMT("mono", IMGFMT_MONO)
+ FMT_ENDIAN("rgb12", IMGFMT_RGB12)
+ FMT_ENDIAN("rgb15", IMGFMT_RGB15)
+ FMT_ENDIAN("rgb16", IMGFMT_RGB16)
+ FMT_ENDIAN("bgr12", IMGFMT_BGR12)
+ FMT_ENDIAN("bgr15", IMGFMT_BGR15)
+ FMT_ENDIAN("bgr16", IMGFMT_BGR16)
+ FMT("pal8", IMGFMT_PAL8)
+ FMT("gbrp", IMGFMT_GBRP)
+ FMT("vdpau_mpeg1", IMGFMT_VDPAU_MPEG1)
+ FMT("vdpau_mpeg2", IMGFMT_VDPAU_MPEG2)
+ FMT("vdpau_h264", IMGFMT_VDPAU_H264)
+ FMT("vdpau_wmv3", IMGFMT_VDPAU_WMV3)
+ FMT("vdpau_vc1", IMGFMT_VDPAU_VC1)
+ FMT("vdpau_mpeg4", IMGFMT_VDPAU_MPEG4)
{0}
};
-const char *vo_format_name(int format)
-{
- const char *name = mp_imgfmt_to_name(format);
- if (name)
- return name;
- static char unknown_format[20];
- 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 *component_bits)
{
@@ -162,12 +116,6 @@ int mp_get_chroma_shift(int format, int *x_shift, int *y_shift,
unsigned int mp_imgfmt_from_name(bstr name, bool allow_hwaccel)
{
- if (bstr_startswith0(name, "0x")) {
- bstr rest;
- unsigned int fmt = bstrtoll(name, &rest, 16);
- if (rest.len == 0)
- return fmt;
- }
for(struct mp_imgfmt_entry *p = mp_imgfmt_list; p->name; ++p) {
if(!bstrcasecmp0(name, p->name)) {
if (!allow_hwaccel && IMGFMT_IS_HWACCEL(p->fmt))
@@ -241,8 +189,15 @@ static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
desc.num_planes++;
}
- if (desc.bpp[0] <= 8 || !(pd->flags & PIX_FMT_BE))
- desc.flags |= MP_IMGFLAG_NE;
+ // Packed RGB formats are the only formats that have less than 8 bits per
+ // component, and still require endian dependent access.
+ if (pd->comp[0].depth_minus1 + 1 <= 8 &&
+ !(mpfmt >= IMGFMT_RGB12_LE || mpfmt <= IMGFMT_BGR16_BE))
+ {
+ desc.flags |= MP_IMGFLAG_LE | MP_IMGFLAG_BE;
+ } else {
+ desc.flags |= (pd->flags & PIX_FMT_BE) ? MP_IMGFLAG_BE : MP_IMGFLAG_LE;
+ }
desc.plane_bits = planedepth[0];
@@ -297,20 +252,15 @@ static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
// compatibility with old mp_image_setfmt()
switch (desc.id) {
- case IMGFMT_I420:
- case IMGFMT_IYUV:
- desc.flags |= MP_IMGFLAG_SWAPPED; // completely pointless
- break;
case IMGFMT_UYVY:
desc.flags |= MP_IMGFLAG_SWAPPED; // for vf_mpi_clear()
/* fallthrough */
- case IMGFMT_YUY2:
+ case IMGFMT_YUYV:
desc.chroma_ys = 1; // ???
break;
case IMGFMT_Y8:
- case IMGFMT_Y800:
- case IMGFMT_Y16LE:
- case IMGFMT_Y16BE:
+ case IMGFMT_Y16_LE:
+ case IMGFMT_Y16_BE:
// probably for vo_opengl, and possibly more code using Y8
desc.chroma_xs = desc.chroma_ys = 31;
break;
@@ -324,7 +274,6 @@ static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
break;
case IMGFMT_RGB4:
case IMGFMT_BGR4:
- case IMGFMT_BGR1:
desc.flags ^= MP_IMGFLAG_SWAPPED; // ???
break;
case IMGFMT_BGR0:
@@ -335,6 +284,12 @@ static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
if (pd->flags & PIX_FMT_HWACCEL)
desc.chroma_xs = desc.chroma_ys = 0;
+ if (!(pd->flags & PIX_FMT_HWACCEL) && !(pd->flags & PIX_FMT_BITSTREAM)) {
+ desc.flags |= MP_IMGFLAG_BYTE_ALIGNED;
+ for (int p = 0; p < desc.num_planes; p++)
+ desc.bytes[p] = desc.bpp[p] / 8;
+ }
+
for (int p = 0; p < desc.num_planes; p++) {
desc.xs[p] = (p == 1 || p == 2) ? desc.chroma_xs : 0;
desc.ys[p] = (p == 1 || p == 2) ? desc.chroma_ys : 0;