Compare commits

...

No commits in common. "factory" and "factory" have entirely different histories.

13 changed files with 1025 additions and 1631 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
.osc

View File

@ -0,0 +1,992 @@
From e06ce6d2b45edac4a2df04f304e18d4727417d24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= <jeebjp@gmail.com>
Date: Wed, 14 Feb 2024 22:40:54 +0200
Subject: [PATCH] {avcodec,tests}: rename the bundled Mesa AV1 vulkan video
headers
This together with adjusting the inclusion define allows for the
build to not fail with latest Vulkan-Headers that contain the
stabilized Vulkan AV1 decoding definitions.
Compilation fails currently as the AV1 header is getting included
via hwcontext_vulkan.h -> <vulkan/vulkan.h> -> vulkan_core.h, which
finally includes vk_video/vulkan_video_codec_av1std.h and the decode
header, leading to the bundled header to never defining anything
due to the inclusion define being the same.
This fix is imperfect, as it leads to additional re-definition
warnings for things such as
VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION. , but it is
not clear how to otherwise have the bundled version trump the
actually standardized one for a short-term compilation fix.
---
libavcodec/Makefile | 4 +-
libavcodec/vulkan_video.h | 4 +-
libavcodec/vulkan_video_codec_av1std.h | 403 ------------------
libavcodec/vulkan_video_codec_av1std_decode.h | 36 --
.../vulkan_video_codec_av1std_decode_mesa.h | 36 ++
libavcodec/vulkan_video_codec_av1std_mesa.h | 403 ++++++++++++++++++
tests/ref/fate/source | 4 +-
7 files changed, 445 insertions(+), 445 deletions(-)
delete mode 100644 libavcodec/vulkan_video_codec_av1std.h
delete mode 100644 libavcodec/vulkan_video_codec_av1std_decode.h
create mode 100644 libavcodec/vulkan_video_codec_av1std_decode_mesa.h
create mode 100644 libavcodec/vulkan_video_codec_av1std_mesa.h
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 470d7cb9b1..09ae5270b3 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1262,7 +1262,7 @@ SKIPHEADERS += %_tablegen.h \
aacenc_quantization.h \
aacenc_quantization_misc.h \
bitstream_template.h \
- vulkan_video_codec_av1std.h \
+ vulkan_video_codec_av1std_mesa.h \
$(ARCH)/vpx_arith.h \
SKIPHEADERS-$(CONFIG_AMF) += amfenc.h
@@ -1285,7 +1285,7 @@ SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_decode.h vaapi_hevc.h vaapi_encode.h
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vt_internal.h
-SKIPHEADERS-$(CONFIG_VULKAN) += vulkan.h vulkan_video.h vulkan_decode.h vulkan_video_codec_av1std_decode.h
+SKIPHEADERS-$(CONFIG_VULKAN) += vulkan.h vulkan_video.h vulkan_decode.h vulkan_video_codec_av1std_decode_mesa.h
SKIPHEADERS-$(CONFIG_V4L2_M2M) += v4l2_buffers.h v4l2_context.h v4l2_m2m.h
SKIPHEADERS-$(CONFIG_ZLIB) += zlib_wrapper.h
diff --git a/libavcodec/vulkan_video.h b/libavcodec/vulkan_video.h
index b28e3fe0bd..51f44dd543 100644
--- a/libavcodec/vulkan_video.h
+++ b/libavcodec/vulkan_video.h
@@ -23,8 +23,8 @@
#include "vulkan.h"
#include <vk_video/vulkan_video_codecs_common.h>
-#include "vulkan_video_codec_av1std.h"
-#include "vulkan_video_codec_av1std_decode.h"
+#include "vulkan_video_codec_av1std_mesa.h"
+#include "vulkan_video_codec_av1std_decode_mesa.h"
#define CODEC_VER_MAJ(ver) (ver >> 22)
#define CODEC_VER_MIN(ver) ((ver >> 12) & ((1 << 10) - 1))
diff --git a/libavcodec/vulkan_video_codec_av1std.h b/libavcodec/vulkan_video_codec_av1std.h
deleted file mode 100644
index c46236c457..0000000000
--- a/libavcodec/vulkan_video_codec_av1std.h
+++ /dev/null
@@ -1,403 +0,0 @@
-/* Copyright 2023 Lynne
- * Copyright 2023 Dave Airlie
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef VULKAN_VIDEO_CODEC_AV1STD_H_
-#define VULKAN_VIDEO_CODEC_AV1STD_H_ 1
-
-/*
-** This header is NOT YET generated from the Khronos Vulkan XML API Registry.
-**
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#define vulkan_video_codec_av1std 1
-
-#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \
- ((((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))
-#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_0_1_0 VK_MAKE_VIDEO_STD_VERSION(0, 1, 0)
-#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_0_1_0
-#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_av1_decode"
-
-typedef enum StdVideoAV1MESAProfile {
- STD_VIDEO_AV1_MESA_PROFILE_MAIN = 0,
- STD_VIDEO_AV1_MESA_PROFILE_HIGH = 1,
- STD_VIDEO_AV1_MESA_PROFILE_PROFESSIONAL = 2,
-} StdVideoAV1MESAProfile;
-
-typedef enum StdVideoAV1MESALevel {
- STD_VIDEO_AV1_MESA_LEVEL_2_0 = 0,
- STD_VIDEO_AV1_MESA_LEVEL_2_1 = 1,
- STD_VIDEO_AV1_MESA_LEVEL_2_2 = 2,
- STD_VIDEO_AV1_MESA_LEVEL_2_3 = 3,
- STD_VIDEO_AV1_MESA_LEVEL_3_0 = 4,
- STD_VIDEO_AV1_MESA_LEVEL_3_1 = 5,
- STD_VIDEO_AV1_MESA_LEVEL_3_2 = 6,
- STD_VIDEO_AV1_MESA_LEVEL_3_3 = 7,
- STD_VIDEO_AV1_MESA_LEVEL_4_0 = 8,
- STD_VIDEO_AV1_MESA_LEVEL_4_1 = 9,
- STD_VIDEO_AV1_MESA_LEVEL_4_2 = 10,
- STD_VIDEO_AV1_MESA_LEVEL_4_3 = 11,
- STD_VIDEO_AV1_MESA_LEVEL_5_0 = 12,
- STD_VIDEO_AV1_MESA_LEVEL_5_1 = 13,
- STD_VIDEO_AV1_MESA_LEVEL_5_2 = 14,
- STD_VIDEO_AV1_MESA_LEVEL_5_3 = 15,
- STD_VIDEO_AV1_MESA_LEVEL_6_0 = 16,
- STD_VIDEO_AV1_MESA_LEVEL_6_1 = 17,
- STD_VIDEO_AV1_MESA_LEVEL_6_2 = 18,
- STD_VIDEO_AV1_MESA_LEVEL_6_3 = 19,
- STD_VIDEO_AV1_MESA_LEVEL_7_0 = 20,
- STD_VIDEO_AV1_MESA_LEVEL_7_1 = 21,
- STD_VIDEO_AV1_MESA_LEVEL_7_2 = 22,
- STD_VIDEO_AV1_MESA_LEVEL_7_3 = 23,
- STD_VIDEO_AV1_MESA_LEVEL_MAX = 31,
-} StdVideoAV1MESALevel;
-
-typedef struct StdVideoAV1MESAFilmGrainFlags {
- uint8_t apply_grain;
- uint8_t chroma_scaling_from_luma;
- uint8_t overlap_flag;
- uint8_t clip_to_restricted_range;
-} StdVideoAV1MESAFilmGrainFlags;
-
-typedef struct StdVideoAV1MESAFilmGrainParameters {
- StdVideoAV1MESAFilmGrainFlags flags;
- uint32_t grain_scaling_minus_8;
- uint32_t ar_coeff_lag;
- uint32_t ar_coeff_shift_minus_6;
- uint32_t grain_scale_shift;
-
- uint16_t grain_seed;
- uint8_t num_y_points;
- uint8_t point_y_value[14];
- uint8_t point_y_scaling[14];
-
- uint8_t num_cb_points;
- uint8_t point_cb_value[10];
- uint8_t point_cb_scaling[10];
-
- uint8_t num_cr_points;
- uint8_t point_cr_value[10];
- uint8_t point_cr_scaling[10];
-
- int8_t ar_coeffs_y_plus_128[24];
- int8_t ar_coeffs_cb_plus_128[25];
- int8_t ar_coeffs_cr_plus_128[25];
- uint8_t cb_mult;
- uint8_t cb_luma_mult;
- uint16_t cb_offset;
- uint8_t cr_mult;
- uint8_t cr_luma_mult;
- uint16_t cr_offset;
-} StdVideoAV1MESAFilmGrainParameters;
-
-typedef struct StdVideoAV1MESAGlobalMotionFlags {
- uint8_t gm_invalid;
-} StdVideoAV1MESAGlobalMotionFlags;
-
-typedef struct StdVideoAV1MESAGlobalMotion {
- StdVideoAV1MESAGlobalMotionFlags flags;
- uint8_t gm_type;
- uint32_t gm_params[6];
-} StdVideoAV1MESAGlobalMotion;
-
-typedef struct StdVideoAV1MESALoopRestoration {
- uint8_t lr_type[3];
- uint8_t lr_unit_shift;
- uint8_t lr_uv_shift;
-} StdVideoAV1MESALoopRestoration;
-
-typedef struct StdVideoAV1MESATileInfoFlags {
- uint8_t uniform_tile_spacing_flag;
-} StdVideoAV1MESATileInfoFlags;
-
-typedef struct StdVideoAV1MESATileInfo {
- StdVideoAV1MESATileInfoFlags flags;
- uint8_t tile_cols;
- uint8_t tile_rows;
- uint8_t tile_start_col_sb[64];
- uint8_t tile_start_row_sb[64];
- uint8_t width_in_sbs_minus_1[64];
- uint8_t height_in_sbs_minus_1[64];
- uint16_t context_update_tile_id;
- uint8_t tile_size_bytes_minus1;
-} StdVideoAV1MESATileInfo;
-
-typedef struct StdVideoAV1MESAQuantizationFlags {
- uint8_t using_qmatrix;
-} StdVideoAV1MESAQuantizationFlags;
-
-typedef struct StdVideoAV1MESAQuantization {
- StdVideoAV1MESAQuantizationFlags flags;
- uint8_t base_q_idx;
- int8_t delta_q_y_dc;
- uint8_t diff_uv_delta;
- int8_t delta_q_u_dc;
- int8_t delta_q_u_ac;
- int8_t delta_q_v_dc;
- int8_t delta_q_v_ac;
- uint8_t qm_y;
- uint8_t qm_u;
- uint8_t qm_v;
-} StdVideoAV1MESAQuantization;
-
-typedef struct StdVideoAV1MESACDEF {
- uint8_t damping_minus_3;
- uint8_t bits;
- uint8_t y_pri_strength[8];
- uint8_t y_sec_strength[8];
- uint8_t uv_pri_strength[8];
- uint8_t uv_sec_strength[8];
-} StdVideoAV1MESACDEF;
-
-typedef struct StdVideoAV1MESADeltaQFlags {
- uint8_t delta_lf_present;
- uint8_t delta_lf_multi;
-} StdVideoAV1MESADeltaQFlags;
-
-typedef struct StdVideoAV1MESADeltaQ {
- StdVideoAV1MESADeltaQFlags flags;
- uint8_t delta_q_res;
- uint8_t delta_lf_res;
-} StdVideoAV1MESADeltaQ;
-
-typedef struct StdVideoAV1MESASegmentationFlags {
- uint8_t enabled;
- uint8_t update_map;
- uint8_t temporal_update;
- uint8_t update_data;
-} StdVideoAV1MESASegmentationFlags;
-
-typedef struct StdVideoAV1MESASegmentation {
- StdVideoAV1MESASegmentationFlags flags;
- uint8_t feature_enabled_bits[8];
- int16_t feature_data[8][8];
-} StdVideoAV1MESASegmentation;
-
-typedef struct StdVideoAV1MESALoopFilterFlags {
- uint8_t delta_enabled;
- uint8_t delta_update;
-} StdVideoAV1MESALoopFilterFlags;
-
-typedef struct StdVideoAV1MESALoopFilter {
- StdVideoAV1MESALoopFilterFlags flags;
- uint8_t level[4];
- uint8_t sharpness;
- int8_t ref_deltas[8];
- int8_t mode_deltas[2];
-} StdVideoAV1MESALoopFilter;
-
-typedef struct StdVideoAV1MESAFrameHeaderFlags {
- uint8_t error_resilient_mode;
- uint8_t disable_cdf_update;
- uint8_t use_superres;
- uint8_t render_and_frame_size_different;
- uint8_t allow_screen_content_tools;
- uint8_t is_filter_switchable;
- uint8_t force_integer_mv;
- uint8_t frame_size_override_flag;
- uint8_t buffer_removal_time_present_flag;
- uint8_t allow_intrabc;
- uint8_t frame_refs_short_signaling;
- uint8_t allow_high_precision_mv;
- uint8_t is_motion_mode_switchable;
- uint8_t use_ref_frame_mvs;
- uint8_t disable_frame_end_update_cdf;
- uint8_t allow_warped_motion;
- uint8_t reduced_tx_set;
- uint8_t reference_select;
- uint8_t skip_mode_present;
- uint8_t delta_q_present;
- uint8_t UsesLr;
-} StdVideoAV1MESAFrameHeaderFlags;
-
-typedef struct StdVideoAV1MESAFrameHeader {
- StdVideoAV1MESAFrameHeaderFlags flags;
-
- uint32_t frame_presentation_time;
- uint32_t display_frame_id;
- uint32_t current_frame_id;
- uint8_t frame_to_show_map_idx;
- uint8_t frame_type;
- uint8_t order_hint;
- uint8_t primary_ref_frame;
- uint16_t frame_width_minus_1;
- uint16_t frame_height_minus_1;
- uint16_t render_width_minus_1;
- uint16_t render_height_minus_1;
- uint8_t coded_denom;
-
- uint8_t refresh_frame_flags;
- uint8_t ref_order_hint[8];
- int8_t ref_frame_idx[7];
- uint32_t delta_frame_id_minus1[7];
-
- uint8_t interpolation_filter;
- uint8_t tx_mode;
-
- StdVideoAV1MESATileInfo tiling;
- StdVideoAV1MESAQuantization quantization;
- StdVideoAV1MESASegmentation segmentation;
- StdVideoAV1MESADeltaQ delta_q;
- StdVideoAV1MESALoopFilter loop_filter;
- StdVideoAV1MESACDEF cdef;
- StdVideoAV1MESALoopRestoration lr;
- StdVideoAV1MESAGlobalMotion global_motion[8]; // One per ref frame
- StdVideoAV1MESAFilmGrainParameters film_grain;
-} StdVideoAV1MESAFrameHeader;
-
-typedef struct StdVideoAV1MESAScreenCoding {
- uint8_t seq_force_screen_content_tools;
-} StdVideoAV1MESAScreenCoding;
-
-typedef struct StdVideoAV1MESATimingInfoFlags {
- uint8_t equal_picture_interval;
-} StdVideoAV1MESATimingInfoFlags;
-
-typedef struct StdVideoAV1MESATimingInfo {
- StdVideoAV1MESATimingInfoFlags flags;
- uint32_t num_units_in_display_tick;
- uint32_t time_scale;
- uint32_t num_ticks_per_picture_minus_1;
-} StdVideoAV1MESATimingInfo;
-
-typedef struct StdVideoAV1MESAColorConfigFlags {
- uint8_t mono_chrome;
- uint8_t color_range;
- uint8_t separate_uv_delta_q;
-} StdVideoAV1MESAColorConfigFlags;
-
-typedef struct StdVideoAV1MESAColorConfig {
- StdVideoAV1MESAColorConfigFlags flags;
- uint8_t bit_depth;
- uint8_t subsampling_x;
- uint8_t subsampling_y;
-} StdVideoAV1MESAColorConfig;
-
-typedef struct StdVideoAV1MESASequenceHeaderFlags {
- uint8_t still_picture;
- uint8_t reduced_still_picture_header;
- uint8_t use_128x128_superblock;
- uint8_t enable_filter_intra;
- uint8_t enable_intra_edge_filter;
- uint8_t enable_interintra_compound;
- uint8_t enable_masked_compound;
- uint8_t enable_warped_motion;
- uint8_t enable_dual_filter;
- uint8_t enable_order_hint;
- uint8_t enable_jnt_comp;
- uint8_t enable_ref_frame_mvs;
- uint8_t frame_id_numbers_present_flag;
- uint8_t enable_superres;
- uint8_t enable_cdef;
- uint8_t enable_restoration;
- uint8_t film_grain_params_present;
- uint8_t timing_info_present_flag;
- uint8_t initial_display_delay_present_flag;
-} StdVideoAV1MESASequenceHeaderFlags;
-
-typedef struct StdVideoAV1MESASequenceHeader {
- StdVideoAV1MESASequenceHeaderFlags flags;
-
- StdVideoAV1MESAProfile seq_profile;
- uint8_t frame_width_bits_minus_1;
- uint8_t frame_height_bits_minus_1;
- uint16_t max_frame_width_minus_1;
- uint16_t max_frame_height_minus_1;
- uint8_t delta_frame_id_length_minus_2;
- uint8_t additional_frame_id_length_minus_1;
- uint8_t order_hint_bits_minus_1;
- uint8_t seq_choose_integer_mv;
- uint8_t seq_force_integer_mv;
-
- StdVideoAV1MESATimingInfo timing_info;
- StdVideoAV1MESAColorConfig color_config;
-} StdVideoAV1MESASequenceHeader;
-
-typedef struct StdVideoAV1MESATile {
- uint16_t tg_start;
- uint16_t tg_end;
- uint16_t row;
- uint16_t column;
- uint32_t size;
- uint32_t offset;
-} StdVideoAV1MESATile;
-
-typedef struct StdVideoAV1MESATileList {
- StdVideoAV1MESATile *tile_list;
- uint32_t nb_tiles;
-} StdVideoAV1MESATileList;
-
-typedef struct VkVideoDecodeAV1PictureInfoMESA {
- VkStructureType sType;
- const void *pNext;
- StdVideoAV1MESAFrameHeader *frame_header;
- StdVideoAV1MESATileList *tile_list;
- uint8_t skip_mode_frame_idx[2];
-} VkVideoDecodeAV1PictureInfoMESA;
-
-typedef struct VkVideoDecodeAV1DpbSlotInfoMESA {
- VkStructureType sType;
- const void *pNext;
- uint8_t frameIdx;
- uint8_t ref_order_hint[7];
- uint8_t disable_frame_end_update_cdf;
-} VkVideoDecodeAV1DpbSlotInfoMESA;
-
-typedef struct VkVideoDecodeAV1SessionParametersAddInfoMESA {
- VkStructureType sType;
- const void *pNext;
- StdVideoAV1MESASequenceHeader *sequence_header;
-} VkVideoDecodeAV1SessionParametersAddInfoMESA;
-
-typedef struct VkVideoDecodeAV1SessionParametersCreateInfoMESA {
- VkStructureType sType;
- const void *pNext;
- const VkVideoDecodeAV1SessionParametersAddInfoMESA *pParametersAddInfo;
-} VkVideoDecodeAV1SessionParametersCreateInfoMESA;
-
-typedef struct VkVideoDecodeAV1ProfileInfoMESA {
- VkStructureType sType;
- const void *pNext;
- StdVideoAV1MESAProfile stdProfileIdc;
-} VkVideoDecodeAV1ProfileInfoMESA;
-
-typedef enum VkVideoDecodeAV1CapabilityFlagBitsMESA {
- VK_VIDEO_DECODE_AV1_CAPABILITY_EXTERNAL_FILM_GRAIN_MESA = 0x00000001,
- VK_VIDEO_DECODE_AV1_CAPABILITY_FLAG_BITS_MAX_ENUM_MESA = 0x7FFFFFFF
-} VkVideoDecodeAV1CapabilityFlagBitsMESA;
-typedef VkFlags VkVideoDecodeAV1CapabilityFlagsMESA;
-
-typedef struct VkVideoDecodeAV1CapabilitiesMESA {
- VkStructureType sType;
- const void *pNext;
- VkVideoDecodeAV1CapabilityFlagsMESA flags;
- StdVideoAV1MESALevel maxLevelIdc;
-} VkVideoDecodeAV1CapabilitiesMESA;
-
-#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_MESA 1000509000
-#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_MESA 1000509001
-#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_ADD_INFO_MESA 1000509002
-#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_MESA 1000509003
-#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_MESA 1000509004
-#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_MESA 1000509005
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/libavcodec/vulkan_video_codec_av1std_decode.h b/libavcodec/vulkan_video_codec_av1std_decode.h
deleted file mode 100644
index a697c00593..0000000000
--- a/libavcodec/vulkan_video_codec_av1std_decode.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright 2023 Lynne
- * Copyright 2023 Dave Airlie
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef VULKAN_VIDEO_CODEC_AV1STD_DECODE_H_
-#define VULKAN_VIDEO_CODEC_AV1STD_DECODE_H_ 1
-
-/*
-** This header is NOT YET generated from the Khronos Vulkan XML API Registry.
-**
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#define vulkan_video_codec_av1std_decode 1
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/libavcodec/vulkan_video_codec_av1std_decode_mesa.h b/libavcodec/vulkan_video_codec_av1std_decode_mesa.h
new file mode 100644
index 0000000000..e2f37b4e6e
--- /dev/null
+++ b/libavcodec/vulkan_video_codec_av1std_decode_mesa.h
@@ -0,0 +1,36 @@
+/* Copyright 2023 Lynne
+ * Copyright 2023 Dave Airlie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VULKAN_VIDEO_CODEC_AV1STD_DECODE_MESA_H_
+#define VULKAN_VIDEO_CODEC_AV1STD_DECODE_MESA_H_ 1
+
+/*
+** This header is NOT YET generated from the Khronos Vulkan XML API Registry.
+**
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define vulkan_video_codec_av1std_decode 1
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libavcodec/vulkan_video_codec_av1std_mesa.h b/libavcodec/vulkan_video_codec_av1std_mesa.h
new file mode 100644
index 0000000000..c91589eee2
--- /dev/null
+++ b/libavcodec/vulkan_video_codec_av1std_mesa.h
@@ -0,0 +1,403 @@
+/* Copyright 2023 Lynne
+ * Copyright 2023 Dave Airlie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VULKAN_VIDEO_CODEC_AV1STD_MESA_H_
+#define VULKAN_VIDEO_CODEC_AV1STD_MESA_H_ 1
+
+/*
+** This header is NOT YET generated from the Khronos Vulkan XML API Registry.
+**
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define vulkan_video_codec_av1std 1
+
+#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \
+ ((((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))
+#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_0_1_0 VK_MAKE_VIDEO_STD_VERSION(0, 1, 0)
+#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_0_1_0
+#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_av1_decode"
+
+typedef enum StdVideoAV1MESAProfile {
+ STD_VIDEO_AV1_MESA_PROFILE_MAIN = 0,
+ STD_VIDEO_AV1_MESA_PROFILE_HIGH = 1,
+ STD_VIDEO_AV1_MESA_PROFILE_PROFESSIONAL = 2,
+} StdVideoAV1MESAProfile;
+
+typedef enum StdVideoAV1MESALevel {
+ STD_VIDEO_AV1_MESA_LEVEL_2_0 = 0,
+ STD_VIDEO_AV1_MESA_LEVEL_2_1 = 1,
+ STD_VIDEO_AV1_MESA_LEVEL_2_2 = 2,
+ STD_VIDEO_AV1_MESA_LEVEL_2_3 = 3,
+ STD_VIDEO_AV1_MESA_LEVEL_3_0 = 4,
+ STD_VIDEO_AV1_MESA_LEVEL_3_1 = 5,
+ STD_VIDEO_AV1_MESA_LEVEL_3_2 = 6,
+ STD_VIDEO_AV1_MESA_LEVEL_3_3 = 7,
+ STD_VIDEO_AV1_MESA_LEVEL_4_0 = 8,
+ STD_VIDEO_AV1_MESA_LEVEL_4_1 = 9,
+ STD_VIDEO_AV1_MESA_LEVEL_4_2 = 10,
+ STD_VIDEO_AV1_MESA_LEVEL_4_3 = 11,
+ STD_VIDEO_AV1_MESA_LEVEL_5_0 = 12,
+ STD_VIDEO_AV1_MESA_LEVEL_5_1 = 13,
+ STD_VIDEO_AV1_MESA_LEVEL_5_2 = 14,
+ STD_VIDEO_AV1_MESA_LEVEL_5_3 = 15,
+ STD_VIDEO_AV1_MESA_LEVEL_6_0 = 16,
+ STD_VIDEO_AV1_MESA_LEVEL_6_1 = 17,
+ STD_VIDEO_AV1_MESA_LEVEL_6_2 = 18,
+ STD_VIDEO_AV1_MESA_LEVEL_6_3 = 19,
+ STD_VIDEO_AV1_MESA_LEVEL_7_0 = 20,
+ STD_VIDEO_AV1_MESA_LEVEL_7_1 = 21,
+ STD_VIDEO_AV1_MESA_LEVEL_7_2 = 22,
+ STD_VIDEO_AV1_MESA_LEVEL_7_3 = 23,
+ STD_VIDEO_AV1_MESA_LEVEL_MAX = 31,
+} StdVideoAV1MESALevel;
+
+typedef struct StdVideoAV1MESAFilmGrainFlags {
+ uint8_t apply_grain;
+ uint8_t chroma_scaling_from_luma;
+ uint8_t overlap_flag;
+ uint8_t clip_to_restricted_range;
+} StdVideoAV1MESAFilmGrainFlags;
+
+typedef struct StdVideoAV1MESAFilmGrainParameters {
+ StdVideoAV1MESAFilmGrainFlags flags;
+ uint32_t grain_scaling_minus_8;
+ uint32_t ar_coeff_lag;
+ uint32_t ar_coeff_shift_minus_6;
+ uint32_t grain_scale_shift;
+
+ uint16_t grain_seed;
+ uint8_t num_y_points;
+ uint8_t point_y_value[14];
+ uint8_t point_y_scaling[14];
+
+ uint8_t num_cb_points;
+ uint8_t point_cb_value[10];
+ uint8_t point_cb_scaling[10];
+
+ uint8_t num_cr_points;
+ uint8_t point_cr_value[10];
+ uint8_t point_cr_scaling[10];
+
+ int8_t ar_coeffs_y_plus_128[24];
+ int8_t ar_coeffs_cb_plus_128[25];
+ int8_t ar_coeffs_cr_plus_128[25];
+ uint8_t cb_mult;
+ uint8_t cb_luma_mult;
+ uint16_t cb_offset;
+ uint8_t cr_mult;
+ uint8_t cr_luma_mult;
+ uint16_t cr_offset;
+} StdVideoAV1MESAFilmGrainParameters;
+
+typedef struct StdVideoAV1MESAGlobalMotionFlags {
+ uint8_t gm_invalid;
+} StdVideoAV1MESAGlobalMotionFlags;
+
+typedef struct StdVideoAV1MESAGlobalMotion {
+ StdVideoAV1MESAGlobalMotionFlags flags;
+ uint8_t gm_type;
+ uint32_t gm_params[6];
+} StdVideoAV1MESAGlobalMotion;
+
+typedef struct StdVideoAV1MESALoopRestoration {
+ uint8_t lr_type[3];
+ uint8_t lr_unit_shift;
+ uint8_t lr_uv_shift;
+} StdVideoAV1MESALoopRestoration;
+
+typedef struct StdVideoAV1MESATileInfoFlags {
+ uint8_t uniform_tile_spacing_flag;
+} StdVideoAV1MESATileInfoFlags;
+
+typedef struct StdVideoAV1MESATileInfo {
+ StdVideoAV1MESATileInfoFlags flags;
+ uint8_t tile_cols;
+ uint8_t tile_rows;
+ uint8_t tile_start_col_sb[64];
+ uint8_t tile_start_row_sb[64];
+ uint8_t width_in_sbs_minus_1[64];
+ uint8_t height_in_sbs_minus_1[64];
+ uint16_t context_update_tile_id;
+ uint8_t tile_size_bytes_minus1;
+} StdVideoAV1MESATileInfo;
+
+typedef struct StdVideoAV1MESAQuantizationFlags {
+ uint8_t using_qmatrix;
+} StdVideoAV1MESAQuantizationFlags;
+
+typedef struct StdVideoAV1MESAQuantization {
+ StdVideoAV1MESAQuantizationFlags flags;
+ uint8_t base_q_idx;
+ int8_t delta_q_y_dc;
+ uint8_t diff_uv_delta;
+ int8_t delta_q_u_dc;
+ int8_t delta_q_u_ac;
+ int8_t delta_q_v_dc;
+ int8_t delta_q_v_ac;
+ uint8_t qm_y;
+ uint8_t qm_u;
+ uint8_t qm_v;
+} StdVideoAV1MESAQuantization;
+
+typedef struct StdVideoAV1MESACDEF {
+ uint8_t damping_minus_3;
+ uint8_t bits;
+ uint8_t y_pri_strength[8];
+ uint8_t y_sec_strength[8];
+ uint8_t uv_pri_strength[8];
+ uint8_t uv_sec_strength[8];
+} StdVideoAV1MESACDEF;
+
+typedef struct StdVideoAV1MESADeltaQFlags {
+ uint8_t delta_lf_present;
+ uint8_t delta_lf_multi;
+} StdVideoAV1MESADeltaQFlags;
+
+typedef struct StdVideoAV1MESADeltaQ {
+ StdVideoAV1MESADeltaQFlags flags;
+ uint8_t delta_q_res;
+ uint8_t delta_lf_res;
+} StdVideoAV1MESADeltaQ;
+
+typedef struct StdVideoAV1MESASegmentationFlags {
+ uint8_t enabled;
+ uint8_t update_map;
+ uint8_t temporal_update;
+ uint8_t update_data;
+} StdVideoAV1MESASegmentationFlags;
+
+typedef struct StdVideoAV1MESASegmentation {
+ StdVideoAV1MESASegmentationFlags flags;
+ uint8_t feature_enabled_bits[8];
+ int16_t feature_data[8][8];
+} StdVideoAV1MESASegmentation;
+
+typedef struct StdVideoAV1MESALoopFilterFlags {
+ uint8_t delta_enabled;
+ uint8_t delta_update;
+} StdVideoAV1MESALoopFilterFlags;
+
+typedef struct StdVideoAV1MESALoopFilter {
+ StdVideoAV1MESALoopFilterFlags flags;
+ uint8_t level[4];
+ uint8_t sharpness;
+ int8_t ref_deltas[8];
+ int8_t mode_deltas[2];
+} StdVideoAV1MESALoopFilter;
+
+typedef struct StdVideoAV1MESAFrameHeaderFlags {
+ uint8_t error_resilient_mode;
+ uint8_t disable_cdf_update;
+ uint8_t use_superres;
+ uint8_t render_and_frame_size_different;
+ uint8_t allow_screen_content_tools;
+ uint8_t is_filter_switchable;
+ uint8_t force_integer_mv;
+ uint8_t frame_size_override_flag;
+ uint8_t buffer_removal_time_present_flag;
+ uint8_t allow_intrabc;
+ uint8_t frame_refs_short_signaling;
+ uint8_t allow_high_precision_mv;
+ uint8_t is_motion_mode_switchable;
+ uint8_t use_ref_frame_mvs;
+ uint8_t disable_frame_end_update_cdf;
+ uint8_t allow_warped_motion;
+ uint8_t reduced_tx_set;
+ uint8_t reference_select;
+ uint8_t skip_mode_present;
+ uint8_t delta_q_present;
+ uint8_t UsesLr;
+} StdVideoAV1MESAFrameHeaderFlags;
+
+typedef struct StdVideoAV1MESAFrameHeader {
+ StdVideoAV1MESAFrameHeaderFlags flags;
+
+ uint32_t frame_presentation_time;
+ uint32_t display_frame_id;
+ uint32_t current_frame_id;
+ uint8_t frame_to_show_map_idx;
+ uint8_t frame_type;
+ uint8_t order_hint;
+ uint8_t primary_ref_frame;
+ uint16_t frame_width_minus_1;
+ uint16_t frame_height_minus_1;
+ uint16_t render_width_minus_1;
+ uint16_t render_height_minus_1;
+ uint8_t coded_denom;
+
+ uint8_t refresh_frame_flags;
+ uint8_t ref_order_hint[8];
+ int8_t ref_frame_idx[7];
+ uint32_t delta_frame_id_minus1[7];
+
+ uint8_t interpolation_filter;
+ uint8_t tx_mode;
+
+ StdVideoAV1MESATileInfo tiling;
+ StdVideoAV1MESAQuantization quantization;
+ StdVideoAV1MESASegmentation segmentation;
+ StdVideoAV1MESADeltaQ delta_q;
+ StdVideoAV1MESALoopFilter loop_filter;
+ StdVideoAV1MESACDEF cdef;
+ StdVideoAV1MESALoopRestoration lr;
+ StdVideoAV1MESAGlobalMotion global_motion[8]; // One per ref frame
+ StdVideoAV1MESAFilmGrainParameters film_grain;
+} StdVideoAV1MESAFrameHeader;
+
+typedef struct StdVideoAV1MESAScreenCoding {
+ uint8_t seq_force_screen_content_tools;
+} StdVideoAV1MESAScreenCoding;
+
+typedef struct StdVideoAV1MESATimingInfoFlags {
+ uint8_t equal_picture_interval;
+} StdVideoAV1MESATimingInfoFlags;
+
+typedef struct StdVideoAV1MESATimingInfo {
+ StdVideoAV1MESATimingInfoFlags flags;
+ uint32_t num_units_in_display_tick;
+ uint32_t time_scale;
+ uint32_t num_ticks_per_picture_minus_1;
+} StdVideoAV1MESATimingInfo;
+
+typedef struct StdVideoAV1MESAColorConfigFlags {
+ uint8_t mono_chrome;
+ uint8_t color_range;
+ uint8_t separate_uv_delta_q;
+} StdVideoAV1MESAColorConfigFlags;
+
+typedef struct StdVideoAV1MESAColorConfig {
+ StdVideoAV1MESAColorConfigFlags flags;
+ uint8_t bit_depth;
+ uint8_t subsampling_x;
+ uint8_t subsampling_y;
+} StdVideoAV1MESAColorConfig;
+
+typedef struct StdVideoAV1MESASequenceHeaderFlags {
+ uint8_t still_picture;
+ uint8_t reduced_still_picture_header;
+ uint8_t use_128x128_superblock;
+ uint8_t enable_filter_intra;
+ uint8_t enable_intra_edge_filter;
+ uint8_t enable_interintra_compound;
+ uint8_t enable_masked_compound;
+ uint8_t enable_warped_motion;
+ uint8_t enable_dual_filter;
+ uint8_t enable_order_hint;
+ uint8_t enable_jnt_comp;
+ uint8_t enable_ref_frame_mvs;
+ uint8_t frame_id_numbers_present_flag;
+ uint8_t enable_superres;
+ uint8_t enable_cdef;
+ uint8_t enable_restoration;
+ uint8_t film_grain_params_present;
+ uint8_t timing_info_present_flag;
+ uint8_t initial_display_delay_present_flag;
+} StdVideoAV1MESASequenceHeaderFlags;
+
+typedef struct StdVideoAV1MESASequenceHeader {
+ StdVideoAV1MESASequenceHeaderFlags flags;
+
+ StdVideoAV1MESAProfile seq_profile;
+ uint8_t frame_width_bits_minus_1;
+ uint8_t frame_height_bits_minus_1;
+ uint16_t max_frame_width_minus_1;
+ uint16_t max_frame_height_minus_1;
+ uint8_t delta_frame_id_length_minus_2;
+ uint8_t additional_frame_id_length_minus_1;
+ uint8_t order_hint_bits_minus_1;
+ uint8_t seq_choose_integer_mv;
+ uint8_t seq_force_integer_mv;
+
+ StdVideoAV1MESATimingInfo timing_info;
+ StdVideoAV1MESAColorConfig color_config;
+} StdVideoAV1MESASequenceHeader;
+
+typedef struct StdVideoAV1MESATile {
+ uint16_t tg_start;
+ uint16_t tg_end;
+ uint16_t row;
+ uint16_t column;
+ uint32_t size;
+ uint32_t offset;
+} StdVideoAV1MESATile;
+
+typedef struct StdVideoAV1MESATileList {
+ StdVideoAV1MESATile *tile_list;
+ uint32_t nb_tiles;
+} StdVideoAV1MESATileList;
+
+typedef struct VkVideoDecodeAV1PictureInfoMESA {
+ VkStructureType sType;
+ const void *pNext;
+ StdVideoAV1MESAFrameHeader *frame_header;
+ StdVideoAV1MESATileList *tile_list;
+ uint8_t skip_mode_frame_idx[2];
+} VkVideoDecodeAV1PictureInfoMESA;
+
+typedef struct VkVideoDecodeAV1DpbSlotInfoMESA {
+ VkStructureType sType;
+ const void *pNext;
+ uint8_t frameIdx;
+ uint8_t ref_order_hint[7];
+ uint8_t disable_frame_end_update_cdf;
+} VkVideoDecodeAV1DpbSlotInfoMESA;
+
+typedef struct VkVideoDecodeAV1SessionParametersAddInfoMESA {
+ VkStructureType sType;
+ const void *pNext;
+ StdVideoAV1MESASequenceHeader *sequence_header;
+} VkVideoDecodeAV1SessionParametersAddInfoMESA;
+
+typedef struct VkVideoDecodeAV1SessionParametersCreateInfoMESA {
+ VkStructureType sType;
+ const void *pNext;
+ const VkVideoDecodeAV1SessionParametersAddInfoMESA *pParametersAddInfo;
+} VkVideoDecodeAV1SessionParametersCreateInfoMESA;
+
+typedef struct VkVideoDecodeAV1ProfileInfoMESA {
+ VkStructureType sType;
+ const void *pNext;
+ StdVideoAV1MESAProfile stdProfileIdc;
+} VkVideoDecodeAV1ProfileInfoMESA;
+
+typedef enum VkVideoDecodeAV1CapabilityFlagBitsMESA {
+ VK_VIDEO_DECODE_AV1_CAPABILITY_EXTERNAL_FILM_GRAIN_MESA = 0x00000001,
+ VK_VIDEO_DECODE_AV1_CAPABILITY_FLAG_BITS_MAX_ENUM_MESA = 0x7FFFFFFF
+} VkVideoDecodeAV1CapabilityFlagBitsMESA;
+typedef VkFlags VkVideoDecodeAV1CapabilityFlagsMESA;
+
+typedef struct VkVideoDecodeAV1CapabilitiesMESA {
+ VkStructureType sType;
+ const void *pNext;
+ VkVideoDecodeAV1CapabilityFlagsMESA flags;
+ StdVideoAV1MESALevel maxLevelIdc;
+} VkVideoDecodeAV1CapabilitiesMESA;
+
+#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_MESA 1000509000
+#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_MESA 1000509001
+#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_ADD_INFO_MESA 1000509002
+#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_MESA 1000509003
+#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_MESA 1000509004
+#define VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_MESA 1000509005
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tests/ref/fate/source b/tests/ref/fate/source
index c575789dd5..8bb58b61f1 100644
--- a/tests/ref/fate/source
+++ b/tests/ref/fate/source
@@ -23,8 +23,8 @@ compat/djgpp/math.h
compat/float/float.h
compat/float/limits.h
libavcodec/bitstream_template.h
-libavcodec/vulkan_video_codec_av1std.h
-libavcodec/vulkan_video_codec_av1std_decode.h
+libavcodec/vulkan_video_codec_av1std_decode_mesa.h
+libavcodec/vulkan_video_codec_av1std_mesa.h
tools/decode_simple.h
Use of av_clip() where av_clip_uintp2() could be used:
Use of av_clip() where av_clip_intp2() could be used:
--
2.44.0

View File

@ -1,58 +0,0 @@
From 654bd47716c4f36719fb0f3f7fd8386d5ed0b916 Mon Sep 17 00:00:00 2001
From: Ross Burton <ross.burton@arm.com>
Date: Fri, 9 Aug 2024 11:32:00 +0100
Subject: [PATCH] libavcodec/arm/mlpdsp_armv5te: fix label format to work with
binutils 2.43
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
binutils 2.43 has stricter validation for labels[1] and results in errors
when building ffmpeg for armv5:
src/libavcodec/arm/mlpdsp_armv5te.S:232: Error: junk at end of line, first unrecognized character is `0'
Remove the leading zero in the "01" label to resolve this error.
[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=226749d5a6ff0d5c607d6428d6c81e1e7e7a994b
Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Martin Storsjö <martin@martin.st>
---
libavcodec/arm/mlpdsp_armv5te.S | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/libavcodec/arm/mlpdsp_armv5te.S b/libavcodec/arm/mlpdsp_armv5te.S
index 4f9aa485fd..d31568611c 100644
--- a/libavcodec/arm/mlpdsp_armv5te.S
+++ b/libavcodec/arm/mlpdsp_armv5te.S
@@ -229,7 +229,7 @@ A .endif
.endif
// Begin loop
-01:
+1:
.if TOTAL_TAPS == 0
// Things simplify a lot in this case
// In fact this could be pipelined further if it's worth it...
@@ -241,7 +241,7 @@ A .endif
str ST0, [PST, #-4]!
str ST0, [PST, #4 * (MAX_BLOCKSIZE + MAX_FIR_ORDER)]
str ST0, [PSAMP], #4 * MAX_CHANNELS
- bne 01b
+ bne 1b
.else
.if \fir_taps & 1
.set LOAD_REG, 1
@@ -333,7 +333,7 @@ T orr AC0, AC0, AC1
str ST3, [PST, #-4]!
str ST2, [PST, #4 * (MAX_BLOCKSIZE + MAX_FIR_ORDER)]
str ST3, [PSAMP], #4 * MAX_CHANNELS
- bne 01b
+ bne 1b
.endif
b 99f
--
2.46.0

View File

@ -1,27 +0,0 @@
From: François Cartegnie <fcvlcdev@free.fr>
Date: Mon, 13 May 2024 11:37:27 +0000
Subject: avcodec/decode: clean-up if get_hw_frames_parameters fails
https://trac.ffmpeg.org/ticket/11013
https://code.videolan.org/videolan/vlc/-/issues/28811
Fixes the following assert:
[00007f1df83d17e0] vaapi generic error: avcodec_get_hw_frames_parameters failed: -22
Assertion p_dst->hwaccel_threadsafe || (!dst->hwaccel && !dst->internal->hwaccel_priv_data) failed at libavcodec/pthread_frame.c:349
Reproduced from VLC with VAAPI, when fallbacking from hw to sw.
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -344,6 +344,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
return err;
}
+ // hwaccel could have failed init due to some params
+ if(!dst->hwaccel && dst->internal->hwaccel_priv_data)
+ ff_hwaccel_uninit(dst);
+
// reset dst hwaccel state if needed
av_assert0(p_dst->hwaccel_threadsafe ||
(!dst->hwaccel && !dst->internal->hwaccel_priv_data));

View File

@ -1,970 +0,0 @@
From 1535d338186f5e40383270b4a85fb1d4e213d3db Mon Sep 17 00:00:00 2001
Author: Niklas Haas <git@haasn.dev>
Date: Wed, 4 Oct 2023 13:43:51 +0200
Subject: [PATCH] avcodec/aom_film_grain: add AOM film grain synthesis
References: CVE-2024-32228
References: bsc#1227277
Upstream: Backport from upstream
Implementation copied wholesale from dav1d, sans SIMD, under permissive
license. This implementation was extensively verified to be bit-exact,
so it serves as a much better starting point than trying to re-engineer
this from scratch for no reason. (I also authored the original
implementation in dav1d, so any "clean room" implementation would end up
looking much the same, anyway)
The notable changes I had to make while adapting this from the dav1d
code-base to the FFmpeg codebase include:
- reordering variable declarations to avoid triggering warnings
- replacing several inline helpers by avutil equivalents
- changing code that accesses frame metadata
- replacing raw plane copying logic by av_image_copy_plane
Apart from this, the implementation is basically unmodified.
diff --git a/libavcodec/aom_film_grain.c b/libavcodec/aom_film_grain.c
new file mode 100644
index 0000000000..ffcd71b584
--- /dev/null
+++ b/libavcodec/aom_film_grain.c
@@ -0,0 +1,310 @@
+/*
+ * AOM film grain synthesis
+ * Copyright (c) 2023 Niklas Haas <ffmpeg@haasn.xyz>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * AOM film grain synthesis.
+ * @author Niklas Haas <ffmpeg@haasn.xyz>
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
+
+#include "aom_film_grain.h"
+
+// Common/shared helpers (not dependent on BIT_DEPTH)
+static inline int get_random_number(const int bits, unsigned *const state) {
+ const int r = *state;
+ unsigned bit = ((r >> 0) ^ (r >> 1) ^ (r >> 3) ^ (r >> 12)) & 1;
+ *state = (r >> 1) | (bit << 15);
+
+ return (*state >> (16 - bits)) & ((1 << bits) - 1);
+}
+
+static inline int round2(const int x, const uint64_t shift) {
+ return (x + ((1 << shift) >> 1)) >> shift;
+}
+
+enum {
+ GRAIN_WIDTH = 82,
+ GRAIN_HEIGHT = 73,
+ SUB_GRAIN_WIDTH = 44,
+ SUB_GRAIN_HEIGHT = 38,
+ FG_BLOCK_SIZE = 32,
+};
+
+static const int16_t gaussian_sequence[2048];
+
+#define BIT_DEPTH 16
+#include "aom_film_grain_template.c"
+#undef BIT_DEPTH
+
+#define BIT_DEPTH 8
+#include "aom_film_grain_template.c"
+#undef BIT_DEPTH
+
+
+int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in,
+ const AVFilmGrainParams *params)
+{
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(out->format);
+ const int subx = desc->log2_chroma_w, suby = desc->log2_chroma_h;
+ const int pxstep = desc->comp[0].step;
+
+ av_assert0(out->format == in->format);
+ av_assert0(params->type == AV_FILM_GRAIN_PARAMS_AV1);
+
+ // Copy over the non-modified planes
+ if (!params->codec.aom.num_y_points) {
+ av_image_copy_plane(out->data[0], out->linesize[0],
+ in->data[0], in->linesize[0],
+ out->width * pxstep, out->height);
+ }
+ for (int uv = 0; uv < 2; uv++) {
+ if (!data->num_uv_points[uv]) {
+ av_image_copy_plane(out->data[1+uv], out->linesize[1+uv],
+ in->data[1+uv], in->linesize[1+uv],
+ AV_CEIL_RSHIFT(out->width, subx) * pxstep,
+ AV_CEIL_RSHIFT(out->height, suby));
+ }
+ }
+
+ switch (in->format) {
+ case AV_PIX_FMT_GRAY8:
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUVJ420P:
+ case AV_PIX_FMT_YUVJ422P:
+ case AV_PIX_FMT_YUVJ444P:
+ return apply_film_grain_8(out, in, params);
+ case AV_PIX_FMT_GRAY9:
+ case AV_PIX_FMT_YUV420P9:
+ case AV_PIX_FMT_YUV422P9:
+ case AV_PIX_FMT_YUV444P9:
+ return apply_film_grain_16(out, in, params, 9);
+ case AV_PIX_FMT_GRAY10:
+ case AV_PIX_FMT_YUV420P10:
+ case AV_PIX_FMT_YUV422P10:
+ case AV_PIX_FMT_YUV444P10:
+ return apply_film_grain_16(out, in, params, 10);
+ case AV_PIX_FMT_GRAY12:
+ case AV_PIX_FMT_YUV420P12:
+ case AV_PIX_FMT_YUV422P12:
+ case AV_PIX_FMT_YUV444P12:
+ return apply_film_grain_16(out, in, params, 12);
+ }
+
+ /* The AV1 spec only defines film grain synthesis for these formats */
+ return AVERROR_INVALIDDATA;
+}
+
+// Taken from the AV1 spec. Range is [-2048, 2047], mean is 0 and stddev is 512
+static const int16_t gaussian_sequence[2048] = {
+ 56, 568, -180, 172, 124, -84, 172, -64, -900, 24, 820,
+ 224, 1248, 996, 272, -8, -916, -388, -732, -104, -188, 800,
+ 112, -652, -320, -376, 140, -252, 492, -168, 44, -788, 588,
+ -584, 500, -228, 12, 680, 272, -476, 972, -100, 652, 368,
+ 432, -196, -720, -192, 1000, -332, 652, -136, -552, -604, -4,
+ 192, -220, -136, 1000, -52, 372, -96, -624, 124, -24, 396,
+ 540, -12, -104, 640, 464, 244, -208, -84, 368, -528, -740,
+ 248, -968, -848, 608, 376, -60, -292, -40, -156, 252, -292,
+ 248, 224, -280, 400, -244, 244, -60, 76, -80, 212, 532,
+ 340, 128, -36, 824, -352, -60, -264, -96, -612, 416, -704,
+ 220, -204, 640, -160, 1220, -408, 900, 336, 20, -336, -96,
+ -792, 304, 48, -28, -1232, -1172, -448, 104, -292, -520, 244,
+ 60, -948, 0, -708, 268, 108, 356, -548, 488, -344, -136,
+ 488, -196, -224, 656, -236, -1128, 60, 4, 140, 276, -676,
+ -376, 168, -108, 464, 8, 564, 64, 240, 308, -300, -400,
+ -456, -136, 56, 120, -408, -116, 436, 504, -232, 328, 844,
+ -164, -84, 784, -168, 232, -224, 348, -376, 128, 568, 96,
+ -1244, -288, 276, 848, 832, -360, 656, 464, -384, -332, -356,
+ 728, -388, 160, -192, 468, 296, 224, 140, -776, -100, 280,
+ 4, 196, 44, -36, -648, 932, 16, 1428, 28, 528, 808,
+ 772, 20, 268, 88, -332, -284, 124, -384, -448, 208, -228,
+ -1044, -328, 660, 380, -148, -300, 588, 240, 540, 28, 136,
+ -88, -436, 256, 296, -1000, 1400, 0, -48, 1056, -136, 264,
+ -528, -1108, 632, -484, -592, -344, 796, 124, -668, -768, 388,
+ 1296, -232, -188, -200, -288, -4, 308, 100, -168, 256, -500,
+ 204, -508, 648, -136, 372, -272, -120, -1004, -552, -548, -384,
+ 548, -296, 428, -108, -8, -912, -324, -224, -88, -112, -220,
+ -100, 996, -796, 548, 360, -216, 180, 428, -200, -212, 148,
+ 96, 148, 284, 216, -412, -320, 120, -300, -384, -604, -572,
+ -332, -8, -180, -176, 696, 116, -88, 628, 76, 44, -516,
+ 240, -208, -40, 100, -592, 344, -308, -452, -228, 20, 916,
+ -1752, -136, -340, -804, 140, 40, 512, 340, 248, 184, -492,
+ 896, -156, 932, -628, 328, -688, -448, -616, -752, -100, 560,
+ -1020, 180, -800, -64, 76, 576, 1068, 396, 660, 552, -108,
+ -28, 320, -628, 312, -92, -92, -472, 268, 16, 560, 516,
+ -672, -52, 492, -100, 260, 384, 284, 292, 304, -148, 88,
+ -152, 1012, 1064, -228, 164, -376, -684, 592, -392, 156, 196,
+ -524, -64, -884, 160, -176, 636, 648, 404, -396, -436, 864,
+ 424, -728, 988, -604, 904, -592, 296, -224, 536, -176, -920,
+ 436, -48, 1176, -884, 416, -776, -824, -884, 524, -548, -564,
+ -68, -164, -96, 692, 364, -692, -1012, -68, 260, -480, 876,
+ -1116, 452, -332, -352, 892, -1088, 1220, -676, 12, -292, 244,
+ 496, 372, -32, 280, 200, 112, -440, -96, 24, -644, -184,
+ 56, -432, 224, -980, 272, -260, 144, -436, 420, 356, 364,
+ -528, 76, 172, -744, -368, 404, -752, -416, 684, -688, 72,
+ 540, 416, 92, 444, 480, -72, -1416, 164, -1172, -68, 24,
+ 424, 264, 1040, 128, -912, -524, -356, 64, 876, -12, 4,
+ -88, 532, 272, -524, 320, 276, -508, 940, 24, -400, -120,
+ 756, 60, 236, -412, 100, 376, -484, 400, -100, -740, -108,
+ -260, 328, -268, 224, -200, -416, 184, -604, -564, -20, 296,
+ 60, 892, -888, 60, 164, 68, -760, 216, -296, 904, -336,
+ -28, 404, -356, -568, -208, -1480, -512, 296, 328, -360, -164,
+ -1560, -776, 1156, -428, 164, -504, -112, 120, -216, -148, -264,
+ 308, 32, 64, -72, 72, 116, 176, -64, -272, 460, -536,
+ -784, -280, 348, 108, -752, -132, 524, -540, -776, 116, -296,
+ -1196, -288, -560, 1040, -472, 116, -848, -1116, 116, 636, 696,
+ 284, -176, 1016, 204, -864, -648, -248, 356, 972, -584, -204,
+ 264, 880, 528, -24, -184, 116, 448, -144, 828, 524, 212,
+ -212, 52, 12, 200, 268, -488, -404, -880, 824, -672, -40,
+ 908, -248, 500, 716, -576, 492, -576, 16, 720, -108, 384,
+ 124, 344, 280, 576, -500, 252, 104, -308, 196, -188, -8,
+ 1268, 296, 1032, -1196, 436, 316, 372, -432, -200, -660, 704,
+ -224, 596, -132, 268, 32, -452, 884, 104, -1008, 424, -1348,
+ -280, 4, -1168, 368, 476, 696, 300, -8, 24, 180, -592,
+ -196, 388, 304, 500, 724, -160, 244, -84, 272, -256, -420,
+ 320, 208, -144, -156, 156, 364, 452, 28, 540, 316, 220,
+ -644, -248, 464, 72, 360, 32, -388, 496, -680, -48, 208,
+ -116, -408, 60, -604, -392, 548, -840, 784, -460, 656, -544,
+ -388, -264, 908, -800, -628, -612, -568, 572, -220, 164, 288,
+ -16, -308, 308, -112, -636, -760, 280, -668, 432, 364, 240,
+ -196, 604, 340, 384, 196, 592, -44, -500, 432, -580, -132,
+ 636, -76, 392, 4, -412, 540, 508, 328, -356, -36, 16,
+ -220, -64, -248, -60, 24, -192, 368, 1040, 92, -24, -1044,
+ -32, 40, 104, 148, 192, -136, -520, 56, -816, -224, 732,
+ 392, 356, 212, -80, -424, -1008, -324, 588, -1496, 576, 460,
+ -816, -848, 56, -580, -92, -1372, -112, -496, 200, 364, 52,
+ -140, 48, -48, -60, 84, 72, 40, 132, -356, -268, -104,
+ -284, -404, 732, -520, 164, -304, -540, 120, 328, -76, -460,
+ 756, 388, 588, 236, -436, -72, -176, -404, -316, -148, 716,
+ -604, 404, -72, -88, -888, -68, 944, 88, -220, -344, 960,
+ 472, 460, -232, 704, 120, 832, -228, 692, -508, 132, -476,
+ 844, -748, -364, -44, 1116, -1104, -1056, 76, 428, 552, -692,
+ 60, 356, 96, -384, -188, -612, -576, 736, 508, 892, 352,
+ -1132, 504, -24, -352, 324, 332, -600, -312, 292, 508, -144,
+ -8, 484, 48, 284, -260, -240, 256, -100, -292, -204, -44,
+ 472, -204, 908, -188, -1000, -256, 92, 1164, -392, 564, 356,
+ 652, -28, -884, 256, 484, -192, 760, -176, 376, -524, -452,
+ -436, 860, -736, 212, 124, 504, -476, 468, 76, -472, 552,
+ -692, -944, -620, 740, -240, 400, 132, 20, 192, -196, 264,
+ -668, -1012, -60, 296, -316, -828, 76, -156, 284, -768, -448,
+ -832, 148, 248, 652, 616, 1236, 288, -328, -400, -124, 588,
+ 220, 520, -696, 1032, 768, -740, -92, -272, 296, 448, -464,
+ 412, -200, 392, 440, -200, 264, -152, -260, 320, 1032, 216,
+ 320, -8, -64, 156, -1016, 1084, 1172, 536, 484, -432, 132,
+ 372, -52, -256, 84, 116, -352, 48, 116, 304, -384, 412,
+ 924, -300, 528, 628, 180, 648, 44, -980, -220, 1320, 48,
+ 332, 748, 524, -268, -720, 540, -276, 564, -344, -208, -196,
+ 436, 896, 88, -392, 132, 80, -964, -288, 568, 56, -48,
+ -456, 888, 8, 552, -156, -292, 948, 288, 128, -716, -292,
+ 1192, -152, 876, 352, -600, -260, -812, -468, -28, -120, -32,
+ -44, 1284, 496, 192, 464, 312, -76, -516, -380, -456, -1012,
+ -48, 308, -156, 36, 492, -156, -808, 188, 1652, 68, -120,
+ -116, 316, 160, -140, 352, 808, -416, 592, 316, -480, 56,
+ 528, -204, -568, 372, -232, 752, -344, 744, -4, 324, -416,
+ -600, 768, 268, -248, -88, -132, -420, -432, 80, -288, 404,
+ -316, -1216, -588, 520, -108, 92, -320, 368, -480, -216, -92,
+ 1688, -300, 180, 1020, -176, 820, -68, -228, -260, 436, -904,
+ 20, 40, -508, 440, -736, 312, 332, 204, 760, -372, 728,
+ 96, -20, -632, -520, -560, 336, 1076, -64, -532, 776, 584,
+ 192, 396, -728, -520, 276, -188, 80, -52, -612, -252, -48,
+ 648, 212, -688, 228, -52, -260, 428, -412, -272, -404, 180,
+ 816, -796, 48, 152, 484, -88, -216, 988, 696, 188, -528,
+ 648, -116, -180, 316, 476, 12, -564, 96, 476, -252, -364,
+ -376, -392, 556, -256, -576, 260, -352, 120, -16, -136, -260,
+ -492, 72, 556, 660, 580, 616, 772, 436, 424, -32, -324,
+ -1268, 416, -324, -80, 920, 160, 228, 724, 32, -516, 64,
+ 384, 68, -128, 136, 240, 248, -204, -68, 252, -932, -120,
+ -480, -628, -84, 192, 852, -404, -288, -132, 204, 100, 168,
+ -68, -196, -868, 460, 1080, 380, -80, 244, 0, 484, -888,
+ 64, 184, 352, 600, 460, 164, 604, -196, 320, -64, 588,
+ -184, 228, 12, 372, 48, -848, -344, 224, 208, -200, 484,
+ 128, -20, 272, -468, -840, 384, 256, -720, -520, -464, -580,
+ 112, -120, 644, -356, -208, -608, -528, 704, 560, -424, 392,
+ 828, 40, 84, 200, -152, 0, -144, 584, 280, -120, 80,
+ -556, -972, -196, -472, 724, 80, 168, -32, 88, 160, -688,
+ 0, 160, 356, 372, -776, 740, -128, 676, -248, -480, 4,
+ -364, 96, 544, 232, -1032, 956, 236, 356, 20, -40, 300,
+ 24, -676, -596, 132, 1120, -104, 532, -1096, 568, 648, 444,
+ 508, 380, 188, -376, -604, 1488, 424, 24, 756, -220, -192,
+ 716, 120, 920, 688, 168, 44, -460, 568, 284, 1144, 1160,
+ 600, 424, 888, 656, -356, -320, 220, 316, -176, -724, -188,
+ -816, -628, -348, -228, -380, 1012, -452, -660, 736, 928, 404,
+ -696, -72, -268, -892, 128, 184, -344, -780, 360, 336, 400,
+ 344, 428, 548, -112, 136, -228, -216, -820, -516, 340, 92,
+ -136, 116, -300, 376, -244, 100, -316, -520, -284, -12, 824,
+ 164, -548, -180, -128, 116, -924, -828, 268, -368, -580, 620,
+ 192, 160, 0, -1676, 1068, 424, -56, -360, 468, -156, 720,
+ 288, -528, 556, -364, 548, -148, 504, 316, 152, -648, -620,
+ -684, -24, -376, -384, -108, -920, -1032, 768, 180, -264, -508,
+ -1268, -260, -60, 300, -240, 988, 724, -376, -576, -212, -736,
+ 556, 192, 1092, -620, -880, 376, -56, -4, -216, -32, 836,
+ 268, 396, 1332, 864, -600, 100, 56, -412, -92, 356, 180,
+ 884, -468, -436, 292, -388, -804, -704, -840, 368, -348, 140,
+ -724, 1536, 940, 372, 112, -372, 436, -480, 1136, 296, -32,
+ -228, 132, -48, -220, 868, -1016, -60, -1044, -464, 328, 916,
+ 244, 12, -736, -296, 360, 468, -376, -108, -92, 788, 368,
+ -56, 544, 400, -672, -420, 728, 16, 320, 44, -284, -380,
+ -796, 488, 132, 204, -596, -372, 88, -152, -908, -636, -572,
+ -624, -116, -692, -200, -56, 276, -88, 484, -324, 948, 864,
+ 1000, -456, -184, -276, 292, -296, 156, 676, 320, 160, 908,
+ -84, -1236, -288, -116, 260, -372, -644, 732, -756, -96, 84,
+ 344, -520, 348, -688, 240, -84, 216, -1044, -136, -676, -396,
+ -1500, 960, -40, 176, 168, 1516, 420, -504, -344, -364, -360,
+ 1216, -940, -380, -212, 252, -660, -708, 484, -444, -152, 928,
+ -120, 1112, 476, -260, 560, -148, -344, 108, -196, 228, -288,
+ 504, 560, -328, -88, 288, -1008, 460, -228, 468, -836, -196,
+ 76, 388, 232, 412, -1168, -716, -644, 756, -172, -356, -504,
+ 116, 432, 528, 48, 476, -168, -608, 448, 160, -532, -272,
+ 28, -676, -12, 828, 980, 456, 520, 104, -104, 256, -344,
+ -4, -28, -368, -52, -524, -572, -556, -200, 768, 1124, -208,
+ -512, 176, 232, 248, -148, -888, 604, -600, -304, 804, -156,
+ -212, 488, -192, -804, -256, 368, -360, -916, -328, 228, -240,
+ -448, -472, 856, -556, -364, 572, -12, -156, -368, -340, 432,
+ 252, -752, -152, 288, 268, -580, -848, -592, 108, -76, 244,
+ 312, -716, 592, -80, 436, 360, 4, -248, 160, 516, 584,
+ 732, 44, -468, -280, -292, -156, -588, 28, 308, 912, 24,
+ 124, 156, 180, -252, 944, -924, -772, -520, -428, -624, 300,
+ -212, -1144, 32, -724, 800, -1128, -212, -1288, -848, 180, -416,
+ 440, 192, -576, -792, -76, -1080, 80, -532, -352, -132, 380,
+ -820, 148, 1112, 128, 164, 456, 700, -924, 144, -668, -384,
+ 648, -832, 508, 552, -52, -100, -656, 208, -568, 748, -88,
+ 680, 232, 300, 192, -408, -1012, -152, -252, -268, 272, -876,
+ -664, -648, -332, -136, 16, 12, 1152, -28, 332, -536, 320,
+ -672, -460, -316, 532, -260, 228, -40, 1052, -816, 180, 88,
+ -496, -556, -672, -368, 428, 92, 356, 404, -408, 252, 196,
+ -176, -556, 792, 268, 32, 372, 40, 96, -332, 328, 120,
+ 372, -900, -40, 472, -264, -592, 952, 128, 656, 112, 664,
+ -232, 420, 4, -344, -464, 556, 244, -416, -32, 252, 0,
+ -412, 188, -696, 508, -476, 324, -1096, 656, -312, 560, 264,
+ -136, 304, 160, -64, -580, 248, 336, -720, 560, -348, -288,
+ -276, -196, -500, 852, -544, -236, -1128, -992, -776, 116, 56,
+ 52, 860, 884, 212, -12, 168, 1020, 512, -552, 924, -148,
+ 716, 188, 164, -340, -520, -184, 880, -152, -680, -208, -1156,
+ -300, -528, -472, 364, 100, -744, -1056, -32, 540, 280, 144,
+ -676, -32, -232, -280, -224, 96, 568, -76, 172, 148, 148,
+ 104, 32, -296, -32, 788, -80, 32, -16, 280, 288, 944,
+ 428, -484
+};
diff --git a/libavcodec/aom_film_grain.h b/libavcodec/aom_film_grain.h
new file mode 100644
index 0000000000..5d772bd7d1
--- /dev/null
+++ b/libavcodec/aom_film_grain.h
@@ -0,0 +1,38 @@
+/*
+ * AOM film grain synthesis
+ * Copyright (c) 2021 Niklas Haas <ffmpeg@haasn.xyz>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * AOM film grain synthesis.
+ * @author Niklas Haas <ffmpeg@haasn.xyz>
+ */
+
+#ifndef AVCODEC_AOM_FILM_GRAIN_H
+#define AVCODEC_AOM_FILM_GRAIN_H
+
+#include "libavutil/film_grain_params.h"
+
+// Synthesizes film grain on top of `in` and stores the result to `out`. `out`
+// must already have been allocated and set to the same size and format as `in`.
+int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in,
+ const AVFilmGrainParams *params);
+
+#endif /* AVCODEC_AOM_FILM_GRAIN_H */
diff --git a/libavcodec/aom_film_grain_template.c b/libavcodec/aom_film_grain_template.c
new file mode 100644
index 0000000000..5f9f29f1fa
--- /dev/null
+++ b/libavcodec/aom_film_grain_template.c
@@ -0,0 +1,577 @@
+/*
+ * AOM film grain synthesis
+ * Copyright (c) 2023 Niklas Haas <ffmpeg@haasn.xyz>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/*
+ * Copyright © 2018, Niklas Haas
+ * Copyright © 2018, VideoLAN and dav1d authors
+ * Copyright © 2018, Two Orioles, LLC
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "bit_depth_template.c"
+
+#undef entry
+#undef bitdepth
+#undef bitdepth_max
+#undef HBD_DECL
+#undef HBD_CALL
+#undef SCALING_SIZE
+
+#if BIT_DEPTH > 8
+# define entry int16_t
+# define bitdepth_max ((1 << bitdepth) - 1)
+# define HBD_DECL , const int bitdepth
+# define HBD_CALL , bitdepth
+# define SCALING_SIZE 4096
+#else
+# define entry int8_t
+# define bitdepth 8
+# define bitdepth_max UINT8_MAX
+# define HBD_DECL
+# define HBD_CALL
+# define SCALING_SIZE 256
+#endif
+
+static void FUNC(generate_grain_y_c)(entry buf[][GRAIN_WIDTH],
+ const AVFilmGrainParams *const params
+ HBD_DECL)
+{
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const int bitdepth_min_8 = bitdepth - 8;
+ unsigned seed = params->seed;
+ const int shift = 4 - bitdepth_min_8 + data->grain_scale_shift;
+ const int grain_ctr = 128 << bitdepth_min_8;
+ const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
+
+ const int ar_pad = 3;
+ const int ar_lag = data->ar_coeff_lag;
+
+ for (int y = 0; y < GRAIN_HEIGHT; y++) {
+ for (int x = 0; x < GRAIN_WIDTH; x++) {
+ const int value = get_random_number(11, &seed);
+ buf[y][x] = round2(gaussian_sequence[ value ], shift);
+ }
+ }
+
+ for (int y = ar_pad; y < GRAIN_HEIGHT; y++) {
+ for (int x = ar_pad; x < GRAIN_WIDTH - ar_pad; x++) {
+ const int8_t *coeff = data->ar_coeffs_y;
+ int sum = 0, grain;
+ for (int dy = -ar_lag; dy <= 0; dy++) {
+ for (int dx = -ar_lag; dx <= ar_lag; dx++) {
+ if (!dx && !dy)
+ break;
+ sum += *(coeff++) * buf[y + dy][x + dx];
+ }
+ }
+
+ grain = buf[y][x] + round2(sum, data->ar_coeff_shift);
+ buf[y][x] = av_clip(grain, grain_min, grain_max);
+ }
+ }
+}
+
+static void
+FUNC(generate_grain_uv_c)(entry buf[][GRAIN_WIDTH],
+ const entry buf_y[][GRAIN_WIDTH],
+ const AVFilmGrainParams *const params, const intptr_t uv,
+ const int subx, const int suby HBD_DECL)
+{
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const int bitdepth_min_8 = bitdepth - 8;
+ unsigned seed = params->seed ^ (uv ? 0x49d8 : 0xb524);
+ const int shift = 4 - bitdepth_min_8 + data->grain_scale_shift;
+ const int grain_ctr = 128 << bitdepth_min_8;
+ const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
+
+ const int chromaW = subx ? SUB_GRAIN_WIDTH : GRAIN_WIDTH;
+ const int chromaH = suby ? SUB_GRAIN_HEIGHT : GRAIN_HEIGHT;
+
+ const int ar_pad = 3;
+ const int ar_lag = data->ar_coeff_lag;
+
+ for (int y = 0; y < chromaH; y++) {
+ for (int x = 0; x < chromaW; x++) {
+ const int value = get_random_number(11, &seed);
+ buf[y][x] = round2(gaussian_sequence[ value ], shift);
+ }
+ }
+
+ for (int y = ar_pad; y < chromaH; y++) {
+ for (int x = ar_pad; x < chromaW - ar_pad; x++) {
+ const int8_t *coeff = data->ar_coeffs_uv[uv];
+ int sum = 0, grain;
+ for (int dy = -ar_lag; dy <= 0; dy++) {
+ for (int dx = -ar_lag; dx <= ar_lag; dx++) {
+ // For the final (current) pixel, we need to add in the
+ // contribution from the luma grain texture
+ if (!dx && !dy) {
+ const int lumaX = ((x - ar_pad) << subx) + ar_pad;
+ const int lumaY = ((y - ar_pad) << suby) + ar_pad;
+ int luma = 0;
+ if (!data->num_y_points)
+ break;
+ for (int i = 0; i <= suby; i++) {
+ for (int j = 0; j <= subx; j++) {
+ luma += buf_y[lumaY + i][lumaX + j];
+ }
+ }
+ luma = round2(luma, subx + suby);
+ sum += luma * (*coeff);
+ break;
+ }
+
+ sum += *(coeff++) * buf[y + dy][x + dx];
+ }
+ }
+
+ grain = buf[y][x] + round2(sum, data->ar_coeff_shift);
+ buf[y][x] = av_clip(grain, grain_min, grain_max);
+ }
+ }
+}
+
+// samples from the correct block of a grain LUT, while taking into account the
+// offsets provided by the offsets cache
+static inline entry FUNC(sample_lut)(const entry grain_lut[][GRAIN_WIDTH],
+ const int offsets[2][2],
+ const int subx, const int suby,
+ const int bx, const int by,
+ const int x, const int y)
+{
+ const int randval = offsets[bx][by];
+ const int offx = 3 + (2 >> subx) * (3 + (randval >> 4));
+ const int offy = 3 + (2 >> suby) * (3 + (randval & 0xF));
+ return grain_lut[offy + y + (FG_BLOCK_SIZE >> suby) * by]
+ [offx + x + (FG_BLOCK_SIZE >> subx) * bx];
+}
+
+static void FUNC(fgy_32x32xn_c)(pixel *const dst_row, const pixel *const src_row,
+ const ptrdiff_t stride,
+ const AVFilmGrainParams *const params, const size_t pw,
+ const uint8_t scaling[SCALING_SIZE],
+ const entry grain_lut[][GRAIN_WIDTH],
+ const int bh, const int row_num HBD_DECL)
+{
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const int rows = 1 + (data->overlap_flag && row_num > 0);
+ const int bitdepth_min_8 = bitdepth - 8;
+ const int grain_ctr = 128 << bitdepth_min_8;
+ const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
+ unsigned seed[2];
+ int offsets[2 /* col offset */][2 /* row offset */];
+
+ int min_value, max_value;
+ if (data->limit_output_range) {
+ min_value = 16 << bitdepth_min_8;
+ max_value = 235 << bitdepth_min_8;
+ } else {
+ min_value = 0;
+ max_value = bitdepth_max;
+ }
+
+ // seed[0] contains the current row, seed[1] contains the previous
+ for (int i = 0; i < rows; i++) {
+ seed[i] = params->seed;
+ seed[i] ^= (((row_num - i) * 37 + 178) & 0xFF) << 8;
+ seed[i] ^= (((row_num - i) * 173 + 105) & 0xFF);
+ }
+
+ av_assert1(stride % (FG_BLOCK_SIZE * sizeof(pixel)) == 0);
+
+ // process this row in FG_BLOCK_SIZE^2 blocks
+ for (unsigned bx = 0; bx < pw; bx += FG_BLOCK_SIZE) {
+ const int bw = FFMIN(FG_BLOCK_SIZE, (int) pw - bx);
+ const pixel *src;
+ pixel *dst;
+ int noise;
+
+ // x/y block offsets to compensate for overlapped regions
+ const int ystart = data->overlap_flag && row_num ? FFMIN(2, bh) : 0;
+ const int xstart = data->overlap_flag && bx ? FFMIN(2, bw) : 0;
+
+ static const int w[2][2] = { { 27, 17 }, { 17, 27 } };
+
+ if (data->overlap_flag && bx) {
+ // shift previous offsets left
+ for (int i = 0; i < rows; i++)
+ offsets[1][i] = offsets[0][i];
+ }
+
+ // update current offsets
+ for (int i = 0; i < rows; i++)
+ offsets[0][i] = get_random_number(8, &seed[i]);
+
+#define add_noise_y(x, y, grain) \
+ src = (const pixel*)((const char*)src_row + (y) * stride) + (x) + bx; \
+ dst = (pixel*)((char*)dst_row + (y) * stride) + (x) + bx; \
+ noise = round2(scaling[ *src ] * (grain), data->scaling_shift); \
+ *dst = av_clip(*src + noise, min_value, max_value);
+
+ for (int y = ystart; y < bh; y++) {
+ // Non-overlapped image region (straightforward)
+ for (int x = xstart; x < bw; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 0, 0, x, y);
+ add_noise_y(x, y, grain);
+ }
+
+ // Special case for overlapped column
+ for (int x = 0; x < xstart; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 0, 0, x, y);
+ int old = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 1, 0, x, y);
+ grain = round2(old * w[x][0] + grain * w[x][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+ add_noise_y(x, y, grain);
+ }
+ }
+
+ for (int y = 0; y < ystart; y++) {
+ // Special case for overlapped row (sans corner)
+ for (int x = xstart; x < bw; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 0, 0, x, y);
+ int old = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 0, 1, x, y);
+ grain = round2(old * w[y][0] + grain * w[y][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+ add_noise_y(x, y, grain);
+ }
+
+ // Special case for doubly-overlapped corner
+ for (int x = 0; x < xstart; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 0, 0, x, y);
+ int top = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 0, 1, x, y);
+ int old = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 1, 1, x, y);
+
+ // Blend the top pixel with the top left block
+ top = round2(old * w[x][0] + top * w[x][1], 5);
+ top = av_clip(top, grain_min, grain_max);
+
+ // Blend the current pixel with the left block
+ old = FUNC(sample_lut)(grain_lut, offsets, 0, 0, 1, 0, x, y);
+ grain = round2(old * w[x][0] + grain * w[x][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+
+ // Mix the row rows together and apply grain
+ grain = round2(top * w[y][0] + grain * w[y][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+ add_noise_y(x, y, grain);
+ }
+ }
+ }
+}
+
+static void
+FUNC(fguv_32x32xn_c)(pixel *const dst_row, const pixel *const src_row,
+ const ptrdiff_t stride, const AVFilmGrainParams *const params,
+ const size_t pw, const uint8_t scaling[SCALING_SIZE],
+ const entry grain_lut[][GRAIN_WIDTH], const int bh,
+ const int row_num, const pixel *const luma_row,
+ const ptrdiff_t luma_stride, const int uv, const int is_id,
+ const int sx, const int sy HBD_DECL)
+{
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const int rows = 1 + (data->overlap_flag && row_num > 0);
+ const int bitdepth_min_8 = bitdepth - 8;
+ const int grain_ctr = 128 << bitdepth_min_8;
+ const int grain_min = -grain_ctr, grain_max = grain_ctr - 1;
+ unsigned seed[2];
+ int offsets[2 /* col offset */][2 /* row offset */];
+
+ int min_value, max_value;
+ if (data->limit_output_range) {
+ min_value = 16 << bitdepth_min_8;
+ max_value = (is_id ? 235 : 240) << bitdepth_min_8;
+ } else {
+ min_value = 0;
+ max_value = bitdepth_max;
+ }
+
+ // seed[0] contains the current row, seed[1] contains the previous
+ for (int i = 0; i < rows; i++) {
+ seed[i] = params->seed;
+ seed[i] ^= (((row_num - i) * 37 + 178) & 0xFF) << 8;
+ seed[i] ^= (((row_num - i) * 173 + 105) & 0xFF);
+ }
+
+ av_assert1(stride % (FG_BLOCK_SIZE * sizeof(pixel)) == 0);
+
+ // process this row in FG_BLOCK_SIZE^2 blocks (subsampled)
+ for (unsigned bx = 0; bx < pw; bx += FG_BLOCK_SIZE >> sx) {
+ const int bw = FFMIN(FG_BLOCK_SIZE >> sx, (int)(pw - bx));
+ int val, lx, ly, noise;
+ const pixel *src, *luma;
+ pixel *dst, avg;
+
+ // x/y block offsets to compensate for overlapped regions
+ const int ystart = data->overlap_flag && row_num ? FFMIN(2 >> sy, bh) : 0;
+ const int xstart = data->overlap_flag && bx ? FFMIN(2 >> sx, bw) : 0;
+
+ static const int w[2 /* sub */][2 /* off */][2] = {
+ { { 27, 17 }, { 17, 27 } },
+ { { 23, 22 } },
+ };
+
+ if (data->overlap_flag && bx) {
+ // shift previous offsets left
+ for (int i = 0; i < rows; i++)
+ offsets[1][i] = offsets[0][i];
+ }
+
+ // update current offsets
+ for (int i = 0; i < rows; i++)
+ offsets[0][i] = get_random_number(8, &seed[i]);
+
+#define add_noise_uv(x, y, grain) \
+ lx = (bx + x) << sx; \
+ ly = y << sy; \
+ luma = (const pixel*)((const char*)luma_row + ly * luma_stride) + lx;\
+ avg = luma[0]; \
+ if (sx) \
+ avg = (avg + luma[1] + 1) >> 1; \
+ src = (const pixel*)((const char *)src_row + (y) * stride) + bx + (x);\
+ dst = (pixel *) ((char *) dst_row + (y) * stride) + bx + (x); \
+ val = avg; \
+ if (!data->chroma_scaling_from_luma) { \
+ const int combined = avg * data->uv_mult_luma[uv] + \
+ *src * data->uv_mult[uv]; \
+ val = av_clip( (combined >> 6) + \
+ (data->uv_offset[uv] * (1 << bitdepth_min_8)), \
+ 0, bitdepth_max ); \
+ } \
+ noise = round2(scaling[ val ] * (grain), data->scaling_shift); \
+ *dst = av_clip(*src + noise, min_value, max_value);
+
+ for (int y = ystart; y < bh; y++) {
+ // Non-overlapped image region (straightforward)
+ for (int x = xstart; x < bw; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 0, 0, x, y);
+ add_noise_uv(x, y, grain);
+ }
+
+ // Special case for overlapped column
+ for (int x = 0; x < xstart; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 0, 0, x, y);
+ int old = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 1, 0, x, y);
+ grain = round2(old * w[sx][x][0] + grain * w[sx][x][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+ add_noise_uv(x, y, grain);
+ }
+ }
+
+ for (int y = 0; y < ystart; y++) {
+ // Special case for overlapped row (sans corner)
+ for (int x = xstart; x < bw; x++) {
+ int grain = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 0, 0, x, y);
+ int old = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 0, 1, x, y);
+ grain = round2(old * w[sy][y][0] + grain * w[sy][y][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+ add_noise_uv(x, y, grain);
+ }
+
+ // Special case for doubly-overlapped corner
+ for (int x = 0; x < xstart; x++) {
+ int top = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 0, 1, x, y);
+ int old = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 1, 1, x, y);
+ int grain = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 0, 0, x, y);
+
+ // Blend the top pixel with the top left block
+ top = round2(old * w[sx][x][0] + top * w[sx][x][1], 5);
+ top = av_clip(top, grain_min, grain_max);
+
+ // Blend the current pixel with the left block
+ old = FUNC(sample_lut)(grain_lut, offsets, sx, sy, 1, 0, x, y);
+ grain = round2(old * w[sx][x][0] + grain * w[sx][x][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+
+ // Mix the row rows together and apply to image
+ grain = round2(top * w[sy][y][0] + grain * w[sy][y][1], 5);
+ grain = av_clip(grain, grain_min, grain_max);
+ add_noise_uv(x, y, grain);
+ }
+ }
+ }
+}
+
+static void FUNC(generate_scaling)(const uint8_t points[][2], const int num,
+ uint8_t scaling[SCALING_SIZE] HBD_DECL)
+{
+ const int shift_x = bitdepth - 8;
+ const int scaling_size = 1 << bitdepth;
+ const int max_value = points[num - 1][0] << shift_x;
+ av_assert0(scaling_size <= SCALING_SIZE);
+
+ if (num == 0) {
+ memset(scaling, 0, scaling_size);
+ return;
+ }
+
+ // Fill up the preceding entries with the initial value
+ memset(scaling, points[0][1], points[0][0] << shift_x);
+
+ // Linearly interpolate the values in the middle
+ for (int i = 0; i < num - 1; i++) {
+ const int bx = points[i][0];
+ const int by = points[i][1];
+ const int ex = points[i+1][0];
+ const int ey = points[i+1][1];
+ const int dx = ex - bx;
+ const int dy = ey - by;
+ const int delta = dy * ((0x10000 + (dx >> 1)) / dx);
+ av_assert1(dx > 0);
+ for (int x = 0, d = 0x8000; x < dx; x++) {
+ scaling[(bx + x) << shift_x] = by + (d >> 16);
+ d += delta;
+ }
+ }
+
+ // Fill up the remaining entries with the final value
+ memset(&scaling[max_value], points[num - 1][1], scaling_size - max_value);
+
+#if BIT_DEPTH != 8
+ for (int i = 0; i < num - 1; i++) {
+ const int pad = 1 << shift_x, rnd = pad >> 1;
+ const int bx = points[i][0] << shift_x;
+ const int ex = points[i+1][0] << shift_x;
+ const int dx = ex - bx;
+ for (int x = 0; x < dx; x += pad) {
+ const int range = scaling[bx + x + pad] - scaling[bx + x];
+ for (int n = 1, r = rnd; n < pad; n++) {
+ r += range;
+ scaling[bx + x + n] = scaling[bx + x] + (r >> shift_x);
+ }
+ }
+ }
+#endif
+}
+
+static av_always_inline void
+FUNC(apply_grain_row)(AVFrame *out, const AVFrame *in,
+ const int ss_x, const int ss_y,
+ const uint8_t scaling[3][SCALING_SIZE],
+ const entry grain_lut[3][GRAIN_HEIGHT+1][GRAIN_WIDTH],
+ const AVFilmGrainParams *params,
+ const int row HBD_DECL)
+{
+ // Synthesize grain for the affected planes
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const int cpw = (out->width + ss_x) >> ss_x;
+ const int is_id = out->colorspace == AVCOL_SPC_RGB;
+ const int bh = (FFMIN(out->height - row * FG_BLOCK_SIZE, FG_BLOCK_SIZE) + ss_y) >> ss_y;
+ const ptrdiff_t uv_off = row * FG_BLOCK_SIZE * out->linesize[1] >> ss_y;
+ pixel *const luma_src = (pixel *)
+ ((char *) in->data[0] + row * FG_BLOCK_SIZE * in->linesize[0]);
+
+ if (data->num_y_points) {
+ const int bh = FFMIN(out->height - row * FG_BLOCK_SIZE, FG_BLOCK_SIZE);
+ const ptrdiff_t off = row * FG_BLOCK_SIZE * out->linesize[0];
+ FUNC(fgy_32x32xn_c)((pixel *) ((char *) out->data[0] + off), luma_src,
+ out->linesize[0], params, out->width, scaling[0],
+ grain_lut[0], bh, row HBD_CALL);
+ }
+
+ if (!data->num_uv_points[0] && !data->num_uv_points[1] &&
+ !data->chroma_scaling_from_luma)
+ {
+ return;
+ }
+
+ // extend padding pixels
+ if (out->width & ss_x) {
+ pixel *ptr = luma_src;
+ for (int y = 0; y < bh; y++) {
+ ptr[out->width] = ptr[out->width - 1];
+ ptr = (pixel *) ((char *) ptr + (in->linesize[0] << ss_y));
+ }
+ }
+
+ if (data->chroma_scaling_from_luma) {
+ for (int pl = 0; pl < 2; pl++)
+ FUNC(fguv_32x32xn_c)((pixel *) ((char *) out->data[1 + pl] + uv_off),
+ (const pixel *) ((const char *) in->data[1 + pl] + uv_off),
+ in->linesize[1], params, cpw, scaling[0],
+ grain_lut[1 + pl], bh, row, luma_src,
+ in->linesize[0], pl, is_id, ss_x, ss_y HBD_CALL);
+ } else {
+ for (int pl = 0; pl < 2; pl++) {
+ if (data->num_uv_points[pl]) {
+ FUNC(fguv_32x32xn_c)((pixel *) ((char *) out->data[1 + pl] + uv_off),
+ (const pixel *) ((const char *) in->data[1 + pl] + uv_off),
+ in->linesize[1], params, cpw, scaling[1 + pl],
+ grain_lut[1 + pl], bh, row, luma_src,
+ in->linesize[0], pl, is_id, ss_x, ss_y HBD_CALL);
+ }
+ }
+ }
+}
+
+static int FUNC(apply_film_grain)(AVFrame *out_frame, const AVFrame *in_frame,
+ const AVFilmGrainParams *params HBD_DECL)
+{
+ entry grain_lut[3][GRAIN_HEIGHT + 1][GRAIN_WIDTH];
+ uint8_t scaling[3][SCALING_SIZE];
+
+ const AVFilmGrainAOMParams *const data = &params->codec.aom;
+ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(out_frame->format);
+ const int rows = AV_CEIL_RSHIFT(out_frame->height, 5); /* log2(FG_BLOCK_SIZE) */
+ const int subx = desc->log2_chroma_w, suby = desc->log2_chroma_h;
+
+ // Generate grain LUTs as needed
+ FUNC(generate_grain_y_c)(grain_lut[0], params HBD_CALL);
+ if (data->num_uv_points[0] || data->chroma_scaling_from_luma)
+ FUNC(generate_grain_uv_c)(grain_lut[1], grain_lut[0], params, 0, subx, suby HBD_CALL);
+ if (data->num_uv_points[1] || data->chroma_scaling_from_luma)
+ FUNC(generate_grain_uv_c)(grain_lut[2], grain_lut[0], params, 1, subx, suby HBD_CALL);
+
+ // Generate scaling LUTs as needed
+ if (data->num_y_points || data->chroma_scaling_from_luma)
+ FUNC(generate_scaling)(data->y_points, data->num_y_points, scaling[0] HBD_CALL);
+ if (data->num_uv_points[0])
+ FUNC(generate_scaling)(data->uv_points[0], data->num_uv_points[0], scaling[1] HBD_CALL);
+ if (data->num_uv_points[1])
+ FUNC(generate_scaling)(data->uv_points[1], data->num_uv_points[1], scaling[2] HBD_CALL);
+
+ for (int row = 0; row < rows; row++) {
+ FUNC(apply_grain_row)(out_frame, in_frame, subx, suby, scaling, grain_lut,
+ params, row HBD_CALL);
+ }
+
+ return 0;
+}
--
2.41.0

