diff --git a/sys/nvcodec/gstnvbaseenc.c b/sys/nvcodec/gstnvbaseenc.c index 167afee8c2..c5d573bd5f 100644 --- a/sys/nvcodec/gstnvbaseenc.c +++ b/sys/nvcodec/gstnvbaseenc.c @@ -511,6 +511,8 @@ gst_nv_base_enc_set_filtered_input_formats (GstNvBaseEnc * nvenc, case GST_VIDEO_FORMAT_P010_10BE: case GST_VIDEO_FORMAT_BGR10A2_LE: case GST_VIDEO_FORMAT_RGB10A2_LE: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_Y444_16BE: if (max_bit_minus8 >= 2) { gst_value_list_append_value (&supported_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_BGR10A2_LE: case GST_VIDEO_FORMAT_RGB10A2_LE: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_Y444_16BE: return cuda_stride; case GST_VIDEO_FORMAT_I420: 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; 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_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1); dest = (guint8 *) in_buf_lock.bufferDataPtr + diff --git a/sys/nvcodec/gstnvenc.c b/sys/nvcodec/gstnvenc.c index 32d4b65a7f..98c19c057e 100644 --- a/sys/nvcodec/gstnvenc.c +++ b/sys/nvcodec/gstnvenc.c @@ -279,6 +279,9 @@ gst_nvenc_get_nv_buffer_format (GstVideoFormat fmt) return NV_ENC_BUFFER_FORMAT_ARGB10; case GST_VIDEO_FORMAT_RGB10A2_LE: 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: break; } @@ -341,9 +344,13 @@ gst_nv_enc_get_supported_input_formats (gpointer encoder, GUID codec_id, FALSE}, {GST_VIDEO_FORMAT_RGB10A2_LE, NV_ENC_BUFFER_FORMAT_ABGR10, TRUE, FALSE}, + {GST_VIDEO_FORMAT_Y444_16LE, NV_ENC_BUFFER_FORMAT_YUV444_10BIT, TRUE, + FALSE}, #else {GST_VIDEO_FORMAT_P010_10BE, NV_ENC_BUFFER_FORMAT_YUV420_10BIT, TRUE, FALSE}, + {GST_VIDEO_FORMAT_Y444_16BE, NV_ENC_BUFFER_FORMAT_YUV444_10BIT, TRUE, + FALSE}, /* FIXME: No 10bits big-endian ARGB10 format is defined */ #endif }; @@ -392,6 +399,12 @@ gst_nv_enc_get_supported_input_formats (gpointer encoder, GUID codec_id, num_format++; } 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 case NV_ENC_BUFFER_FORMAT_ARGB10: case NV_ENC_BUFFER_FORMAT_ABGR10: diff --git a/sys/nvcodec/gstnvh265enc.c b/sys/nvcodec/gstnvh265enc.c index 842b95cf8b..8a7a6b2ac1 100644 --- a/sys/nvcodec/gstnvh265enc.c +++ b/sys/nvcodec/gstnvh265enc.c @@ -261,10 +261,15 @@ gst_nv_h265_enc_set_encoder_config (GstNvBaseEnc * nvenc, hevc_config->idrPeriod = config->gopLength; 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"); config->profileGUID = NV_ENC_HEVC_PROFILE_FREXT_GUID; 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 } else if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_P010_10LE) { #else