libs: dec: h265: support decode for main-10-422 10bit streams.

Add 422 10bit yuv format Y210, which can be used to decode
main-10-422 10bit streams. Currently, this feature is only
supported by media-driver in Icelake.

https://bugzilla.gnome.org/show_bug.cgi?id=797264
This commit is contained in:
Wangfei 2018-10-24 14:18:37 -04:00 committed by Víctor Manuel Jáquez Leal
parent d8442e479e
commit 638004875b
7 changed files with 23 additions and 4 deletions

View file

@ -91,6 +91,7 @@ vaapi_image_is_linear (const VAImage * va_image)
case VA_FOURCC ('R', 'G', 'B', 'X'):
case VA_FOURCC ('X', 'B', 'G', 'R'):
case VA_FOURCC ('B', 'G', 'R', 'X'):
case VA_FOURCC ('Y', '2', '1', '0'):
data_size = 4 * width * height;
break;
case VA_FOURCC ('P', '0', '1', '0'):

View file

@ -66,6 +66,7 @@ G_BEGIN_DECLS
* @GST_VAAPI_CHROMA_TYPE_RGB32: 32-bit RGB chroma format
* @GST_VAAPI_CHROMA_TYPE_RGB16: 16-bit RGB chroma format
* @GST_VAAPI_CHROMA_TYPE_YUV420_10BPP: YUV 4:2:0 chroma format, more than 8 bits per channel
* @GST_VAAPI_CHROMA_TYPE_YUV422_10BPP: YUV 4:2:2 chroma format, more than 8 bits per channel
*
* The set of all chroma types for #GstVaapiSurface.
*/
@ -79,7 +80,8 @@ typedef enum
GST_VAAPI_CHROMA_TYPE_YUV400,
GST_VAAPI_CHROMA_TYPE_RGB32,
GST_VAAPI_CHROMA_TYPE_RGB16,
GST_VAAPI_CHROMA_TYPE_YUV420_10BPP
GST_VAAPI_CHROMA_TYPE_YUV420_10BPP,
GST_VAAPI_CHROMA_TYPE_YUV422_10BPP,
} GstVaapiChromaType;
/**

View file

@ -406,6 +406,11 @@ to_GstVaapiChromaType (guint va_rt_format)
case VA_RT_FORMAT_YUV420_10BPP:
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420_10BPP;
break;
#endif
#if VA_CHECK_VERSION(1,2,0)
case VA_RT_FORMAT_YUV422_10:
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422_10BPP;
break;
#endif
default:
chroma_type = 0;
@ -454,6 +459,11 @@ from_GstVaapiChromaType (guint chroma_type)
case GST_VAAPI_CHROMA_TYPE_YUV420_10BPP:
format = VA_RT_FORMAT_YUV420_10BPP;
break;
#endif
#if VA_CHECK_VERSION(1,2,0)
case GST_VAAPI_CHROMA_TYPE_YUV422_10BPP:
format = VA_RT_FORMAT_YUV422_10;
break;
#endif
default:
format = 0;

View file

@ -317,7 +317,10 @@ gst_vaapi_utils_h265_get_chroma_type (guint chroma_format_idc,
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420_10BPP;
break;
case 2:
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422;
if (luma_bit_depth == 8)
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422;
else if (luma_bit_depth > 8)
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422_10BPP;
break;
case 3:
chroma_type = GST_VAAPI_CHROMA_TYPE_YUV444;

View file

@ -57,6 +57,7 @@ static const GstVideoFormatMap gst_vaapi_video_formats[] = {
DEF_YUV (I420, ('I', '4', '2', '0'), LSB, 12, 420),
DEF_YUV (YUY2, ('Y', 'U', 'Y', '2'), LSB, 16, 422),
DEF_YUV (UYVY, ('U', 'Y', 'V', 'Y'), LSB, 16, 422),
DEF_YUV (Y210, ('Y', '2', '1', '0'), LSB, 32, 422_10BPP),
DEF_YUV (AYUV, ('A', 'Y', 'U', 'V'), LSB, 32, 444),
#if G_BYTE_ORDER == G_BIG_ENDIAN
DEF_RGB (ARGB, ('A', 'R', 'G', 'B'), MSB, 32,
@ -298,6 +299,8 @@ gst_vaapi_video_format_from_chroma (guint chroma_type)
return GST_VIDEO_FORMAT_P010_10LE;
case GST_VAAPI_CHROMA_TYPE_YUV444:
return GST_VIDEO_FORMAT_AYUV;
case GST_VAAPI_CHROMA_TYPE_YUV422_10BPP:
return GST_VIDEO_FORMAT_Y210;
default:
return GST_VIDEO_FORMAT_UNKNOWN;
}

View file

@ -87,7 +87,7 @@ static const char gst_vaapidecode_src_caps_str[] =
#if (USE_GLX || USE_EGL)
GST_VAAPI_MAKE_GLTEXUPLOAD_CAPS ";"
#endif
GST_VIDEO_CAPS_MAKE("{ NV12, I420, YV12, YUY2, UYVY, P010_10LE }") ";"
GST_VIDEO_CAPS_MAKE("{ NV12, I420, YV12, YUY2, UYVY, Y210, P010_10LE }") ";"
GST_VAAPI_MAKE_DMABUF_CAPS;
static GstStaticPadTemplate gst_vaapidecode_src_factory =

View file

@ -105,7 +105,7 @@ gst_vaapi_caps_feature_contains (const GstCaps * caps,
#define GST_VAAPI_MAKE_SURFACE_CAPS \
GST_VIDEO_CAPS_MAKE_WITH_FEATURES( \
GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, "{ ENCODED, NV12, I420, YV12, YUY2, UYVY, P010_10LE }")
GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, "{ ENCODED, NV12, I420, YV12, YUY2, UYVY, Y210, P010_10LE }")
#define GST_VAAPI_MAKE_GLTEXUPLOAD_CAPS \
GST_VIDEO_CAPS_MAKE_WITH_FEATURES( \