View File

@ -1,319 +0,0 @@
From f50382cba60d106440f1ad83396ff7bed586a5ac Mon Sep 17 00:00:00 2001
Author: Niklas Haas <git@haasn.dev>
Date: Mon, 26 Feb 2024 14:12:53 +0100
Subject: [PATCH] avcodec/aom_film_grain: implement AFGS1 parsing
References: CVE-2024-32228
References: bsc#1227277
Upstream: Backport from upstream
Based on the AOMedia Film Grain Synthesis 1 (AFGS1) spec:
https://aomediacodec.github.io/afgs1-spec/
The parsing has been changed substantially relative to the AV1 film
grain OBU. In particular:
1. There is the possibility of maintaining multiple independent film
grain parameter sets, and decoders/players are recommended to pick
the one most appropriate for the intended display resolution. This
could also be used to e.g. switch between different grain profiles
without having to re-signal the appropriate coefficients.
2. Supporting this, it's possible to *predict* the grain coefficients
from previously signalled parameter sets, transmitting only the
residual.
3. When not predicting, the parameter sets are now stored as a series of
increments, rather than being directly transmitted.
4. There are several new AFGS1-exclusive fields.
I placed this parser in its own file, rather than h2645_sei.c, since
nothing in the generic AFGS1 film grain payload is specific to T.35, and
to compartmentalize the code base.
diff --git a/libavcodec/aom_film_grain.c b/libavcodec/aom_film_grain.c
index ffcd71b584..e302567ba5 100644
--- a/libavcodec/aom_film_grain.c
+++ b/libavcodec/aom_film_grain.c
@@ -29,6 +29,7 @@
#include "libavutil/imgutils.h"
#include "aom_film_grain.h"
+#include "get_bits.h"
// Common/shared helpers (not dependent on BIT_DEPTH)
static inline int get_random_number(const int bits, unsigned *const state) {
@@ -118,6 +119,243 @@ int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in,
return AVERROR_INVALIDDATA;
}
+int ff_aom_parse_film_grain_sets(AVFilmGrainAFGS1Params *s,
+ const uint8_t *payload, int payload_size)
+{
+ GetBitContext gbc, *gb = &gbc;
+ AVFilmGrainAOMParams *aom;
+ AVFilmGrainParams *fgp, *ref = NULL;
+ int ret, num_sets, n, i, uv, num_y_coeffs, update_grain, luma_only;
+
+ ret = init_get_bits8(gb, payload, payload_size);
+ if (ret < 0)
+ return ret;
+
+ s->enable = get_bits1(gb);
+ if (!s->enable)
+ return 0;
+
+ skip_bits(gb, 4); // reserved
+ num_sets = get_bits(gb, 3) + 1;
+ for (n = 0; n < num_sets; n++) {
+ int payload_4byte, payload_size, set_idx, apply_units_log2, vsc_flag;
+ int predict_scaling, predict_y_scaling, predict_uv_scaling[2];
+ int payload_bits, start_position;
+
+ start_position = get_bits_count(gb);
+ payload_4byte = get_bits1(gb);
+ payload_size = get_bits(gb, payload_4byte ? 2 : 8);
+ set_idx = get_bits(gb, 3);
+ fgp = &s->sets[set_idx];
+ aom = &fgp->codec.aom;
+
+ fgp->type = get_bits1(gb) ? AV_FILM_GRAIN_PARAMS_AV1 : AV_FILM_GRAIN_PARAMS_NONE;
+ if (!fgp->type)
+ continue;
+
+ fgp->seed = get_bits(gb, 16);
+ update_grain = get_bits1(gb);
+ if (!update_grain)
+ continue;
+
+ apply_units_log2 = get_bits(gb, 4);
+ fgp->width = get_bits(gb, 12) << apply_units_log2;
+ fgp->height = get_bits(gb, 12) << apply_units_log2;
+ luma_only = get_bits1(gb);
+ if (luma_only) {
+ fgp->subsampling_x = fgp->subsampling_y = 0;
+ } else {
+ fgp->subsampling_x = get_bits1(gb);
+ fgp->subsampling_y = get_bits1(gb);
+ }
+
+ fgp->bit_depth_luma = fgp->bit_depth_chroma = 0;
+ fgp->color_primaries = AVCOL_PRI_UNSPECIFIED;
+ fgp->color_trc = AVCOL_TRC_UNSPECIFIED;
+ fgp->color_space = AVCOL_SPC_UNSPECIFIED;
+ fgp->color_range = AVCOL_RANGE_UNSPECIFIED;
+
+ vsc_flag = get_bits1(gb); // video_signal_characteristics_flag
+ if (vsc_flag) {
+ int cicp_flag;
+ fgp->bit_depth_luma = get_bits(gb, 3) + 8;
+ if (!luma_only)
+ fgp->bit_depth_chroma = fgp->bit_depth_luma;
+ cicp_flag = get_bits1(gb);
+ if (cicp_flag) {
+ fgp->color_primaries = get_bits(gb, 8);
+ fgp->color_trc = get_bits(gb, 8);
+ fgp->color_space = get_bits(gb, 8);
+ fgp->color_range = get_bits1(gb) ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
+ if (fgp->color_primaries > AVCOL_PRI_NB ||
+ fgp->color_primaries == AVCOL_PRI_RESERVED ||
+ fgp->color_primaries == AVCOL_PRI_RESERVED0 ||
+ fgp->color_trc > AVCOL_TRC_NB ||
+ fgp->color_trc == AVCOL_TRC_RESERVED ||
+ fgp->color_trc == AVCOL_TRC_RESERVED0 ||
+ fgp->color_space > AVCOL_SPC_NB ||
+ fgp->color_space == AVCOL_SPC_RESERVED)
+ goto error;
+ }
+ }
+
+ predict_scaling = get_bits1(gb);
+ if (predict_scaling && (!ref || ref == fgp))
+ goto error; // prediction must be from valid, different set
+
+ predict_y_scaling = predict_scaling ? get_bits1(gb) : 0;
+ if (predict_y_scaling) {
+ int y_scale, y_offset, bits_res;
+ y_scale = get_bits(gb, 9) - 256;
+ y_offset = get_bits(gb, 9) - 256;
+ bits_res = get_bits(gb, 3);
+ if (bits_res) {
+ int res[14], pred, granularity;
+ aom->num_y_points = ref->codec.aom.num_y_points;
+ for (i = 0; i < aom->num_y_points; i++)
+ res[i] = get_bits(gb, bits_res);
+ granularity = get_bits(gb, 3);
+ for (i = 0; i < aom->num_y_points; i++) {
+ pred = ref->codec.aom.y_points[i][1];
+ pred = ((pred * y_scale + 8) >> 4) + y_offset;
+ pred += (res[i] - (1 << (bits_res - 1))) * granularity;
+ aom->y_points[i][0] = ref->codec.aom.y_points[i][0];
+ aom->y_points[i][1] = av_clip_uint8(pred);
+ }
+ }
+ } else {
+ aom->num_y_points = get_bits(gb, 4);
+ if (aom->num_y_points > 14) {
+ goto error;
+ } else if (aom->num_y_points) {
+ int bits_inc, bits_scaling;
+ int y_value = 0;
+ bits_inc = get_bits(gb, 3) + 1;
+ bits_scaling = get_bits(gb, 2) + 5;
+ for (i = 0; i < aom->num_y_points; i++) {
+ y_value += get_bits(gb, bits_inc);
+ if (y_value > UINT8_MAX)
+ goto error;
+ aom->y_points[i][0] = y_value;
+ aom->y_points[i][1] = get_bits(gb, bits_scaling);
+ }
+ }
+ }
+
+ if (luma_only) {
+ aom->chroma_scaling_from_luma = 0;
+ aom->num_uv_points[0] = aom->num_uv_points[1] = 0;
+ } else {
+ aom->chroma_scaling_from_luma = get_bits1(gb);
+ if (aom->chroma_scaling_from_luma) {
+ aom->num_uv_points[0] = aom->num_uv_points[1] = 0;
+ } else {
+ for (uv = 0; uv < 2; uv++) {
+ predict_uv_scaling[uv] = predict_scaling ? get_bits1(gb) : 0;
+ if (predict_uv_scaling[uv]) {
+ int uv_scale, uv_offset, bits_res;
+ uv_scale = get_bits(gb, 9) - 256;
+ uv_offset = get_bits(gb, 9) - 256;
+ bits_res = get_bits(gb, 3);
+ aom->uv_mult[uv] = ref->codec.aom.uv_mult[uv];
+ aom->uv_mult_luma[uv] = ref->codec.aom.uv_mult_luma[uv];
+ aom->uv_offset[uv] = ref->codec.aom.uv_offset[uv];
+ if (bits_res) {
+ int res[10], pred, granularity;
+ aom->num_uv_points[uv] = ref->codec.aom.num_uv_points[uv];
+ for (i = 0; i < aom->num_uv_points[uv]; i++)
+ res[i] = get_bits(gb, bits_res);
+ granularity = get_bits(gb, 3);
+ for (i = 0; i < aom->num_uv_points[uv]; i++) {
+ pred = ref->codec.aom.uv_points[uv][i][1];
+ pred = ((pred * uv_scale + 8) >> 4) + uv_offset;
+ pred += (res[i] - (1 << (bits_res - 1))) * granularity;
+ aom->uv_points[uv][i][0] = ref->codec.aom.uv_points[uv][i][0];
+ aom->uv_points[uv][i][1] = av_clip_uint8(pred);
+ }
+ }
+ } else {
+ int bits_inc, bits_scaling, uv_offset;
+ int uv_value = 0;
+ aom->num_uv_points[uv] = get_bits(gb, 4);
+ if (aom->num_uv_points[uv] > 10)
+ goto error;
+ bits_inc = get_bits(gb, 3) + 1;
+ bits_scaling = get_bits(gb, 2) + 5;
+ uv_offset = get_bits(gb, 8);
+ for (i = 0; i < aom->num_uv_points[uv]; i++) {
+ uv_value += get_bits(gb, bits_inc);
+ if (uv_value > UINT8_MAX)
+ goto error;
+ aom->uv_points[uv][i][0] = uv_value;
+ aom->uv_points[uv][i][1] = get_bits(gb, bits_scaling) + uv_offset;
+ }
+ }
+ }
+ }
+ }
+
+ aom->scaling_shift = get_bits(gb, 2) + 8;
+ aom->ar_coeff_lag = get_bits(gb, 2);
+ num_y_coeffs = 2 * aom->ar_coeff_lag * (aom->ar_coeff_lag + 1);
+ if (aom->num_y_points) {
+ int ar_bits = get_bits(gb, 2) + 5;
+ for (i = 0; i < num_y_coeffs; i++)
+ aom->ar_coeffs_y[i] = get_bits(gb, ar_bits) - (1 << (ar_bits - 1));
+ }
+ for (uv = 0; uv < 2; uv++) {
+ if (aom->chroma_scaling_from_luma || aom->num_uv_points[uv]) {
+ int ar_bits = get_bits(gb, 2) + 5;
+ for (i = 0; i < num_y_coeffs + !!aom->num_y_points; i++)
+ aom->ar_coeffs_uv[uv][i] = get_bits(gb, ar_bits) - (1 << (ar_bits - 1));
+ }
+ }
+ aom->ar_coeff_shift = get_bits(gb, 2) + 6;
+ aom->grain_scale_shift = get_bits(gb, 2);
+ for (uv = 0; uv < 2; uv++) {
+ if (aom->num_uv_points[uv] && !predict_uv_scaling[uv]) {
+ aom->uv_mult[uv] = get_bits(gb, 8) - 128;
+ aom->uv_mult_luma[uv] = get_bits(gb, 8) - 128;
+ aom->uv_offset[uv] = get_bits(gb, 9) - 256;
+ }
+ }
+ aom->overlap_flag = get_bits1(gb);
+ aom->limit_output_range = get_bits1(gb);
+
+ // use first set as reference only if it was fully transmitted
+ if (n == 0)
+ ref = fgp;
+
+ payload_bits = get_bits_count(gb) - start_position;
+ if (payload_bits > payload_size * 8)
+ goto error;
+ skip_bits(gb, payload_size * 8 - payload_bits);
+ }
+ return 0;
+
+error:
+ memset(s, 0, sizeof(*s));
+ return AVERROR_INVALIDDATA;
+}
+
+int ff_aom_attach_film_grain_sets(const AVFilmGrainAFGS1Params *s, AVFrame *frame)
+{
+ AVFilmGrainParams *fgp;
+ if (!s->enable)
+ return 0;
+
+ for (int i = 0; i < FF_ARRAY_ELEMS(s->sets); i++) {
+ if (s->sets[i].type != AV_FILM_GRAIN_PARAMS_AV1)
+ continue;
+ fgp = av_film_grain_params_create_side_data(frame);
+ if (!fgp)
+ return AVERROR(ENOMEM);
+ memcpy(fgp, &s->sets[i], sizeof(*fgp));
+ }
+
+ return 0;
+}
+
// Taken from the AV1 spec. Range is [-2048, 2047], mean is 0 and stddev is 512
static const int16_t gaussian_sequence[2048] = {
56, 568, -180, 172, 124, -84, 172, -64, -900, 24, 820,
diff --git a/libavcodec/aom_film_grain.h b/libavcodec/aom_film_grain.h
index 5d772bd7d1..1f8c78f657 100644
--- a/libavcodec/aom_film_grain.h
+++ b/libavcodec/aom_film_grain.h
@@ -30,9 +30,22 @@
#include "libavutil/film_grain_params.h"
+typedef struct AVFilmGrainAFGS1Params {
+ int enable;
+ AVFilmGrainParams sets[8];
+} AVFilmGrainAFGS1Params;
+
// Synthesizes film grain on top of `in` and stores the result to `out`. `out`
// must already have been allocated and set to the same size and format as `in`.
int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in,
const AVFilmGrainParams *params);
+// Parse AFGS1 parameter sets from an ITU-T T.35 payload. Returns 0 on success,
+// or a negative error code.
+int ff_aom_parse_film_grain_sets(AVFilmGrainAFGS1Params *s,
+ const uint8_t *payload, int payload_size);
+
+// Attach all valid film grain param sets to `frame`.
+int ff_aom_attach_film_grain_sets(const AVFilmGrainAFGS1Params *s, AVFrame *frame);
+
#endif /* AVCODEC_AOM_FILM_GRAIN_H */
--
2.41.0

