diff options
Diffstat (limited to 'meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch')
-rw-r--r-- | meta/recipes-multimedia/ffmpeg/ffmpeg/av1_ordering_info.patch | 91 |
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 @@ | |||
1 | From cafb4c554845332eeb33284cf6498049997dc67e Mon Sep 17 00:00:00 2001 | ||
2 | From: Mark Thompson <sw@jkqxz.net> | ||
3 | Date: Wed, 20 Mar 2024 20:35:28 +0000 | ||
4 | Subject: [PATCH] lavc/cbs_av1: Save more frame ordering information | ||
5 | |||
6 | This is wanted by the Vulkan decoder. | ||
7 | |||
8 | Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | ||
9 | Upstream-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 | |||
15 | diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h | ||
16 | index 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 | ||
38 | diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c | ||
39 | index 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 | -- | ||
90 | 2.25.1 | ||
91 | |||