From aa1168e740cb2c87c0c227f8275d1015d35a877a Mon Sep 17 00:00:00 2001 From: Hitesh Kumar Saini Date: Wed, 23 Aug 2023 22:58:24 +0530 Subject: [PATCH 1/2] fix: VP9 HWAccel https://trac.ffmpeg.org/ticket/9599 --- patches/ffmpeg-fix-vp9-hwaccel.patch | 60 ++++++++++++++++++++++++++++ scripts/ffmpeg/build.sh | 1 + 2 files changed, 61 insertions(+) create mode 100644 patches/ffmpeg-fix-vp9-hwaccel.patch diff --git a/patches/ffmpeg-fix-vp9-hwaccel.patch b/patches/ffmpeg-fix-vp9-hwaccel.patch new file mode 100644 index 0000000..012f23c --- /dev/null +++ b/patches/ffmpeg-fix-vp9-hwaccel.patch @@ -0,0 +1,60 @@ +diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c +old mode 100644 +new mode 100755 +index 8775d15a4f..3154385331 +--- a/libavcodec/allcodecs.c ++++ b/libavcodec/allcodecs.c +@@ -893,6 +893,7 @@ extern const FFCodec ff_vp9_mediacodec_decoder; + extern const FFCodec ff_vp9_mediacodec_encoder; + extern const FFCodec ff_vp9_qsv_decoder; + extern const FFCodec ff_vp9_vaapi_encoder; ++extern const FFCodec ff_vp9_videotoolbox_decoder; + extern const FFCodec ff_vp9_qsv_encoder; + + // null codecs +diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c +old mode 100644 +new mode 100755 +index 89f7549ef0..cc873b7620 +--- a/libavcodec/vp9.c ++++ b/libavcodec/vp9.c +@@ -1917,9 +1917,38 @@ const FFCodec ff_vp9_decoder = { + #if CONFIG_VP9_VDPAU_HWACCEL + HWACCEL_VDPAU(vp9), + #endif ++ NULL ++ }, ++}; ++ ++const FFCodec ff_vp9_videotoolbox_decoder = { ++ .p.name = "vp9_videotoolbox", ++ CODEC_LONG_NAME("VideoToolbox Google VP9"), ++ .p.type = AVMEDIA_TYPE_VIDEO, ++ .p.id = AV_CODEC_ID_VP9, ++ .priv_data_size = sizeof(VP9Context), ++ .init = vp9_decode_init, ++ .close = vp9_decode_free, ++ FF_CODEC_DECODE_CB(vp9_decode_frame), ++ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, ++ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | ++ FF_CODEC_CAP_SLICE_THREAD_HAS_MF | ++ FF_CODEC_CAP_ALLOCATE_PROGRESS, ++ .flush = vp9_decode_flush, ++ UPDATE_THREAD_CONTEXT(vp9_decode_update_thread_context), ++ .p.profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), ++#if ARCH_X86_64 ++ /* Video Toolbox requires VP9 invisible (alt-ref) frames be merged into VP9 superframes when running on Intel ++ * based Macs. Violation of this requirement will cause Video Toolbox to hang due to defective error handing ++ * in VTDecompressionSessionDecodeFrame. See FFmpeg ticket #9599. */ ++ .bsfs = "vp9_superframe", ++#else ++ .bsfs = "vp9_superframe_split", ++#endif ++ .hw_configs = (const AVCodecHWConfigInternal *const []) { + #if CONFIG_VP9_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(vp9), + #endif + NULL +- }, ++ }, + }; diff --git a/scripts/ffmpeg/build.sh b/scripts/ffmpeg/build.sh index 4bb571c..1722522 100644 --- a/scripts/ffmpeg/build.sh +++ b/scripts/ffmpeg/build.sh @@ -5,6 +5,7 @@ set -u # treat unset variables as an error cd ${SRC_DIR} +patch -p1 <${PROJECT_DIR}/patches/ffmpeg-fix-vp9-hwaccel.patch patch -p1 <${PROJECT_DIR}/patches/ffmpeg-fix-ios-hdr-texture.patch patch -p1 <${PROJECT_DIR}/patches/ffmpeg-fix-dash-base-url-escape.patch From 1a0593b91a1bb984414107786bc9ed7921d9ee4c Mon Sep 17 00:00:00 2001 From: birros Date: Wed, 23 Aug 2023 22:02:25 +0200 Subject: [PATCH 2/2] fix(ffmpeg): fix vp9 patch --- patches/ffmpeg-fix-vp9-hwaccel.patch | 112 +++++++++++++-------------- 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/patches/ffmpeg-fix-vp9-hwaccel.patch b/patches/ffmpeg-fix-vp9-hwaccel.patch index 012f23c..97a132b 100644 --- a/patches/ffmpeg-fix-vp9-hwaccel.patch +++ b/patches/ffmpeg-fix-vp9-hwaccel.patch @@ -1,60 +1,52 @@ -diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c -old mode 100644 -new mode 100755 -index 8775d15a4f..3154385331 ---- a/libavcodec/allcodecs.c -+++ b/libavcodec/allcodecs.c -@@ -893,6 +893,7 @@ extern const FFCodec ff_vp9_mediacodec_decoder; - extern const FFCodec ff_vp9_mediacodec_encoder; - extern const FFCodec ff_vp9_qsv_decoder; - extern const FFCodec ff_vp9_vaapi_encoder; -+extern const FFCodec ff_vp9_videotoolbox_decoder; - extern const FFCodec ff_vp9_qsv_encoder; - - // null codecs -diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c -old mode 100644 -new mode 100755 -index 89f7549ef0..cc873b7620 ---- a/libavcodec/vp9.c -+++ b/libavcodec/vp9.c -@@ -1917,9 +1917,38 @@ const FFCodec ff_vp9_decoder = { - #if CONFIG_VP9_VDPAU_HWACCEL - HWACCEL_VDPAU(vp9), - #endif -+ NULL -+ }, -+}; -+ -+const FFCodec ff_vp9_videotoolbox_decoder = { -+ .p.name = "vp9_videotoolbox", -+ CODEC_LONG_NAME("VideoToolbox Google VP9"), -+ .p.type = AVMEDIA_TYPE_VIDEO, -+ .p.id = AV_CODEC_ID_VP9, -+ .priv_data_size = sizeof(VP9Context), -+ .init = vp9_decode_init, -+ .close = vp9_decode_free, -+ FF_CODEC_DECODE_CB(vp9_decode_frame), -+ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, -+ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | -+ FF_CODEC_CAP_SLICE_THREAD_HAS_MF | -+ FF_CODEC_CAP_ALLOCATE_PROGRESS, -+ .flush = vp9_decode_flush, -+ UPDATE_THREAD_CONTEXT(vp9_decode_update_thread_context), -+ .p.profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), -+#if ARCH_X86_64 -+ /* Video Toolbox requires VP9 invisible (alt-ref) frames be merged into VP9 superframes when running on Intel -+ * based Macs. Violation of this requirement will cause Video Toolbox to hang due to defective error handing -+ * in VTDecompressionSessionDecodeFrame. See FFmpeg ticket #9599. */ -+ .bsfs = "vp9_superframe", -+#else -+ .bsfs = "vp9_superframe_split", -+#endif -+ .hw_configs = (const AVCodecHWConfigInternal *const []) { - #if CONFIG_VP9_VIDEOTOOLBOX_HWACCEL - HWACCEL_VIDEOTOOLBOX(vp9), - #endif - NULL -- }, -+ }, - }; +diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c +index e593ad1..f074ac8 100644 +--- a/libavcodec/allcodecs.c ++++ b/libavcodec/allcodecs.c +@@ -884,6 +884,7 @@ extern const FFCodec ff_vp9_cuvid_decoder; + extern const FFCodec ff_vp9_mediacodec_decoder; + extern const FFCodec ff_vp9_qsv_decoder; + extern const FFCodec ff_vp9_vaapi_encoder; ++extern const FFCodec ff_vp9_videotoolbox_decoder; + extern const FFCodec ff_vp9_qsv_encoder; + + // null codecs +diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c +index 7c0a246..2abd3d3 100644 +--- a/libavcodec/vp9.c ++++ b/libavcodec/vp9.c +@@ -1906,6 +1906,35 @@ const FFCodec ff_vp9_decoder = { + #if CONFIG_VP9_VDPAU_HWACCEL + HWACCEL_VDPAU(vp9), + #endif ++ NULL ++ }, ++}; ++ ++const FFCodec ff_vp9_videotoolbox_decoder = { ++ .p.name = "vp9_videotoolbox", ++ CODEC_LONG_NAME("VideoToolbox Google VP9"), ++ .p.type = AVMEDIA_TYPE_VIDEO, ++ .p.id = AV_CODEC_ID_VP9, ++ .priv_data_size = sizeof(VP9Context), ++ .init = vp9_decode_init, ++ .close = vp9_decode_free, ++ FF_CODEC_DECODE_CB(vp9_decode_frame), ++ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, ++ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | ++ FF_CODEC_CAP_SLICE_THREAD_HAS_MF | ++ FF_CODEC_CAP_ALLOCATE_PROGRESS, ++ .flush = vp9_decode_flush, ++ UPDATE_THREAD_CONTEXT(vp9_decode_update_thread_context), ++ .p.profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), ++#if ARCH_X86_64 ++ /* @low-batt: Video Toolbox requires VP9 invisible (alt-ref) frames be merged into VP9 superframes when running on Intel ++ * based Macs. Violation of this requirement will cause Video Toolbox to hang due to defective error handing ++ * in VTDecompressionSessionDecodeFrame. See FFmpeg ticket #9599. */ ++ .bsfs = "vp9_superframe", ++#else ++ .bsfs = "vp9_superframe_split", ++#endif ++ .hw_configs = (const AVCodecHWConfigInternal *const []) { + #if CONFIG_VP9_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(vp9), + #endif