BIN
ffmpeg-6.1.1.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

11
ffmpeg-6.1.1.tar.xz.asc Normal file
View File

@ -0,0 +1,11 @@
-----BEGIN PGP SIGNATURE-----
iQFMBAABCAA2FiEE/PmG6hXm4pOlZE8QtDIvBNZ2WNgFAmWQvW4YHGZmbXBlZy1k
ZXZlbEBmZm1wZWcub3JnAAoJELQyLwTWdljYWJgH+wVyt5Var56jG1YL+2cr9XCQ
E1pfyKEX4j23y4MtRhk/Oks1apqHZ3MtP+u/K+Z2nwqdUh8kMdczWBRqcSl/qxdr
Ak2uFVwIIg4eF03XplWjIbOdMJACaWTz2vOyX9GjwTe6rckcGHBZXd41IzYnJHLh
3pvxMp4TBxmiAjfrvzzMBFqgmD+WlmrYDqTsw1B1eq2OSNNjQzfd7VEy0+B/eQ13
T0kIC2vh/N1OcJloYW5I1Cb8zUmLRFztoVL5JXR41jFYgPxjpjG1hjS/bEB47qXb
7Kte43eesFaGWKBFYp8lU5IoIxuB9utXjPunZV8WVgVpslhptPLwe4EgBKeU1to=
=BdLd
-----END PGP SIGNATURE-----

