diff --git a/sys/nvcodec/gstnvbaseenc.c b/sys/nvcodec/gstnvbaseenc.c index e99f922908..38e31115e2 100644 --- a/sys/nvcodec/gstnvbaseenc.c +++ b/sys/nvcodec/gstnvbaseenc.c @@ -901,14 +901,8 @@ gst_nv_base_enc_free_buffers (GstNvBaseEnc * nvenc) static inline guint _get_plane_width (GstVideoInfo * info, guint plane) { - if (GST_VIDEO_INFO_IS_YUV (info)) - /* For now component width and plane width are the same and the - * plane-component mapping matches - */ - return GST_VIDEO_INFO_COMP_WIDTH (info, plane) - * GST_VIDEO_INFO_COMP_PSTRIDE (info, plane); - else /* RGB, GRAY */ - return GST_VIDEO_INFO_WIDTH (info); + return GST_VIDEO_INFO_COMP_WIDTH (info, plane) + * GST_VIDEO_INFO_COMP_PSTRIDE (info, plane); } static inline guint @@ -1329,6 +1323,10 @@ _get_cuda_device_stride (GstVideoInfo * info, guint plane, gsize cuda_stride) case GST_VIDEO_FORMAT_P010_10LE: case GST_VIDEO_FORMAT_P010_10BE: case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGR10A2_LE: + case GST_VIDEO_FORMAT_RGB10A2_LE: return cuda_stride; case GST_VIDEO_FORMAT_I420: return plane == 0 ? cuda_stride : (GST_ROUND_UP_2 (cuda_stride) / 2); @@ -1744,6 +1742,8 @@ gst_nv_base_enc_handle_frame (GstVideoEncoder * enc, GstVideoCodecFrame * frame) dest += dest_stride; src += src_stride; } + } else if (GST_VIDEO_INFO_IS_RGB (info)) { + /* nothing to do */ } else { // FIXME: this only works for NV12 and I420 g_assert_not_reached (); diff --git a/sys/nvcodec/gstnvenc.c b/sys/nvcodec/gstnvenc.c index 141e32d43d..c1464af2bd 100644 --- a/sys/nvcodec/gstnvenc.c +++ b/sys/nvcodec/gstnvenc.c @@ -271,6 +271,14 @@ gst_nvenc_get_nv_buffer_format (GstVideoFormat fmt) case GST_VIDEO_FORMAT_P010_10LE: case GST_VIDEO_FORMAT_P010_10BE: return NV_ENC_BUFFER_FORMAT_YUV420_10BIT; + case GST_VIDEO_FORMAT_BGRA: + return NV_ENC_BUFFER_FORMAT_ARGB; + case GST_VIDEO_FORMAT_RGBA: + return NV_ENC_BUFFER_FORMAT_ABGR; + case GST_VIDEO_FORMAT_BGR10A2_LE: + return NV_ENC_BUFFER_FORMAT_ARGB10; + case GST_VIDEO_FORMAT_RGB10A2_LE: + return NV_ENC_BUFFER_FORMAT_ABGR10; default: break; } @@ -395,13 +403,20 @@ gst_nv_enc_get_supported_input_formats (gpointer encoder, GUID codec_id, {GST_VIDEO_FORMAT_NV12, NV_ENC_BUFFER_FORMAT_NV12, FALSE, FALSE}, {GST_VIDEO_FORMAT_YV12, NV_ENC_BUFFER_FORMAT_YV12, FALSE, FALSE}, {GST_VIDEO_FORMAT_I420, NV_ENC_BUFFER_FORMAT_IYUV, FALSE, FALSE}, + {GST_VIDEO_FORMAT_BGRA, NV_ENC_BUFFER_FORMAT_ARGB, FALSE, FALSE}, + {GST_VIDEO_FORMAT_RGBA, NV_ENC_BUFFER_FORMAT_ABGR, FALSE, FALSE}, {GST_VIDEO_FORMAT_Y444, NV_ENC_BUFFER_FORMAT_YUV444, FALSE, FALSE}, #if G_BYTE_ORDER == G_LITTLE_ENDIAN {GST_VIDEO_FORMAT_P010_10LE, NV_ENC_BUFFER_FORMAT_YUV420_10BIT, TRUE, FALSE}, + {GST_VIDEO_FORMAT_BGR10A2_LE, NV_ENC_BUFFER_FORMAT_ARGB10, TRUE, + FALSE}, + {GST_VIDEO_FORMAT_RGB10A2_LE, NV_ENC_BUFFER_FORMAT_ABGR10, TRUE, + FALSE}, #else {GST_VIDEO_FORMAT_P010_10BE, NV_ENC_BUFFER_FORMAT_YUV420_10BIT, TRUE, FALSE}, + /* FIXME: No 10bits big-endian ARGB10 format is defined */ #endif }; @@ -428,35 +443,36 @@ gst_nv_enc_get_supported_input_formats (gpointer encoder, GUID codec_id, GST_INFO ("input format: 0x%08x", format_list[i]); switch (format_list[i]) { case NV_ENC_BUFFER_FORMAT_NV12: - if (!format_map[0].supported) { - format_map[0].supported = TRUE; - num_format++; - } - break; case NV_ENC_BUFFER_FORMAT_YV12: - if (!format_map[1].supported) { - format_map[0].supported = TRUE; - num_format++; - } - break; case NV_ENC_BUFFER_FORMAT_IYUV: - if (!format_map[2].supported) { - format_map[2].supported = TRUE; + case NV_ENC_BUFFER_FORMAT_ARGB: + case NV_ENC_BUFFER_FORMAT_ABGR: + if (!format_map[i].supported) { + format_map[i].supported = TRUE; num_format++; } break; case NV_ENC_BUFFER_FORMAT_YUV444: - if (support_yuv444 && !format_map[3].supported) { - format_map[3].supported = TRUE; + if (support_yuv444 && !format_map[i].supported) { + format_map[i].supported = TRUE; num_format++; } break; case NV_ENC_BUFFER_FORMAT_YUV420_10BIT: - if (support_yuv444 && support_10bit && !format_map[4].supported) { - format_map[4].supported = TRUE; + 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: + if (support_10bit && !format_map[i].supported) { + format_map[i].supported = TRUE; + num_format++; + } + break; +#endif default: GST_FIXME ("unmapped input format: 0x%08x", format_list[i]); break;