summaryrefslogtreecommitdiffstats
path: root/meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch')
-rw-r--r--meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch91
1 files changed, 91 insertions, 0 deletions
diff --git a/meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch b/meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch
new file mode 100644
index 0000000000..bfc894563c
--- /dev/null
+++ b/meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch
@@ -0,0 +1,91 @@
1From cafb4c554845332eeb33284cf6498049997dc67e Mon Sep 17 00:00:00 2001
2From: Mark Thompson <sw@jkqxz.net>
3Date: Wed, 20 Mar 2024 20:35:28 +0000
4Subject: [PATCH] lavc/cbs_av1: Save more frame ordering information
5
6This is wanted by the Vulkan decoder.
7
8Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
9Upstream-Status: Backport [https://git.ffmpeg.org/gitweb/ffmpeg.git/commitdiff/ecdc94b97f809d5f2b88640842fd0541951ad295]
10---
11 libavcodec/cbs_av1.h | 5 +++++
12 libavcodec/cbs_av1_syntax_template.c | 25 +++++++++++++++++++++----
13 2 files changed, 26 insertions(+), 4 deletions(-)
14
15diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
16index a5402f069d..a027013bc7 100644
17--- a/libavcodec/cbs_av1.h
18+++ b/libavcodec/cbs_av1.h
19@@ -427,6 +427,8 @@ typedef struct AV1ReferenceFrameState {
20 int bit_depth; // RefBitDepth
21 int order_hint; // RefOrderHint
22
23+ int saved_order_hints[AV1_TOTAL_REFS_PER_FRAME]; // SavedOrderHints[ref]
24+
25 int8_t loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME];
26 int8_t loop_filter_mode_deltas[2];
27 uint8_t feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
28@@ -464,6 +466,9 @@ typedef struct CodedBitstreamAV1Context {
29 int tile_rows;
30 int tile_num;
31
32+ int order_hints[AV1_TOTAL_REFS_PER_FRAME]; // OrderHints
33+ int ref_frame_sign_bias[AV1_TOTAL_REFS_PER_FRAME]; // RefFrameSignBias
34+
35 AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES];
36
37 // AVOptions
38diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
39index 3be1f2d30f..2979c5d98f 100644
40--- a/libavcodec/cbs_av1_syntax_template.c
41+++ b/libavcodec/cbs_av1_syntax_template.c
42@@ -1414,6 +1414,8 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw,
43 priv->ref[i].valid = 0;
44 priv->ref[i].order_hint = 0;
45 }
46+ for (i = 0; i < AV1_REFS_PER_FRAME; i++)
47+ priv->order_hints[i + AV1_REF_FRAME_LAST] = 0;
48 }
49
50 flag(disable_cdf_update);
51@@ -1568,11 +1570,20 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw,
52 else
53 flag(use_ref_frame_mvs);
54
55- infer(allow_intrabc, 0);
56- }
57+ for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
58+ int ref_frame = AV1_REF_FRAME_LAST + i;
59+ int hint = priv->ref[current->ref_frame_idx[i]].order_hint;
60+ priv->order_hints[ref_frame] = hint;
61+ if (!seq->enable_order_hint) {
62+ priv->ref_frame_sign_bias[ref_frame] = 0;
63+ } else {
64+ priv->ref_frame_sign_bias[ref_frame] =
65+ cbs_av1_get_relative_dist(seq, hint,
66+ current->order_hint) > 0;
67+ }
68+ }
69
70- if (!frame_is_intra) {
71- // Derive reference frame sign biases.
72+ infer(allow_intrabc, 0);
73 }
74
75 if (seq->reduced_still_picture_header || current->disable_cdf_update)
76@@ -1674,6 +1685,12 @@ update_refs:
77 .bit_depth = priv->bit_depth,
78 .order_hint = priv->order_hint,
79 };
80+
81+ for (int j = 0; j < AV1_REFS_PER_FRAME; j++) {
82+ priv->ref[i].saved_order_hints[j + AV1_REF_FRAME_LAST] =
83+ priv->order_hints[j + AV1_REF_FRAME_LAST];
84+ }
85+
86 memcpy(priv->ref[i].loop_filter_ref_deltas, current->loop_filter_ref_deltas,
87 sizeof(current->loop_filter_ref_deltas));
88 memcpy(priv->ref[i].loop_filter_mode_deltas, current->loop_filter_mode_deltas,
89--
902.25.1
91