BIN
ffmpeg-6.1.2.tar.xz (Stored with Git LFS)

Binary file not shown.

View File

@ -1,11 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iQFMBAABCgA2FiEE/PmG6hXm4pOlZE8QtDIvBNZ2WNgFAmasGfAYHGZmbXBlZy1k
ZXZlbEBmZm1wZWcub3JnAAoJELQyLwTWdljYVNIIAJCu/Rkjme60byzLy95eLyH2
3T5wptC9g8fuGCEDDt3D4bh958Cb4FZmQKMVZdwxWzaoFEkQ/3NavCNzFpHINrpz
/gZxqytv7YEyKBXdvvS54FDK9TITj2PabKn2fhSv9NIU6IYPObjTG7wjt+ycVn32
lVaxNFjKVm3C+8vzj5hUGK68MoMmXD5ltiUILAbSmtoCyUjhmo6gXiBmMnMn3QN1
Ulpp8TGS0oQ+FDVC7vMAZcIVQ1dV1K4LlacppqvoxcJRAMuQWHGbI+3om+d50ZR0
5VO3sS/lIXeVMNx5qoY4nM3q+HJS/AA0Ki3n8L+DUfusJNeHUOq2I9oNZiWE+AQ=
=2l0q
-----END PGP SIGNATURE-----

