This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new 7f0b6476b6 avcodec/nvdec: pass hw format explicitly to frame params
7f0b6476b6 is described below
commit 7f0b6476b6ef2d07d163a7d3229f8c9e250112b5
Author: Diego de Souza <[email protected]>
AuthorDate: Thu Jul 16 14:51:12 2026 +0200
Commit: Diego de Souza <[email protected]>
CommitDate: Thu Jul 16 15:02:09 2026 +0200
avcodec/nvdec: pass hw format explicitly to frame params
avcodec_get_hw_frames_parameters() may invoke frame_params from an
application's get_format() callback. ff_get_format() clears the current
hwaccel before calling get_format(), so avctx->hwaccel is NULL at that
point.
The CUARRAY frame-parameter path dereferenced avctx->hwaccel to
distinguish CUDA from CUARRAY, causing callers such as mpv to crash.
Add per-variant callbacks that pass the registered pixel format
explicitly instead.
Fixes issue #23826.
Signed-off-by: Diego de Souza <[email protected]>
---
libavcodec/nvdec.c | 11 +++++++++--
libavcodec/nvdec.h | 1 +
libavcodec/nvdec_av1.c | 22 ++++++++++++++++++----
libavcodec/nvdec_h264.c | 22 ++++++++++++++++++----
libavcodec/nvdec_hevc.c | 23 +++++++++++++++++++----
libavcodec/nvdec_mjpeg.c | 2 +-
libavcodec/nvdec_mpeg12.c | 29 +++++++++++++++++++++++------
libavcodec/nvdec_mpeg4.c | 21 +++++++++++++++++----
libavcodec/nvdec_vc1.c | 29 +++++++++++++++++++++++------
libavcodec/nvdec_vp8.c | 21 +++++++++++++++++----
libavcodec/nvdec_vp9.c | 21 +++++++++++++++++----
11 files changed, 163 insertions(+), 39 deletions(-)
diff --git a/libavcodec/nvdec.c b/libavcodec/nvdec.c
index 278061d572..0065834f06 100644
--- a/libavcodec/nvdec.c
+++ b/libavcodec/nvdec.c
@@ -1082,6 +1082,7 @@ int ff_nvdec_simple_decode_slice(AVCodecContext *avctx,
const uint8_t *buffer,
int ff_nvdec_frame_params(AVCodecContext *avctx,
AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format,
int dpb_size,
int supports_444)
{
@@ -1089,6 +1090,13 @@ int ff_nvdec_frame_params(AVCodecContext *avctx,
const AVPixFmtDescriptor *sw_desc;
int cuvid_codec_type, cuvid_chroma_format, chroma_444;
+ /*
+ * This may be called from get_format() before avctx->hwaccel is set,
+ * so the selected hardware format is passed explicitly by the wrapper.
+ */
+ if (hw_format != AV_PIX_FMT_CUDA && hw_format != AV_PIX_FMT_CUARRAY)
+ return AVERROR_BUG;
+
sw_desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
if (!sw_desc)
return AVERROR_BUG;
@@ -1106,8 +1114,7 @@ int ff_nvdec_frame_params(AVCodecContext *avctx,
}
chroma_444 = supports_444 && cuvid_chroma_format ==
cudaVideoChromaFormat_444;
- frames_ctx->format = (avctx->hwaccel->pix_fmt ==
AV_PIX_FMT_CUARRAY)
- ? AV_PIX_FMT_CUARRAY : AV_PIX_FMT_CUDA;
+ frames_ctx->format = hw_format;
// NVDEC target dimensions must be even-aligned for internal surface
allocation.
// For chroma-subsampled formats (420/422), the output dimensions must
also be
// even. For monochrome/444, keep the original output dimensions and only
diff --git a/libavcodec/nvdec.h b/libavcodec/nvdec.h
index 756192acd2..b63b7f5f3f 100644
--- a/libavcodec/nvdec.h
+++ b/libavcodec/nvdec.h
@@ -88,6 +88,7 @@ int ff_nvdec_simple_decode_slice(AVCodecContext *avctx, const
uint8_t *buffer,
uint32_t size);
int ff_nvdec_frame_params(AVCodecContext *avctx,
AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format,
int dpb_size,
int supports_444);
int ff_nvdec_get_ref_idx(AVFrame *frame);
diff --git a/libavcodec/nvdec_av1.c b/libavcodec/nvdec_av1.c
index 45fc67375e..a3b87fbc56 100644
--- a/libavcodec/nvdec_av1.c
+++ b/libavcodec/nvdec_av1.c
@@ -335,13 +335,21 @@ static int nvdec_av1_decode_slice(AVCodecContext *avctx,
const uint8_t *buffer,
return 0;
}
-static int nvdec_av1_frame_params(AVCodecContext *avctx, AVBufferRef
*hw_frames_ctx)
+static int nvdec_av1_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
/* Maximum of 8 reference frames, but potentially stored twice due to film
grain */
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 8 * 2, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, 8 * 2, 0);
}
#if CONFIG_AV1_NVDEC_HWACCEL
+static int nvdec_av1_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_av1_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+
const FFHWAccel ff_av1_nvdec_hwaccel = {
.p.name = "av1_nvdec",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -350,7 +358,7 @@ const FFHWAccel ff_av1_nvdec_hwaccel = {
.start_frame = nvdec_av1_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = nvdec_av1_decode_slice,
- .frame_params = nvdec_av1_frame_params,
+ .frame_params = nvdec_av1_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -358,6 +366,12 @@ const FFHWAccel ff_av1_nvdec_hwaccel = {
#endif
#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
+static int nvdec_av1_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_av1_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+
const FFHWAccel ff_av1_nvdec_cuarray_hwaccel = {
.p.name = "av1_nvdec_cuarray",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -366,7 +380,7 @@ const FFHWAccel ff_av1_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_av1_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = nvdec_av1_decode_slice,
- .frame_params = nvdec_av1_frame_params,
+ .frame_params = nvdec_av1_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_h264.c b/libavcodec/nvdec_h264.c
index 83ec456e34..41a2eecc26 100644
--- a/libavcodec/nvdec_h264.c
+++ b/libavcodec/nvdec_h264.c
@@ -167,14 +167,22 @@ static int nvdec_h264_decode_slice(AVCodecContext *avctx,
const uint8_t *buffer,
}
static int nvdec_h264_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
const H264Context *h = avctx->priv_data;
const SPS *sps = h->ps.sps;
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->ref_frame_count +
sps->num_reorder_frames, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format,
+ sps->ref_frame_count +
sps->num_reorder_frames, 0);
}
#if CONFIG_H264_NVDEC_HWACCEL
+static int nvdec_h264_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_h264_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+
const FFHWAccel ff_h264_nvdec_hwaccel = {
.p.name = "h264_nvdec",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -183,7 +191,7 @@ const FFHWAccel ff_h264_nvdec_hwaccel = {
.start_frame = nvdec_h264_start_frame,
.end_frame = ff_nvdec_end_frame,
.decode_slice = nvdec_h264_decode_slice,
- .frame_params = nvdec_h264_frame_params,
+ .frame_params = nvdec_h264_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -191,6 +199,12 @@ const FFHWAccel ff_h264_nvdec_hwaccel = {
#endif
#if CONFIG_H264_NVDEC_CUARRAY_HWACCEL
+static int nvdec_h264_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_h264_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+
const FFHWAccel ff_h264_nvdec_cuarray_hwaccel = {
.p.name = "h264_nvdec_cuarray",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -199,7 +213,7 @@ const FFHWAccel ff_h264_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_h264_start_frame,
.end_frame = ff_nvdec_end_frame,
.decode_slice = nvdec_h264_decode_slice,
- .frame_params = nvdec_h264_frame_params,
+ .frame_params = nvdec_h264_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_hevc.c b/libavcodec/nvdec_hevc.c
index 601ace7d29..0d7368f9af 100644
--- a/libavcodec/nvdec_hevc.c
+++ b/libavcodec/nvdec_hevc.c
@@ -301,11 +301,14 @@ static int nvdec_hevc_decode_slice(AVCodecContext *avctx,
const uint8_t *buffer,
}
static int nvdec_hevc_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
const HEVCContext *s = avctx->priv_data;
const HEVCSPS *sps = s->pps->sps;
- return ff_nvdec_frame_params(avctx, hw_frames_ctx,
sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + 1, 1);
+ int dpb_size = sps->temporal_layer[sps->max_sub_layers -
1].max_dec_pic_buffering + 1;
+
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, dpb_size, 1);
}
static int nvdec_hevc_decode_init(AVCodecContext *avctx) {
@@ -324,6 +327,12 @@ static int nvdec_hevc_decode_init(AVCodecContext *avctx) {
}
#if CONFIG_HEVC_NVDEC_HWACCEL
+static int nvdec_hevc_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_hevc_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+
const FFHWAccel ff_hevc_nvdec_hwaccel = {
.p.name = "hevc_nvdec",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -332,7 +341,7 @@ const FFHWAccel ff_hevc_nvdec_hwaccel = {
.start_frame = nvdec_hevc_start_frame,
.end_frame = ff_nvdec_end_frame,
.decode_slice = nvdec_hevc_decode_slice,
- .frame_params = nvdec_hevc_frame_params,
+ .frame_params = nvdec_hevc_cuda_frame_params,
.init = nvdec_hevc_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -340,6 +349,12 @@ const FFHWAccel ff_hevc_nvdec_hwaccel = {
#endif
#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
+static int nvdec_hevc_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_hevc_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+
const FFHWAccel ff_hevc_nvdec_cuarray_hwaccel = {
.p.name = "hevc_nvdec_cuarray",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -348,7 +363,7 @@ const FFHWAccel ff_hevc_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_hevc_start_frame,
.end_frame = ff_nvdec_end_frame,
.decode_slice = nvdec_hevc_decode_slice,
- .frame_params = nvdec_hevc_frame_params,
+ .frame_params = nvdec_hevc_cuarray_frame_params,
.init = nvdec_hevc_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_mjpeg.c b/libavcodec/nvdec_mjpeg.c
index f0c9416397..417b3c5c54 100644
--- a/libavcodec/nvdec_mjpeg.c
+++ b/libavcodec/nvdec_mjpeg.c
@@ -69,7 +69,7 @@ static int nvdec_mjpeg_frame_params(AVCodecContext *avctx,
AVBufferRef *hw_frames_ctx)
{
// Only need storage for the current frame
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 1, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA, 1, 0);
}
const FFHWAccel ff_mjpeg_nvdec_hwaccel = {
diff --git a/libavcodec/nvdec_mpeg12.c b/libavcodec/nvdec_mpeg12.c
index 34524488f1..ca94e3cb31 100644
--- a/libavcodec/nvdec_mpeg12.c
+++ b/libavcodec/nvdec_mpeg12.c
@@ -96,12 +96,21 @@ static int nvdec_mpeg12_start_frame(AVCodecContext *avctx,
}
static int nvdec_mpeg12_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
// Each frame can at most have one P and one B reference
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, 2, 0);
}
+#if CONFIG_MPEG1_NVDEC_HWACCEL || CONFIG_MPEG2_NVDEC_HWACCEL
+static int nvdec_mpeg12_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_mpeg12_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+#endif
+
#if CONFIG_MPEG2_NVDEC_HWACCEL
const FFHWAccel ff_mpeg2_nvdec_hwaccel = {
.p.name = "mpeg2_nvdec",
@@ -111,13 +120,21 @@ const FFHWAccel ff_mpeg2_nvdec_hwaccel = {
.start_frame = nvdec_mpeg12_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_mpeg12_frame_params,
+ .frame_params = nvdec_mpeg12_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
};
#endif
+#if CONFIG_MPEG1_NVDEC_CUARRAY_HWACCEL || CONFIG_MPEG2_NVDEC_CUARRAY_HWACCEL
+static int nvdec_mpeg12_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_mpeg12_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+#endif
+
#if CONFIG_MPEG2_NVDEC_CUARRAY_HWACCEL
const FFHWAccel ff_mpeg2_nvdec_cuarray_hwaccel = {
.p.name = "mpeg2_nvdec_cuarray",
@@ -127,7 +144,7 @@ const FFHWAccel ff_mpeg2_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_mpeg12_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_mpeg12_frame_params,
+ .frame_params = nvdec_mpeg12_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -143,7 +160,7 @@ const FFHWAccel ff_mpeg1_nvdec_hwaccel = {
.start_frame = nvdec_mpeg12_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_mpeg12_frame_params,
+ .frame_params = nvdec_mpeg12_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -159,7 +176,7 @@ const FFHWAccel ff_mpeg1_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_mpeg12_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_mpeg12_frame_params,
+ .frame_params = nvdec_mpeg12_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_mpeg4.c b/libavcodec/nvdec_mpeg4.c
index 7f31edfe35..cda04edfd2 100644
--- a/libavcodec/nvdec_mpeg4.c
+++ b/libavcodec/nvdec_mpeg4.c
@@ -108,13 +108,20 @@ static int nvdec_mpeg4_decode_slice(AVCodecContext
*avctx, const uint8_t *buffer
}
static int nvdec_mpeg4_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
// Each frame can at most have one P and one B reference
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, 2, 0);
}
#if CONFIG_MPEG4_NVDEC_HWACCEL
+static int nvdec_mpeg4_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_mpeg4_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+
const FFHWAccel ff_mpeg4_nvdec_hwaccel = {
.p.name = "mpeg4_nvdec",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -123,7 +130,7 @@ const FFHWAccel ff_mpeg4_nvdec_hwaccel = {
.start_frame = nvdec_mpeg4_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = nvdec_mpeg4_decode_slice,
- .frame_params = nvdec_mpeg4_frame_params,
+ .frame_params = nvdec_mpeg4_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -131,6 +138,12 @@ const FFHWAccel ff_mpeg4_nvdec_hwaccel = {
#endif
#if CONFIG_MPEG4_NVDEC_CUARRAY_HWACCEL
+static int nvdec_mpeg4_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_mpeg4_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+
const FFHWAccel ff_mpeg4_nvdec_cuarray_hwaccel = {
.p.name = "mpeg4_nvdec_cuarray",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -139,7 +152,7 @@ const FFHWAccel ff_mpeg4_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_mpeg4_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = nvdec_mpeg4_decode_slice,
- .frame_params = nvdec_mpeg4_frame_params,
+ .frame_params = nvdec_mpeg4_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_vc1.c b/libavcodec/nvdec_vc1.c
index 05fd63a353..55f3a17191 100644
--- a/libavcodec/nvdec_vc1.c
+++ b/libavcodec/nvdec_vc1.c
@@ -153,12 +153,21 @@ static int nvdec_vc1_decode_slice(AVCodecContext *avctx,
const uint8_t *buffer,
}
static int nvdec_vc1_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
// Each frame can at most have one P and one B reference
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, 2, 0);
}
+#if CONFIG_VC1_NVDEC_HWACCEL || CONFIG_WMV3_NVDEC_HWACCEL
+static int nvdec_vc1_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_vc1_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+#endif
+
#if CONFIG_VC1_NVDEC_HWACCEL
const FFHWAccel ff_vc1_nvdec_hwaccel = {
.p.name = "vc1_nvdec",
@@ -168,13 +177,21 @@ const FFHWAccel ff_vc1_nvdec_hwaccel = {
.start_frame = nvdec_vc1_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = nvdec_vc1_decode_slice,
- .frame_params = nvdec_vc1_frame_params,
+ .frame_params = nvdec_vc1_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
};
#endif
+#if CONFIG_VC1_NVDEC_CUARRAY_HWACCEL || CONFIG_WMV3_NVDEC_CUARRAY_HWACCEL
+static int nvdec_vc1_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_vc1_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+#endif
+
#if CONFIG_VC1_NVDEC_CUARRAY_HWACCEL
const FFHWAccel ff_vc1_nvdec_cuarray_hwaccel = {
.p.name = "vc1_nvdec_cuarray",
@@ -184,7 +201,7 @@ const FFHWAccel ff_vc1_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_vc1_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = nvdec_vc1_decode_slice,
- .frame_params = nvdec_vc1_frame_params,
+ .frame_params = nvdec_vc1_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -200,7 +217,7 @@ const FFHWAccel ff_wmv3_nvdec_hwaccel = {
.start_frame = nvdec_vc1_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_vc1_frame_params,
+ .frame_params = nvdec_vc1_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -216,7 +233,7 @@ const FFHWAccel ff_wmv3_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_vc1_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_vc1_frame_params,
+ .frame_params = nvdec_vc1_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_vp8.c b/libavcodec/nvdec_vp8.c
index 241cced65b..ad9c55b9fc 100644
--- a/libavcodec/nvdec_vp8.c
+++ b/libavcodec/nvdec_vp8.c
@@ -89,13 +89,20 @@ static int nvdec_vp8_start_frame(AVCodecContext *avctx,
}
static int nvdec_vp8_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
// VP8 uses a fixed size pool of 3 possible reference frames
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 3, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, 3, 0);
}
#if CONFIG_VP8_NVDEC_HWACCEL
+static int nvdec_vp8_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_vp8_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+
const FFHWAccel ff_vp8_nvdec_hwaccel = {
.p.name = "vp8_nvdec",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -104,7 +111,7 @@ const FFHWAccel ff_vp8_nvdec_hwaccel = {
.start_frame = nvdec_vp8_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_vp8_frame_params,
+ .frame_params = nvdec_vp8_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -112,6 +119,12 @@ const FFHWAccel ff_vp8_nvdec_hwaccel = {
#endif
#if CONFIG_VP8_NVDEC_CUARRAY_HWACCEL
+static int nvdec_vp8_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_vp8_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+
const FFHWAccel ff_vp8_nvdec_cuarray_hwaccel = {
.p.name = "vp8_nvdec_cuarray",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -120,7 +133,7 @@ const FFHWAccel ff_vp8_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_vp8_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_vp8_frame_params,
+ .frame_params = nvdec_vp8_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
diff --git a/libavcodec/nvdec_vp9.c b/libavcodec/nvdec_vp9.c
index 73eee1c926..cab65b90f8 100644
--- a/libavcodec/nvdec_vp9.c
+++ b/libavcodec/nvdec_vp9.c
@@ -168,13 +168,20 @@ static int nvdec_vp9_start_frame(AVCodecContext *avctx,
}
static int nvdec_vp9_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+ AVBufferRef *hw_frames_ctx,
+ enum AVPixelFormat hw_format)
{
// VP9 uses a fixed size pool of 8 possible reference frames
- return ff_nvdec_frame_params(avctx, hw_frames_ctx, 8, 0);
+ return ff_nvdec_frame_params(avctx, hw_frames_ctx, hw_format, 8, 0);
}
#if CONFIG_VP9_NVDEC_HWACCEL
+static int nvdec_vp9_cuda_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_vp9_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUDA);
+}
+
const FFHWAccel ff_vp9_nvdec_hwaccel = {
.p.name = "vp9_nvdec",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -183,7 +190,7 @@ const FFHWAccel ff_vp9_nvdec_hwaccel = {
.start_frame = nvdec_vp9_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_vp9_frame_params,
+ .frame_params = nvdec_vp9_cuda_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
@@ -191,6 +198,12 @@ const FFHWAccel ff_vp9_nvdec_hwaccel = {
#endif
#if CONFIG_VP9_NVDEC_CUARRAY_HWACCEL
+static int nvdec_vp9_cuarray_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
+{
+ return nvdec_vp9_frame_params(avctx, hw_frames_ctx, AV_PIX_FMT_CUARRAY);
+}
+
const FFHWAccel ff_vp9_nvdec_cuarray_hwaccel = {
.p.name = "vp9_nvdec_cuarray",
.p.type = AVMEDIA_TYPE_VIDEO,
@@ -199,7 +212,7 @@ const FFHWAccel ff_vp9_nvdec_cuarray_hwaccel = {
.start_frame = nvdec_vp9_start_frame,
.end_frame = ff_nvdec_simple_end_frame,
.decode_slice = ff_nvdec_simple_decode_slice,
- .frame_params = nvdec_vp9_frame_params,
+ .frame_params = nvdec_vp9_cuarray_frame_params,
.init = ff_nvdec_decode_init,
.uninit = ff_nvdec_decode_uninit,
.priv_data_size = sizeof(NVDECContext),
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]