nvh265enc: Add support YUV 444 10bits encoding
Note that h264 encoder does not support the YUV 444 10bits format
This commit is contained in:
parent
fa5e6f546b
commit
f3e12a0b56
@ -511,6 +511,8 @@ gst_nv_base_enc_set_filtered_input_formats (GstNvBaseEnc * nvenc,
|
|||||||
case GST_VIDEO_FORMAT_P010_10BE:
|
case GST_VIDEO_FORMAT_P010_10BE:
|
||||||
case GST_VIDEO_FORMAT_BGR10A2_LE:
|
case GST_VIDEO_FORMAT_BGR10A2_LE:
|
||||||
case GST_VIDEO_FORMAT_RGB10A2_LE:
|
case GST_VIDEO_FORMAT_RGB10A2_LE:
|
||||||
|
case GST_VIDEO_FORMAT_Y444_16LE:
|
||||||
|
case GST_VIDEO_FORMAT_Y444_16BE:
|
||||||
if (max_bit_minus8 >= 2) {
|
if (max_bit_minus8 >= 2) {
|
||||||
gst_value_list_append_value (&supported_format, val);
|
gst_value_list_append_value (&supported_format, val);
|
||||||
last_format = val;
|
last_format = val;
|
||||||
@ -1474,6 +1476,8 @@ _get_cuda_device_stride (GstVideoInfo * info, guint plane, gsize cuda_stride)
|
|||||||
case GST_VIDEO_FORMAT_RGBA:
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
case GST_VIDEO_FORMAT_BGR10A2_LE:
|
case GST_VIDEO_FORMAT_BGR10A2_LE:
|
||||||
case GST_VIDEO_FORMAT_RGB10A2_LE:
|
case GST_VIDEO_FORMAT_RGB10A2_LE:
|
||||||
|
case GST_VIDEO_FORMAT_Y444_16LE:
|
||||||
|
case GST_VIDEO_FORMAT_Y444_16BE:
|
||||||
return cuda_stride;
|
return cuda_stride;
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
return plane == 0 ? cuda_stride : (GST_ROUND_UP_2 (cuda_stride) / 2);
|
return plane == 0 ? cuda_stride : (GST_ROUND_UP_2 (cuda_stride) / 2);
|
||||||
@ -1866,7 +1870,9 @@ gst_nv_base_enc_handle_frame (GstVideoEncoder * enc, GstVideoCodecFrame * frame)
|
|||||||
dest += dest_stride;
|
dest += dest_stride;
|
||||||
src += src_stride;
|
src += src_stride;
|
||||||
}
|
}
|
||||||
} else if (GST_VIDEO_FRAME_FORMAT (&vframe) == GST_VIDEO_FORMAT_Y444) {
|
} else if (GST_VIDEO_FRAME_FORMAT (&vframe) == GST_VIDEO_FORMAT_Y444 ||
|
||||||
|
GST_VIDEO_FRAME_FORMAT (&vframe) == GST_VIDEO_FORMAT_Y444_16LE ||
|
||||||
|
GST_VIDEO_FRAME_FORMAT (&vframe) == GST_VIDEO_FORMAT_Y444_16BE) {
|
||||||
src = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1);
|
src = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1);
|
||||||
src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
|
src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
|
||||||
dest = (guint8 *) in_buf_lock.bufferDataPtr +
|
dest = (guint8 *) in_buf_lock.bufferDataPtr +
|
||||||
|
@ -279,6 +279,9 @@ gst_nvenc_get_nv_buffer_format (GstVideoFormat fmt)
|
|||||||
return NV_ENC_BUFFER_FORMAT_ARGB10;
|
return NV_ENC_BUFFER_FORMAT_ARGB10;
|
||||||
case GST_VIDEO_FORMAT_RGB10A2_LE:
|
case GST_VIDEO_FORMAT_RGB10A2_LE:
|
||||||
return NV_ENC_BUFFER_FORMAT_ABGR10;
|
return NV_ENC_BUFFER_FORMAT_ABGR10;
|
||||||
|
case GST_VIDEO_FORMAT_Y444_16LE:
|
||||||
|
case GST_VIDEO_FORMAT_Y444_16BE:
|
||||||
|
return NV_ENC_BUFFER_FORMAT_YUV444_10BIT;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -341,9 +344,13 @@ gst_nv_enc_get_supported_input_formats (gpointer encoder, GUID codec_id,
|
|||||||
FALSE},
|
FALSE},
|
||||||
{GST_VIDEO_FORMAT_RGB10A2_LE, NV_ENC_BUFFER_FORMAT_ABGR10, TRUE,
|
{GST_VIDEO_FORMAT_RGB10A2_LE, NV_ENC_BUFFER_FORMAT_ABGR10, TRUE,
|
||||||
FALSE},
|
FALSE},
|
||||||
|
{GST_VIDEO_FORMAT_Y444_16LE, NV_ENC_BUFFER_FORMAT_YUV444_10BIT, TRUE,
|
||||||
|
FALSE},
|
||||||
#else
|
#else
|
||||||
{GST_VIDEO_FORMAT_P010_10BE, NV_ENC_BUFFER_FORMAT_YUV420_10BIT, TRUE,
|
{GST_VIDEO_FORMAT_P010_10BE, NV_ENC_BUFFER_FORMAT_YUV420_10BIT, TRUE,
|
||||||
FALSE},
|
FALSE},
|
||||||
|
{GST_VIDEO_FORMAT_Y444_16BE, NV_ENC_BUFFER_FORMAT_YUV444_10BIT, TRUE,
|
||||||
|
FALSE},
|
||||||
/* FIXME: No 10bits big-endian ARGB10 format is defined */
|
/* FIXME: No 10bits big-endian ARGB10 format is defined */
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@ -392,6 +399,12 @@ gst_nv_enc_get_supported_input_formats (gpointer encoder, GUID codec_id,
|
|||||||
num_format++;
|
num_format++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case NV_ENC_BUFFER_FORMAT_YUV444_10BIT:
|
||||||
|
if (support_yuv444 && support_10bit && !format_map[i].supported) {
|
||||||
|
format_map[i].supported = TRUE;
|
||||||
|
num_format++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||||
case NV_ENC_BUFFER_FORMAT_ARGB10:
|
case NV_ENC_BUFFER_FORMAT_ARGB10:
|
||||||
case NV_ENC_BUFFER_FORMAT_ABGR10:
|
case NV_ENC_BUFFER_FORMAT_ABGR10:
|
||||||
|
@ -261,10 +261,15 @@ gst_nv_h265_enc_set_encoder_config (GstNvBaseEnc * nvenc,
|
|||||||
hevc_config->idrPeriod = config->gopLength;
|
hevc_config->idrPeriod = config->gopLength;
|
||||||
|
|
||||||
config->encodeCodecConfig.hevcConfig.chromaFormatIDC = 1;
|
config->encodeCodecConfig.hevcConfig.chromaFormatIDC = 1;
|
||||||
if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444) {
|
if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444 ||
|
||||||
|
GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444_16LE ||
|
||||||
|
GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444_16BE) {
|
||||||
GST_DEBUG_OBJECT (h265enc, "have Y444 input, setting config accordingly");
|
GST_DEBUG_OBJECT (h265enc, "have Y444 input, setting config accordingly");
|
||||||
config->profileGUID = NV_ENC_HEVC_PROFILE_FREXT_GUID;
|
config->profileGUID = NV_ENC_HEVC_PROFILE_FREXT_GUID;
|
||||||
config->encodeCodecConfig.hevcConfig.chromaFormatIDC = 3;
|
config->encodeCodecConfig.hevcConfig.chromaFormatIDC = 3;
|
||||||
|
if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444_16LE ||
|
||||||
|
GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444_16BE)
|
||||||
|
config->encodeCodecConfig.hevcConfig.pixelBitDepthMinus8 = 2;
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||||
} else if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_P010_10LE) {
|
} else if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_P010_10LE) {
|
||||||
#else
|
#else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user