View File

@ -1,112 +1,16 @@
-------------------------------------------------------------------
Wed Jan 1 11:13:35 UTC 2025 - Dave Plater <davejplater@gmail.com>
- Update to version 6.1.2 and fix Factory build.
- Remove incorporated patches:
0001-avcodec-tests-rename-the-bundled-Mesa-AV1-vulkan-vid.patch,
ffmpeg-6-CVE-2024-7055.patch and ffmpeg-6-CVE-2024-32230.patch
Upstream changes:
See /usr/shar/doc/packages/ffmpeg-6/Changelog
-------------------------------------------------------------------
Mon Sep 30 12:34:56 UTC 2024 - olaf@aepfle.de
- Fix assertion due to missing priv_data cleanup on failed VAAPI
acceleration with 11013-avcodec-decode-clean-up-if-get_hw_frames_parameters-.patch
(ffmpeg#11013, vlc#28811)
-------------------------------------------------------------------
Thu Sep 26 10:02:20 UTC 2024 - Stefan Dirsch <sndirsch@suse.com>
- no longer build against libmfx; build also 15.5 against libvpl
(boo#1230983)
-------------------------------------------------------------------
Fri Sep 6 15:06:21 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-6-CVE-2024-7055.patch:
Backporting 3faadbe2 from upstream, Use 64bit for input size check,
Fixes: out of array read, Fixes: poc3.
(CVE-2024-7055, bsc#1229026)
-------------------------------------------------------------------
Sun Sep 1 18:04:27 UTC 2024 - Jan Engelhardt <jengelh@inai.de>
- Add 0001-libavcodec-arm-mlpdsp_armv5te-fix-label-format-to-wo.patch
[boo#1229338]
-------------------------------------------------------------------
Wed Aug 14 14:38:37 UTC 2024 - Manfred Hollstein <manfred.h@gmx.net>
- Remove ffmpeg-6-CVE-2024-32228-shim-5d7f234e.patch and
ffmpeg-6-CVE-2024-32228.patch to make the bot happy.
- Renumber patches.
-------------------------------------------------------------------
Tue Aug 13 18:59:14 UTC 2024 - Manfred Hollstein <manfred.h@gmx.net>
- Disable ffmpeg-6-CVE-2024-32228-shim-5d7f234e.patch and
ffmpeg-6-CVE-2024-32228.patch as they brake compilation with
BUILD_ORIG enabled, i.e. Packman.
-------------------------------------------------------------------
Fri Jul 26 14:28:59 UTC 2024 - Filip Kastl <filip.kastl@suse.com>
- Add ffmpeg-c99.patch so that the package conforms to the C99
standard and builds on i586 with GCC 14.
-------------------------------------------------------------------
Tue Jul 2 12:26:28 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-6-CVE-2024-32230.patch:
Backporting 96449cfe from upstream, Fix 1 line and one column images.
(CVE-2024-32230, bsc#1227296)
-------------------------------------------------------------------
Tue Jul 2 11:57:01 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-6-CVE-2024-32228.patch:
Backporting 45964876 from upstream, Fix segfault on invalid film
grain metadata.
(CVE-2024-32228, bsc#1227277)
-------------------------------------------------------------------
Tue Jul 2 11:56:01 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-6-CVE-2024-32228-shim-5d7f234e.patch:
Backporting 5d7f234e from upstream, document that there can be multiple
complex filtergraphs to prepare dependence code for CVE-2024-32228.
(CVE-2024-32228, bsc#1227277)
-------------------------------------------------------------------
Tue Jul 2 11:55:01 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-6-CVE-2024-32228-shim-f50382cb.patch:
Backporting f50382cb from upstream, implement AFGS1 parsing.
to prepare dependence code for CVE-2024-32228.
(CVE-2024-32228, bsc#1227277)
-------------------------------------------------------------------
Tue Jul 2 11:54:01 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-6-CVE-2024-32228-shim-1535d338.patch:
Backporting 1535d338 from upstream, add AOM film grain synthesis,
to prepare dependence code for CVE-2024-32228.
(CVE-2024-32228, bsc#1227277)
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Apr 23 14:05:28 UTC 2024 - Cliff Zhao <qzhao@suse.com> Thu Apr 23 14:05:28 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-CVE-2023-50008.patch: - Add ffmpeg-CVE-2023-50008.patch:
Backporting 5f87a68c from upstream, Fix memory leaks. Backporting 5f87a68c from upstream, Fix memory leaks.
(CVE-2023-50008, bsc#1223254) (CVE-2023-50008 bsc#1223254)
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Apr 23 12:22:53 UTC 2024 - Cliff Zhao <qzhao@suse.com> Thu Apr 23 12:22:53 UTC 2024 - Cliff Zhao <qzhao@suse.com>
- Add ffmpeg-CVE-2023-50007.patch: - Add ffmpeg-CVE-2023-50007.patch:
Backporting b1942734 from upstream, Fix crash with EOF handling. Backporting b1942734 from upstream, Fix crash with EOF handling.
(CVE-2023-50007, bsc#1223253) (CVE-2023-50007 bsc#1223253)
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Apr 22 12:41:55 UTC 2024 - Jan Engelhardt <jengelh@inai.de> Mon Apr 22 12:41:55 UTC 2024 - Jan Engelhardt <jengelh@inai.de>

View File

@ -16,8 +16,10 @@
# #
%define vers 6.1.2
%define flavor @BUILD_FLAVOR@%nil %define flavor @BUILD_FLAVOR@%nil
#
# preamble is present twice, watch out
#
%if "%flavor" != "ffmpeg-6-mini" %if "%flavor" != "ffmpeg-6-mini"
# Create proper conflicts to make sure we require all from one version # Create proper conflicts to make sure we require all from one version
@ -84,7 +86,7 @@
%define _major_expected 7 %define _major_expected 7
Name: ffmpeg-6 Name: ffmpeg-6
Version: 6.1.2 Version: 6.1.1
Release: 0 Release: 0
Summary: Set of libraries for working with various multimedia formats Summary: Set of libraries for working with various multimedia formats
License: GPL-3.0-or-later License: GPL-3.0-or-later
@ -108,6 +110,7 @@ Patch2: ffmpeg-new-coder-errors.diff
Patch3: ffmpeg-codec-choice.diff Patch3: ffmpeg-codec-choice.diff
Patch4: ffmpeg-4.2-dlopen-fdk_aac.patch Patch4: ffmpeg-4.2-dlopen-fdk_aac.patch
Patch5: work-around-abi-break.patch Patch5: work-around-abi-break.patch
Patch6: 0001-avcodec-tests-rename-the-bundled-Mesa-AV1-vulkan-vid.patch
Patch7: 0001-avfilter-asrc_afirsrc-fix-by-one-smaller-allocation-.patch Patch7: 0001-avfilter-asrc_afirsrc-fix-by-one-smaller-allocation-.patch
Patch8: 0001-avfilter-bwdif-account-for-chroma-sub-sampling-in-mi.patch Patch8: 0001-avfilter-bwdif-account-for-chroma-sub-sampling-in-mi.patch
Patch9: 0001-avfilter-af_dialoguenhance-fix-overreads.patch Patch9: 0001-avfilter-af_dialoguenhance-fix-overreads.patch
@ -115,18 +118,10 @@ Patch10: 0001-avfilter-af_dialoguenhance-simplify-channels-copy.patch
Patch11: 0001-avfilter-af_dialoguenhance-do-output-scaling-once.patch Patch11: 0001-avfilter-af_dialoguenhance-do-output-scaling-once.patch
Patch12: 0001-avutil-hwcontext-Don-t-assume-frames_uninit-is-reent.patch Patch12: 0001-avutil-hwcontext-Don-t-assume-frames_uninit-is-reent.patch
Patch13: 0001-avfilter-vf_codecview-fix-heap-buffer-overflow.patch Patch13: 0001-avfilter-vf_codecview-fix-heap-buffer-overflow.patch
Patch14: 0001-libavcodec-arm-mlpdsp_armv5te-fix-label-format-to-wo.patch
Patch15: 11013-avcodec-decode-clean-up-if-get_hw_frames_parameters-.patch
Patch90: ffmpeg-chromium.patch Patch90: ffmpeg-chromium.patch
Patch91: ffmpeg-dlopen-openh264.patch Patch91: ffmpeg-dlopen-openh264.patch
Patch92: ffmpeg-CVE-2023-50007.patch Patch92: ffmpeg-CVE-2023-50007.patch
Patch93: ffmpeg-CVE-2023-50008.patch Patch93: ffmpeg-CVE-2023-50008.patch
Patch94: ffmpeg-6-CVE-2024-32228-shim-1535d338.patch
Patch95: ffmpeg-6-CVE-2024-32228-shim-f50382cb.patch
Patch97: ffmpeg-c99.patch
#
# preamble is present twice, watch out
#
BuildRequires: ladspa-devel BuildRequires: ladspa-devel
BuildRequires: libgsm-devel BuildRequires: libgsm-devel
BuildRequires: libmp3lame-devel >= 3.98.3 BuildRequires: libmp3lame-devel >= 3.98.3
@ -246,7 +241,11 @@ BuildRequires: pkgconfig(shaderc) >= 2019.1
BuildRequires: pkgconfig(vulkan) >= 1.3.255 BuildRequires: pkgconfig(vulkan) >= 1.3.255
%endif %endif
%if 0%{?suse_version} >= 1550 || 0%{?sle_version} >= 150500 %if 0%{?suse_version} < 1550 && 0%{?sle_version} >= 150200 && 0%{?sle_version} < 150600
%ifarch x86_64 %x86_64
BuildRequires: pkgconfig(libmfx)
%endif
%else
%ifarch x86_64 %x86_64 %ifarch x86_64 %x86_64
BuildRequires: pkgconfig(vpl) >= 2.6 BuildRequires: pkgconfig(vpl) >= 2.6
%endif %endif
@ -643,7 +642,11 @@ LDFLAGS="%_lto_cflags" \
%endif %endif
%endif %endif
--enable-lv2 \ --enable-lv2 \
%if 0%{?suse_version} >= 1550 || 0%{?sle_version} >= 150500 %if 0%{?suse_version} < 1550 && 0%{?sle_version} >= 150200 && 0%{?sle_version} < 150600
%ifarch x86_64 %x86_64
--enable-libmfx \
%endif
%else
%ifarch x86_64 %x86_64 %ifarch x86_64 %x86_64
--enable-libvpl \ --enable-libvpl \
%endif %endif
@ -815,7 +818,7 @@ done
%else %else
%define _name ffmpeg %define _name ffmpeg
Name: ffmpeg-6-mini Name: ffmpeg-6-mini
Version: %{vers} Version: 6.1.1
Release: 0 Release: 0
Summary: Set of libraries for working with various multimedia formats Summary: Set of libraries for working with various multimedia formats
License: GPL-3.0-or-later License: GPL-3.0-or-later
@ -829,6 +832,7 @@ Patch1: ffmpeg-arm6l.diff
Patch3: ffmpeg-codec-choice.diff Patch3: ffmpeg-codec-choice.diff
Patch4: ffmpeg-4.2-dlopen-fdk_aac.patch Patch4: ffmpeg-4.2-dlopen-fdk_aac.patch
Patch5: work-around-abi-break.patch Patch5: work-around-abi-break.patch
Patch6: 0001-avcodec-tests-rename-the-bundled-Mesa-AV1-vulkan-vid.patch
Patch7: 0001-avfilter-asrc_afirsrc-fix-by-one-smaller-allocation-.patch Patch7: 0001-avfilter-asrc_afirsrc-fix-by-one-smaller-allocation-.patch
Patch8: 0001-avfilter-bwdif-account-for-chroma-sub-sampling-in-mi.patch Patch8: 0001-avfilter-bwdif-account-for-chroma-sub-sampling-in-mi.patch
Patch9: 0001-avfilter-af_dialoguenhance-fix-overreads.patch Patch9: 0001-avfilter-af_dialoguenhance-fix-overreads.patch
@ -836,15 +840,10 @@ Patch10: 0001-avfilter-af_dialoguenhance-simplify-channels-copy.patch
Patch11: 0001-avfilter-af_dialoguenhance-do-output-scaling-once.patch Patch11: 0001-avfilter-af_dialoguenhance-do-output-scaling-once.patch
Patch12: 0001-avutil-hwcontext-Don-t-assume-frames_uninit-is-reent.patch Patch12: 0001-avutil-hwcontext-Don-t-assume-frames_uninit-is-reent.patch
Patch13: 0001-avfilter-vf_codecview-fix-heap-buffer-overflow.patch Patch13: 0001-avfilter-vf_codecview-fix-heap-buffer-overflow.patch
Patch14: 0001-libavcodec-arm-mlpdsp_armv5te-fix-label-format-to-wo.patch
Patch15: 11013-avcodec-decode-clean-up-if-get_hw_frames_parameters-.patch
Patch90: ffmpeg-chromium.patch Patch90: ffmpeg-chromium.patch
Patch91: ffmpeg-dlopen-openh264.patch Patch91: ffmpeg-dlopen-openh264.patch
Patch92: ffmpeg-CVE-2023-50007.patch Patch92: ffmpeg-CVE-2023-50007.patch
Patch93: ffmpeg-CVE-2023-50008.patch Patch93: ffmpeg-CVE-2023-50008.patch
Patch94: ffmpeg-6-CVE-2024-32228-shim-1535d338.patch
Patch95: ffmpeg-6-CVE-2024-32228-shim-f50382cb.patch
Patch97: ffmpeg-c99.patch
BuildRequires: c_compiler BuildRequires: c_compiler
Requires: this-is-only-for-build-envs Requires: this-is-only-for-build-envs

View File

@ -1,126 +0,0 @@
From: Filip Kastl <fkastl@opensuse.org>
Date: Fri, 26 Jul 2024 14:39:42 +0000
I based the package patch on this bug report (there's a patch in
the comments)
https://bugs.gentoo.org/936433
and on these patches
https://ffmpeg.org/pipermail/ffmpeg-devel/2023-December/318685.html
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=5860a966d2fffbbda1af0014f0a4d37a21c4f2ca
Index: ffmpeg-6.1.1/libavfilter/vsrc_testsrc_vulkan.c
===================================================================
--- ffmpeg-6.1.1.orig/libavfilter/vsrc_testsrc_vulkan.c
+++ ffmpeg-6.1.1/libavfilter/vsrc_testsrc_vulkan.c
@@ -231,7 +231,7 @@ static int testsrc_vulkan_activate(AVFil
return AVERROR(ENOMEM);
err = ff_vk_filter_process_simple(&s->vkctx, &s->e, &s->pl, s->picref, NULL,
- NULL, &s->opts, sizeof(s->opts));
+ VK_NULL_HANDLE, &s->opts, sizeof(s->opts));
if (err < 0)
return err;
}
@@ -250,7 +250,7 @@ static int testsrc_vulkan_activate(AVFil
frame->sample_aspect_ratio = s->sar;
if (!s->draw_once) {
err = ff_vk_filter_process_simple(&s->vkctx, &s->e, &s->pl, frame, NULL,
- NULL, &s->opts, sizeof(s->opts));
+ VK_NULL_HANDLE, &s->opts, sizeof(s->opts));
if (err < 0) {
av_frame_free(&frame);
return err;
Index: ffmpeg-6.1.1/libavutil/hwcontext_vaapi.c
===================================================================
--- ffmpeg-6.1.1.orig/libavutil/hwcontext_vaapi.c
+++ ffmpeg-6.1.1/libavutil/hwcontext_vaapi.c
@@ -1086,7 +1086,7 @@ static int vaapi_map_from_drm(AVHWFrames
int err, i, j;
#if !VA_CHECK_VERSION(1, 1, 0)
- unsigned long buffer_handle;
+ uintptr_t buffer_handle;
VASurfaceAttribExternalBuffers buffer_desc;
VASurfaceAttrib attrs[2] = {
{
@@ -1203,7 +1203,7 @@ static int vaapi_map_from_drm(AVHWFrames
if (!use_prime2 || vas != VA_STATUS_SUCCESS) {
int k;
- unsigned long buffer_handle;
+ uintptr_t buffer_handle;
VASurfaceAttribExternalBuffers buffer_desc;
VASurfaceAttrib buffer_attrs[2] = {
{
Index: ffmpeg-6.1.1/libavcodec/vulkan_av1.c
===================================================================
--- ffmpeg-6.1.1.orig/libavcodec/vulkan_av1.c
+++ ffmpeg-6.1.1/libavcodec/vulkan_av1.c
@@ -180,7 +180,7 @@ static int vk_av1_create_params(AVCodecC
.sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
.pNext = &av1_params,
.videoSession = ctx->common.session,
- .videoSessionParametersTemplate = NULL,
+ .videoSessionParametersTemplate = VK_NULL_HANDLE,
};
err = ff_vk_decode_create_params(buf, avctx, ctx, &session_params_create);
Index: ffmpeg-6.1.1/libavcodec/vulkan_decode.c
===================================================================
--- ffmpeg-6.1.1.orig/libavcodec/vulkan_decode.c
+++ ffmpeg-6.1.1/libavcodec/vulkan_decode.c
@@ -187,10 +187,10 @@ int ff_vk_decode_prepare_frame(FFVulkanD
if (vkpic->img_view_ref)
return 0;
- vkpic->dpb_frame = NULL;
- vkpic->img_view_ref = NULL;
- vkpic->img_view_out = NULL;
- vkpic->img_view_dest = NULL;
+ vkpic->dpb_frame = VK_NULL_HANDLE;
+ vkpic->img_view_ref = VK_NULL_HANDLE;
+ vkpic->img_view_out = VK_NULL_HANDLE;
+ vkpic->img_view_dest = VK_NULL_HANDLE;
vkpic->destroy_image_view = vk->DestroyImageView;
vkpic->wait_semaphores = vk->WaitSemaphores;
Index: ffmpeg-6.1.1/libavcodec/vulkan_h264.c
===================================================================
--- ffmpeg-6.1.1.orig/libavcodec/vulkan_h264.c
+++ ffmpeg-6.1.1/libavcodec/vulkan_h264.c
@@ -315,7 +315,7 @@ static int vk_h264_create_params(AVCodec
.sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
.pNext = &h264_params,
.videoSession = ctx->common.session,
- .videoSessionParametersTemplate = NULL,
+ .videoSessionParametersTemplate = VK_NULL_HANDLE,
};
/* SPS list */
Index: ffmpeg-6.1.1/libavcodec/vulkan_hevc.c
===================================================================
--- ffmpeg-6.1.1.orig/libavcodec/vulkan_hevc.c
+++ ffmpeg-6.1.1/libavcodec/vulkan_hevc.c
@@ -653,7 +653,7 @@ static int vk_hevc_create_params(AVCodec
.sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
.pNext = &h265_params,
.videoSession = ctx->common.session,
- .videoSessionParametersTemplate = NULL,
+ .videoSessionParametersTemplate = VK_NULL_HANDLE,
};
HEVCHeaderSet *hdr;
Index: ffmpeg-6.1.1/libavcodec/vulkan_video.c
===================================================================
--- ffmpeg-6.1.1.orig/libavcodec/vulkan_video.c
+++ ffmpeg-6.1.1/libavcodec/vulkan_video.c
@@ -287,7 +287,7 @@ av_cold void ff_vk_video_common_uninit(F
if (common->session) {
vk->DestroyVideoSessionKHR(s->hwctx->act_dev, common->session,
s->hwctx->alloc);
- common->session = NULL;
+ common->session = VK_NULL_HANDLE;
}
if (common->nb_mem && common->mem)