/src/ffmpeg/libavcodec/cbs_lcevc_syntax_template.c
Line | Count | Source |
1 | | /* |
2 | | * This file is part of FFmpeg. |
3 | | * |
4 | | * FFmpeg is free software; you can redistribute it and/or |
5 | | * modify it under the terms of the GNU Lesser General Public |
6 | | * License as published by the Free Software Foundation; either |
7 | | * version 2.1 of the License, or (at your option) any later version. |
8 | | * |
9 | | * FFmpeg is distributed in the hope that it will be useful, |
10 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | | * Lesser General Public License for more details. |
13 | | * |
14 | | * You should have received a copy of the GNU Lesser General Public |
15 | | * License along with FFmpeg; if not, write to the Free Software |
16 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
17 | | */ |
18 | | |
19 | | static int FUNC(byte_alignment)(CodedBitstreamContext *ctx, RWContext *rw) |
20 | 1.35M | { |
21 | 1.35M | int err; |
22 | | |
23 | | // ISO/IEC 23094-2:2021/FDAM 1:2023(E) 7.3.12 |
24 | 1.35M | while (byte_alignment(rw) != 0) |
25 | 5.91k | fixed(1, alignment_bit_equal_to_zero, 0); |
26 | | |
27 | 1.35M | return 0; |
28 | 1.35M | } cbs_lcevc.c:cbs_lcevc_read_byte_alignment Line | Count | Source | 20 | 460k | { | 21 | 460k | int err; | 22 | | | 23 | | // ISO/IEC 23094-2:2021/FDAM 1:2023(E) 7.3.12 | 24 | 462k | while (byte_alignment(rw) != 0) | 25 | 3.46k | fixed(1, alignment_bit_equal_to_zero, 0); | 26 | | | 27 | 459k | return 0; | 28 | 460k | } |
cbs_lcevc.c:cbs_lcevc_write_byte_alignment Line | Count | Source | 20 | 893k | { | 21 | 893k | int err; | 22 | | | 23 | | // ISO/IEC 23094-2:2021/FDAM 1:2023(E) 7.3.12 | 24 | 895k | while (byte_alignment(rw) != 0) | 25 | 2.44k | fixed(1, alignment_bit_equal_to_zero, 0); | 26 | | | 27 | 893k | return 0; | 28 | 893k | } |
|
29 | | |
30 | | static int FUNC(rbsp_trailing_bits)(CodedBitstreamContext *ctx, RWContext *rw) |
31 | 10.9k | { |
32 | 10.9k | int err; |
33 | | |
34 | 10.9k | fixed(1, rbsp_stop_one_bit, 1); |
35 | 82.9k | while (byte_alignment(rw) != 0) |
36 | 72.5k | fixed(1, rbsp_alignment_zero_bit, 0); |
37 | | |
38 | 10.3k | return 0; |
39 | 10.3k | } cbs_lcevc.c:cbs_lcevc_read_rbsp_trailing_bits Line | Count | Source | 31 | 7.22k | { | 32 | 7.22k | int err; | 33 | | | 34 | 7.22k | fixed(1, rbsp_stop_one_bit, 1); | 35 | 52.9k | while (byte_alignment(rw) != 0) | 36 | 46.3k | fixed(1, rbsp_alignment_zero_bit, 0); | 37 | | | 38 | 6.62k | return 0; | 39 | 6.62k | } |
cbs_lcevc.c:cbs_lcevc_write_rbsp_trailing_bits Line | Count | Source | 31 | 3.75k | { | 32 | 3.75k | int err; | 33 | | | 34 | 3.75k | fixed(1, rbsp_stop_one_bit, 1); | 35 | 30.0k | while (byte_alignment(rw) != 0) | 36 | 26.2k | fixed(1, rbsp_alignment_zero_bit, 0); | 37 | | | 38 | 3.75k | return 0; | 39 | 3.75k | } |
|
40 | | |
41 | | static int FUNC(nal_unit_header)(CodedBitstreamContext *ctx, RWContext *rw, |
42 | | LCEVCRawNALUnitHeader *current, |
43 | | uint32_t valid_type_mask) |
44 | 42.9k | { |
45 | 42.9k | int err; |
46 | | |
47 | 42.9k | fixed(1, forbidden_zero_bit, 0); |
48 | 42.9k | fixed(1, forbidden_one_bit, 1); |
49 | 42.9k | ub(5, nal_unit_type); |
50 | | |
51 | 42.9k | if (!(1 << current->nal_unit_type & valid_type_mask)) { |
52 | 0 | av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid NAL unit type %d.\n", |
53 | 0 | current->nal_unit_type); |
54 | 0 | return AVERROR_INVALIDDATA; |
55 | 0 | } |
56 | | |
57 | 42.9k | ub(9, reserved_flag); |
58 | | |
59 | 42.5k | return 0; |
60 | 42.9k | } cbs_lcevc.c:cbs_lcevc_read_nal_unit_header Line | Count | Source | 44 | 37.9k | { | 45 | 37.9k | int err; | 46 | | | 47 | 37.9k | fixed(1, forbidden_zero_bit, 0); | 48 | 37.9k | fixed(1, forbidden_one_bit, 1); | 49 | 37.9k | ub(5, nal_unit_type); | 50 | | | 51 | 37.9k | if (!(1 << current->nal_unit_type & valid_type_mask)) { | 52 | 0 | av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid NAL unit type %d.\n", | 53 | 0 | current->nal_unit_type); | 54 | 0 | return AVERROR_INVALIDDATA; | 55 | 0 | } | 56 | | | 57 | 37.9k | ub(9, reserved_flag); | 58 | | | 59 | 37.5k | return 0; | 60 | 37.9k | } |
cbs_lcevc.c:cbs_lcevc_write_nal_unit_header Line | Count | Source | 44 | 4.99k | { | 45 | 4.99k | int err; | 46 | | | 47 | 4.99k | fixed(1, forbidden_zero_bit, 0); | 48 | 4.99k | fixed(1, forbidden_one_bit, 1); | 49 | 4.99k | ub(5, nal_unit_type); | 50 | | | 51 | 4.99k | if (!(1 << current->nal_unit_type & valid_type_mask)) { | 52 | 0 | av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid NAL unit type %d.\n", | 53 | 0 | current->nal_unit_type); | 54 | 0 | return AVERROR_INVALIDDATA; | 55 | 0 | } | 56 | | | 57 | 4.99k | ub(9, reserved_flag); | 58 | | | 59 | 4.99k | return 0; | 60 | 4.99k | } |
|
61 | | |
62 | | LCEVC_BLOCK_FUNC(global_config, (CodedBitstreamContext *ctx, RWContext *rw, |
63 | | LCEVCRawGlobalConfig *current, |
64 | | LCEVCProcessBlockState *state, |
65 | | int nal_unit_type)) |
66 | 44.2k | { |
67 | 44.2k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; |
68 | 44.2k | int err; |
69 | | |
70 | 44.2k | HEADER("Global Config"); |
71 | | |
72 | 44.2k | flag(processed_planes_type_flag); |
73 | 43.9k | ub(6, resolution_type); |
74 | 43.9k | ub(1, transform_type); |
75 | 43.9k | ub(2, chroma_sampling_type); |
76 | 43.7k | ub(2, base_depth_type); |
77 | 43.7k | ub(2, enhancement_depth_type); |
78 | 43.7k | flag(temporal_step_width_modifier_signalled_flag); |
79 | 43.7k | flag(predicted_residual_mode_flag); |
80 | 43.7k | flag(temporal_tile_intra_signalling_enabled_flag); |
81 | 42.9k | flag(temporal_enabled_flag); |
82 | 42.9k | ub(3, upsample_type); |
83 | 42.9k | flag(level1_filtering_signalled_flag); |
84 | 42.9k | ub(2, scaling_mode_level1); |
85 | 42.9k | ub(2, scaling_mode_level2); |
86 | 42.6k | ub(2, tile_dimensions_type); |
87 | 42.6k | ub(2, user_data_enabled); |
88 | 42.6k | flag(level1_depth_flag); |
89 | 42.6k | flag(chroma_step_width_flag); |
90 | | |
91 | 42.6k | if (current->processed_planes_type_flag) { |
92 | 27.9k | ub(4, planes_type); |
93 | 27.7k | ub(4, reserved_zeros_4bit); |
94 | 27.7k | } else |
95 | 14.6k | infer(planes_type, 0); |
96 | | |
97 | 42.4k | if (current->temporal_step_width_modifier_signalled_flag) { |
98 | 29.0k | ub(8, temporal_step_width_modifier); |
99 | 29.0k | } |
100 | | |
101 | 42.1k | if (current->upsample_type == 4) { |
102 | 5.82k | ub(16, upsampler_coeff1); |
103 | 5.33k | ub(16, upsampler_coeff2); |
104 | 5.13k | ub(16, upsampler_coeff3); |
105 | 4.89k | ub(16, upsampler_coeff4); |
106 | 4.89k | } |
107 | | |
108 | 40.9k | if (current->level1_filtering_signalled_flag) { |
109 | 9.72k | ub(4, level1_filtering_first_coefficient); |
110 | 9.48k | ub(4, level1_filtering_second_coefficient); |
111 | 9.48k | } |
112 | | |
113 | 40.7k | if (current->tile_dimensions_type > 0) { |
114 | 16.6k | if (current->tile_dimensions_type == 3) { |
115 | 8.96k | ub(16, custom_tile_width); |
116 | 8.54k | ub(16, custom_tile_height); |
117 | 8.54k | } |
118 | 15.5k | ub(5, reserved_zeros_5bit); |
119 | 15.2k | flag(compression_type_entropy_enabled_per_tile_flag); |
120 | 15.2k | ub(2, compression_type_size_per_tile); |
121 | 15.2k | } |
122 | | |
123 | 39.3k | if (current->resolution_type == 63) { |
124 | 5.70k | ub(16, custom_resolution_width); |
125 | 5.14k | ub(16, custom_resolution_height); |
126 | 5.14k | } |
127 | 38.5k | if (current->chroma_step_width_flag) { |
128 | 13.8k | ub(8, chroma_step_width_multiplier); |
129 | 24.6k | } else { |
130 | 24.6k | infer(chroma_step_width_multiplier, 64); |
131 | 24.6k | } |
132 | | |
133 | 38.3k | av_refstruct_replace(&priv->gc, current); |
134 | | |
135 | 38.3k | return 0; |
136 | 38.5k | } cbs_lcevc.c:cbs_lcevc_read_global_config Line | Count | Source | 66 | 26.2k | { | 67 | 26.2k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 68 | 26.2k | int err; | 69 | | | 70 | 26.2k | HEADER("Global Config"); | 71 | | | 72 | 26.2k | flag(processed_planes_type_flag); | 73 | 25.8k | ub(6, resolution_type); | 74 | 25.8k | ub(1, transform_type); | 75 | 25.8k | ub(2, chroma_sampling_type); | 76 | 25.6k | ub(2, base_depth_type); | 77 | 25.6k | ub(2, enhancement_depth_type); | 78 | 25.6k | flag(temporal_step_width_modifier_signalled_flag); | 79 | 25.6k | flag(predicted_residual_mode_flag); | 80 | 25.6k | flag(temporal_tile_intra_signalling_enabled_flag); | 81 | 24.9k | flag(temporal_enabled_flag); | 82 | 24.9k | ub(3, upsample_type); | 83 | 24.9k | flag(level1_filtering_signalled_flag); | 84 | 24.9k | ub(2, scaling_mode_level1); | 85 | 24.9k | ub(2, scaling_mode_level2); | 86 | 24.5k | ub(2, tile_dimensions_type); | 87 | 24.5k | ub(2, user_data_enabled); | 88 | 24.5k | flag(level1_depth_flag); | 89 | 24.5k | flag(chroma_step_width_flag); | 90 | | | 91 | 24.5k | if (current->processed_planes_type_flag) { | 92 | 14.9k | ub(4, planes_type); | 93 | 14.7k | ub(4, reserved_zeros_4bit); | 94 | 14.7k | } else | 95 | 9.63k | infer(planes_type, 0); | 96 | | | 97 | 24.3k | if (current->temporal_step_width_modifier_signalled_flag) { | 98 | 14.6k | ub(8, temporal_step_width_modifier); | 99 | 14.6k | } | 100 | | | 101 | 24.1k | if (current->upsample_type == 4) { | 102 | 3.04k | ub(16, upsampler_coeff1); | 103 | 2.55k | ub(16, upsampler_coeff2); | 104 | 2.35k | ub(16, upsampler_coeff3); | 105 | 2.11k | ub(16, upsampler_coeff4); | 106 | 2.11k | } | 107 | | | 108 | 22.9k | if (current->level1_filtering_signalled_flag) { | 109 | 7.28k | ub(4, level1_filtering_first_coefficient); | 110 | 7.03k | ub(4, level1_filtering_second_coefficient); | 111 | 7.03k | } | 112 | | | 113 | 22.7k | if (current->tile_dimensions_type > 0) { | 114 | 10.5k | if (current->tile_dimensions_type == 3) { | 115 | 6.39k | ub(16, custom_tile_width); | 116 | 5.96k | ub(16, custom_tile_height); | 117 | 5.96k | } | 118 | 9.51k | ub(5, reserved_zeros_5bit); | 119 | 9.20k | flag(compression_type_entropy_enabled_per_tile_flag); | 120 | 9.20k | ub(2, compression_type_size_per_tile); | 121 | 9.20k | } | 122 | | | 123 | 21.3k | if (current->resolution_type == 63) { | 124 | 4.41k | ub(16, custom_resolution_width); | 125 | 3.86k | ub(16, custom_resolution_height); | 126 | 3.86k | } | 127 | 20.4k | if (current->chroma_step_width_flag) { | 128 | 10.1k | ub(8, chroma_step_width_multiplier); | 129 | 10.3k | } else { | 130 | 10.3k | infer(chroma_step_width_multiplier, 64); | 131 | 10.3k | } | 132 | | | 133 | 20.2k | av_refstruct_replace(&priv->gc, current); | 134 | | | 135 | 20.2k | return 0; | 136 | 20.4k | } |
cbs_lcevc.c:cbs_lcevc_write_global_config Line | Count | Source | 66 | 18.0k | { | 67 | 18.0k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 68 | 18.0k | int err; | 69 | | | 70 | 18.0k | HEADER("Global Config"); | 71 | | | 72 | 18.0k | flag(processed_planes_type_flag); | 73 | 18.0k | ub(6, resolution_type); | 74 | 18.0k | ub(1, transform_type); | 75 | 18.0k | ub(2, chroma_sampling_type); | 76 | 18.0k | ub(2, base_depth_type); | 77 | 18.0k | ub(2, enhancement_depth_type); | 78 | 18.0k | flag(temporal_step_width_modifier_signalled_flag); | 79 | 18.0k | flag(predicted_residual_mode_flag); | 80 | 18.0k | flag(temporal_tile_intra_signalling_enabled_flag); | 81 | 18.0k | flag(temporal_enabled_flag); | 82 | 18.0k | ub(3, upsample_type); | 83 | 18.0k | flag(level1_filtering_signalled_flag); | 84 | 18.0k | ub(2, scaling_mode_level1); | 85 | 18.0k | ub(2, scaling_mode_level2); | 86 | 18.0k | ub(2, tile_dimensions_type); | 87 | 18.0k | ub(2, user_data_enabled); | 88 | 18.0k | flag(level1_depth_flag); | 89 | 18.0k | flag(chroma_step_width_flag); | 90 | | | 91 | 18.0k | if (current->processed_planes_type_flag) { | 92 | 12.9k | ub(4, planes_type); | 93 | 12.9k | ub(4, reserved_zeros_4bit); | 94 | 12.9k | } else | 95 | 5.03k | infer(planes_type, 0); | 96 | | | 97 | 18.0k | if (current->temporal_step_width_modifier_signalled_flag) { | 98 | 14.4k | ub(8, temporal_step_width_modifier); | 99 | 14.4k | } | 100 | | | 101 | 18.0k | if (current->upsample_type == 4) { | 102 | 2.77k | ub(16, upsampler_coeff1); | 103 | 2.77k | ub(16, upsampler_coeff2); | 104 | 2.77k | ub(16, upsampler_coeff3); | 105 | 2.77k | ub(16, upsampler_coeff4); | 106 | 2.77k | } | 107 | | | 108 | 18.0k | if (current->level1_filtering_signalled_flag) { | 109 | 2.44k | ub(4, level1_filtering_first_coefficient); | 110 | 2.44k | ub(4, level1_filtering_second_coefficient); | 111 | 2.44k | } | 112 | | | 113 | 18.0k | if (current->tile_dimensions_type > 0) { | 114 | 6.06k | if (current->tile_dimensions_type == 3) { | 115 | 2.57k | ub(16, custom_tile_width); | 116 | 2.57k | ub(16, custom_tile_height); | 117 | 2.57k | } | 118 | 6.06k | ub(5, reserved_zeros_5bit); | 119 | 6.06k | flag(compression_type_entropy_enabled_per_tile_flag); | 120 | 6.06k | ub(2, compression_type_size_per_tile); | 121 | 6.06k | } | 122 | | | 123 | 18.0k | if (current->resolution_type == 63) { | 124 | 1.28k | ub(16, custom_resolution_width); | 125 | 1.28k | ub(16, custom_resolution_height); | 126 | 1.28k | } | 127 | 18.0k | if (current->chroma_step_width_flag) { | 128 | 3.75k | ub(8, chroma_step_width_multiplier); | 129 | 14.2k | } else { | 130 | 14.2k | infer(chroma_step_width_multiplier, 64); | 131 | 14.2k | } | 132 | | | 133 | 18.0k | av_refstruct_replace(&priv->gc, current); | 134 | | | 135 | 18.0k | return 0; | 136 | 18.0k | } |
|
137 | | |
138 | | LCEVC_BLOCK_FUNC(sequence_config, (CodedBitstreamContext *ctx, RWContext *rw, |
139 | | LCEVCRawSequenceConfig *current, |
140 | | LCEVCProcessBlockState *state, |
141 | | int nal_unit_type)) |
142 | 432k | { |
143 | 432k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; |
144 | 432k | int err; |
145 | | |
146 | 432k | HEADER("Sequence Config"); |
147 | | |
148 | 432k | ub(4, profile_idc); |
149 | 430k | ub(4, level_idc); |
150 | 430k | ub(2, sublevel_idc); |
151 | 429k | flag(conformance_window_flag); |
152 | 429k | ub(5, reserved_zeros_5bit); |
153 | | |
154 | 429k | if (current->profile_idc == 15 || current->level_idc == 15) { |
155 | 135k | ub(3, profile_idc); |
156 | 135k | ub(4, level_idc); |
157 | 135k | ub(1, reserved_zeros_1bit); |
158 | 135k | } |
159 | 429k | if (current->conformance_window_flag == 1) { |
160 | 142k | mb(conf_win_left_offset); |
161 | 142k | mb(conf_win_right_offset); |
162 | 141k | mb(conf_win_top_offset); |
163 | 141k | mb(conf_win_bottom_offset); |
164 | 141k | } |
165 | | |
166 | 428k | av_refstruct_replace(&priv->sc, current); |
167 | | |
168 | 428k | return 0; |
169 | 429k | } cbs_lcevc.c:cbs_lcevc_read_sequence_config Line | Count | Source | 142 | 190k | { | 143 | 190k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 144 | 190k | int err; | 145 | | | 146 | 190k | HEADER("Sequence Config"); | 147 | | | 148 | 190k | ub(4, profile_idc); | 149 | 188k | ub(4, level_idc); | 150 | 188k | ub(2, sublevel_idc); | 151 | 186k | flag(conformance_window_flag); | 152 | 186k | ub(5, reserved_zeros_5bit); | 153 | | | 154 | 186k | if (current->profile_idc == 15 || current->level_idc == 15) { | 155 | 51.0k | ub(3, profile_idc); | 156 | 50.7k | ub(4, level_idc); | 157 | 50.7k | ub(1, reserved_zeros_1bit); | 158 | 50.7k | } | 159 | 186k | if (current->conformance_window_flag == 1) { | 160 | 52.6k | mb(conf_win_left_offset); | 161 | 52.2k | mb(conf_win_right_offset); | 162 | 51.6k | mb(conf_win_top_offset); | 163 | 51.4k | mb(conf_win_bottom_offset); | 164 | 51.4k | } | 165 | | | 166 | 185k | av_refstruct_replace(&priv->sc, current); | 167 | | | 168 | 185k | return 0; | 169 | 186k | } |
cbs_lcevc.c:cbs_lcevc_write_sequence_config Line | Count | Source | 142 | 242k | { | 143 | 242k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 144 | 242k | int err; | 145 | | | 146 | 242k | HEADER("Sequence Config"); | 147 | | | 148 | 242k | ub(4, profile_idc); | 149 | 242k | ub(4, level_idc); | 150 | 242k | ub(2, sublevel_idc); | 151 | 242k | flag(conformance_window_flag); | 152 | 242k | ub(5, reserved_zeros_5bit); | 153 | | | 154 | 242k | if (current->profile_idc == 15 || current->level_idc == 15) { | 155 | 84.5k | ub(3, profile_idc); | 156 | 84.5k | ub(4, level_idc); | 157 | 84.5k | ub(1, reserved_zeros_1bit); | 158 | 84.5k | } | 159 | 242k | if (current->conformance_window_flag == 1) { | 160 | 90.0k | mb(conf_win_left_offset); | 161 | 90.0k | mb(conf_win_right_offset); | 162 | 90.0k | mb(conf_win_top_offset); | 163 | 90.0k | mb(conf_win_bottom_offset); | 164 | 90.0k | } | 165 | | | 166 | 242k | av_refstruct_replace(&priv->sc, current); | 167 | | | 168 | 242k | return 0; | 169 | 242k | } |
|
170 | | |
171 | | LCEVC_BLOCK_FUNC(picture_config, (CodedBitstreamContext *ctx, RWContext *rw, |
172 | | LCEVCRawPictureConfig *current, |
173 | | LCEVCProcessBlockState *state, |
174 | | int nal_unit_type)) |
175 | 252k | { |
176 | 252k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; |
177 | 252k | int nlayers, err; |
178 | | |
179 | 252k | HEADER("Picture Config"); |
180 | | |
181 | 252k | if (!priv->gc) |
182 | 601 | return AVERROR_INVALIDDATA; |
183 | | |
184 | 251k | flag(no_enhancement_bit_flag); |
185 | 251k | if (current->no_enhancement_bit_flag == 0) { |
186 | 157k | ub(3, quant_matrix_mode); |
187 | 157k | flag(dequant_offset_signalled_flag); |
188 | 157k | flag(picture_type_bit_flag); |
189 | 157k | flag(temporal_refresh_bit_flag); |
190 | 157k | flag(step_width_sublayer1_enabled_flag); |
191 | 157k | ub(15, step_width_sublayer2); |
192 | 157k | flag(dithering_control_flag); |
193 | 157k | priv->dithering_control_flag = current->dithering_control_flag; |
194 | 157k | infer(temporal_signalling_present_flag, priv->gc->temporal_enabled_flag && |
195 | 157k | !current->temporal_refresh_bit_flag); |
196 | 157k | } else { |
197 | 93.3k | infer(quant_matrix_mode, 0); |
198 | 93.3k | infer(dequant_offset_signalled_flag, 0); |
199 | 93.3k | ub(4, reserved_zeros_4bit); |
200 | 93.3k | flag(picture_type_bit_flag); |
201 | 93.3k | flag(temporal_refresh_bit_flag); |
202 | 93.3k | infer(step_width_sublayer1_enabled_flag, 0); |
203 | 93.3k | infer(dithering_control_flag, nal_unit_type == LCEVC_IDR_NUT |
204 | 55.5k | ? 0 |
205 | 55.5k | : priv->dithering_control_flag); |
206 | 55.3k | priv->dithering_control_flag = current->dithering_control_flag; |
207 | 93.0k | flag(temporal_signalling_present_flag); |
208 | 55.3k | } |
209 | | |
210 | 250k | if (current->picture_type_bit_flag == 1) { |
211 | 10.3k | flag(field_type_bit_flag); |
212 | 10.0k | ub(7, reserved_zeros_7bit); |
213 | 10.0k | } |
214 | | |
215 | 250k | if (current->step_width_sublayer1_enabled_flag == 1) { |
216 | 9.55k | ub(15, step_width_sublayer1); |
217 | 9.24k | flag(level1_filtering_enabled_flag); |
218 | 9.24k | } else |
219 | 240k | infer(level1_filtering_enabled_flag, 0); |
220 | | |
221 | 249k | nlayers = priv->gc->transform_type ? 16 : 4; |
222 | 249k | if (current->quant_matrix_mode == 2 || |
223 | 242k | current->quant_matrix_mode == 3 || |
224 | 240k | current->quant_matrix_mode == 5) { |
225 | 134k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) |
226 | 124k | ubs(8, qm_coefficient_0[layer_idx], 1, layer_idx); |
227 | 9.90k | } |
228 | | |
229 | 249k | if (current->quant_matrix_mode == 4 || current->quant_matrix_mode == 5) { |
230 | 19.3k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) |
231 | 17.5k | ubs(8, qm_coefficient_1[layer_idx], 1, layer_idx); |
232 | 1.94k | } |
233 | | |
234 | 249k | if (current->dequant_offset_signalled_flag) { |
235 | 2.20k | flag(dequant_offset_mode_flag); |
236 | 1.98k | ub(7, dequant_offset); |
237 | 1.98k | } |
238 | | |
239 | 248k | if (current->dithering_control_flag == 1) { |
240 | 234k | ub(2, dithering_type); |
241 | 233k | ub(1, reserverd_zero); |
242 | 233k | if (current->dithering_type != 0) { |
243 | 230k | ub(5, dithering_strength); |
244 | 230k | } else { |
245 | 3.09k | ub(5, reserved_zeros_5bit); |
246 | 3.09k | } |
247 | 233k | } |
248 | | |
249 | 248k | av_refstruct_replace(&priv->pc, current); |
250 | 248k | av_refstruct_replace(¤t->gc, priv->gc); |
251 | | |
252 | 248k | return 0; |
253 | 248k | } cbs_lcevc.c:cbs_lcevc_read_picture_config Line | Count | Source | 175 | 98.9k | { | 176 | 98.9k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 177 | 98.9k | int nlayers, err; | 178 | | | 179 | 98.9k | HEADER("Picture Config"); | 180 | | | 181 | 98.9k | if (!priv->gc) | 182 | 393 | return AVERROR_INVALIDDATA; | 183 | | | 184 | 98.5k | flag(no_enhancement_bit_flag); | 185 | 98.3k | if (current->no_enhancement_bit_flag == 0) { | 186 | 60.5k | ub(3, quant_matrix_mode); | 187 | 60.5k | flag(dequant_offset_signalled_flag); | 188 | 60.5k | flag(picture_type_bit_flag); | 189 | 60.5k | flag(temporal_refresh_bit_flag); | 190 | 60.5k | flag(step_width_sublayer1_enabled_flag); | 191 | 60.5k | ub(15, step_width_sublayer2); | 192 | 60.3k | flag(dithering_control_flag); | 193 | 60.3k | priv->dithering_control_flag = current->dithering_control_flag; | 194 | 60.3k | infer(temporal_signalling_present_flag, priv->gc->temporal_enabled_flag && | 195 | 60.3k | !current->temporal_refresh_bit_flag); | 196 | 60.3k | } else { | 197 | 37.7k | infer(quant_matrix_mode, 0); | 198 | 37.7k | infer(dequant_offset_signalled_flag, 0); | 199 | 37.7k | ub(4, reserved_zeros_4bit); | 200 | 37.7k | flag(picture_type_bit_flag); | 201 | 37.7k | flag(temporal_refresh_bit_flag); | 202 | 37.7k | infer(step_width_sublayer1_enabled_flag, 0); | 203 | 37.7k | infer(dithering_control_flag, nal_unit_type == LCEVC_IDR_NUT | 204 | 37.7k | ? 0 | 205 | 37.7k | : priv->dithering_control_flag); | 206 | 37.7k | priv->dithering_control_flag = current->dithering_control_flag; | 207 | 37.7k | flag(temporal_signalling_present_flag); | 208 | 37.7k | } | 209 | | | 210 | 98.1k | if (current->picture_type_bit_flag == 1) { | 211 | 4.67k | flag(field_type_bit_flag); | 212 | 4.41k | ub(7, reserved_zeros_7bit); | 213 | 4.41k | } | 214 | | | 215 | 97.8k | if (current->step_width_sublayer1_enabled_flag == 1) { | 216 | 3.87k | ub(15, step_width_sublayer1); | 217 | 3.56k | flag(level1_filtering_enabled_flag); | 218 | 3.56k | } else | 219 | 93.9k | infer(level1_filtering_enabled_flag, 0); | 220 | | | 221 | 97.5k | nlayers = priv->gc->transform_type ? 16 : 4; | 222 | 97.5k | if (current->quant_matrix_mode == 2 || | 223 | 94.7k | current->quant_matrix_mode == 3 || | 224 | 94.0k | current->quant_matrix_mode == 5) { | 225 | 51.0k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) | 226 | 47.4k | ubs(8, qm_coefficient_0[layer_idx], 1, layer_idx); | 227 | 4.03k | } | 228 | | | 229 | 97.1k | if (current->quant_matrix_mode == 4 || current->quant_matrix_mode == 5) { | 230 | 8.75k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) | 231 | 8.03k | ubs(8, qm_coefficient_1[layer_idx], 1, layer_idx); | 232 | 931 | } | 233 | | | 234 | 96.9k | if (current->dequant_offset_signalled_flag) { | 235 | 1.08k | flag(dequant_offset_mode_flag); | 236 | 862 | ub(7, dequant_offset); | 237 | 862 | } | 238 | | | 239 | 96.7k | if (current->dithering_control_flag == 1) { | 240 | 88.5k | ub(2, dithering_type); | 241 | 88.3k | ub(1, reserverd_zero); | 242 | 88.3k | if (current->dithering_type != 0) { | 243 | 86.7k | ub(5, dithering_strength); | 244 | 86.7k | } else { | 245 | 1.59k | ub(5, reserved_zeros_5bit); | 246 | 1.59k | } | 247 | 88.3k | } | 248 | | | 249 | 96.5k | av_refstruct_replace(&priv->pc, current); | 250 | 96.5k | av_refstruct_replace(¤t->gc, priv->gc); | 251 | | | 252 | 96.5k | return 0; | 253 | 96.7k | } |
cbs_lcevc.c:cbs_lcevc_write_picture_config Line | Count | Source | 175 | 153k | { | 176 | 153k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 177 | 153k | int nlayers, err; | 178 | | | 179 | 153k | HEADER("Picture Config"); | 180 | | | 181 | 153k | if (!priv->gc) | 182 | 208 | return AVERROR_INVALIDDATA; | 183 | | | 184 | 152k | flag(no_enhancement_bit_flag); | 185 | 152k | if (current->no_enhancement_bit_flag == 0) { | 186 | 97.2k | ub(3, quant_matrix_mode); | 187 | 97.2k | flag(dequant_offset_signalled_flag); | 188 | 97.2k | flag(picture_type_bit_flag); | 189 | 97.2k | flag(temporal_refresh_bit_flag); | 190 | 97.2k | flag(step_width_sublayer1_enabled_flag); | 191 | 97.2k | ub(15, step_width_sublayer2); | 192 | 97.2k | flag(dithering_control_flag); | 193 | 97.2k | priv->dithering_control_flag = current->dithering_control_flag; | 194 | 97.2k | infer(temporal_signalling_present_flag, priv->gc->temporal_enabled_flag && | 195 | 97.2k | !current->temporal_refresh_bit_flag); | 196 | 97.2k | } else { | 197 | 55.5k | infer(quant_matrix_mode, 0); | 198 | 55.5k | infer(dequant_offset_signalled_flag, 0); | 199 | 55.5k | ub(4, reserved_zeros_4bit); | 200 | 55.5k | flag(picture_type_bit_flag); | 201 | 55.5k | flag(temporal_refresh_bit_flag); | 202 | 55.5k | infer(step_width_sublayer1_enabled_flag, 0); | 203 | 55.5k | infer(dithering_control_flag, nal_unit_type == LCEVC_IDR_NUT | 204 | 55.5k | ? 0 | 205 | 55.5k | : priv->dithering_control_flag); | 206 | 55.3k | priv->dithering_control_flag = current->dithering_control_flag; | 207 | 55.3k | flag(temporal_signalling_present_flag); | 208 | 55.3k | } | 209 | | | 210 | 152k | if (current->picture_type_bit_flag == 1) { | 211 | 5.65k | flag(field_type_bit_flag); | 212 | 5.65k | ub(7, reserved_zeros_7bit); | 213 | 5.65k | } | 214 | | | 215 | 152k | if (current->step_width_sublayer1_enabled_flag == 1) { | 216 | 5.67k | ub(15, step_width_sublayer1); | 217 | 5.67k | flag(level1_filtering_enabled_flag); | 218 | 5.67k | } else | 219 | 146k | infer(level1_filtering_enabled_flag, 0); | 220 | | | 221 | 152k | nlayers = priv->gc->transform_type ? 16 : 4; | 222 | 152k | if (current->quant_matrix_mode == 2 || | 223 | 147k | current->quant_matrix_mode == 3 || | 224 | 146k | current->quant_matrix_mode == 5) { | 225 | 83.0k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) | 226 | 77.2k | ubs(8, qm_coefficient_0[layer_idx], 1, layer_idx); | 227 | 5.86k | } | 228 | | | 229 | 152k | if (current->quant_matrix_mode == 4 || current->quant_matrix_mode == 5) { | 230 | 10.5k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) | 231 | 9.53k | ubs(8, qm_coefficient_1[layer_idx], 1, layer_idx); | 232 | 1.01k | } | 233 | | | 234 | 152k | if (current->dequant_offset_signalled_flag) { | 235 | 1.12k | flag(dequant_offset_mode_flag); | 236 | 1.12k | ub(7, dequant_offset); | 237 | 1.12k | } | 238 | | | 239 | 152k | if (current->dithering_control_flag == 1) { | 240 | 145k | ub(2, dithering_type); | 241 | 145k | ub(1, reserverd_zero); | 242 | 145k | if (current->dithering_type != 0) { | 243 | 144k | ub(5, dithering_strength); | 244 | 144k | } else { | 245 | 1.50k | ub(5, reserved_zeros_5bit); | 246 | 1.50k | } | 247 | 145k | } | 248 | | | 249 | 152k | av_refstruct_replace(&priv->pc, current); | 250 | 152k | av_refstruct_replace(¤t->gc, priv->gc); | 251 | | | 252 | 152k | return 0; | 253 | 152k | } |
|
254 | | |
255 | | LCEVC_BLOCK_FUNC(encoded_data, (CodedBitstreamContext *ctx, RWContext *rw, |
256 | | LCEVCRawEncodedData *current, |
257 | | LCEVCProcessBlockState *state, |
258 | | int nal_unit_type)) |
259 | 1.35M | { |
260 | 1.35M | CodedBitstreamLCEVCContext *priv = ctx->priv_data; |
261 | 1.35M | int nplanes, nlayers, err; |
262 | | #ifdef READ |
263 | | int start = get_bits_count(rw); |
264 | | #endif |
265 | | |
266 | 1.35M | HEADER("Encoded Data"); |
267 | | |
268 | 1.35M | if (!priv->gc || !priv->pc) |
269 | 1.33k | return AVERROR_INVALIDDATA; |
270 | | |
271 | 1.35M | nplanes = priv->gc->planes_type ? 3 : 1; |
272 | 1.35M | nlayers = priv->gc->transform_type ? 16 : 4; |
273 | 2.72M | for (int plane_idx = 0; plane_idx < nplanes; plane_idx++) { |
274 | 1.36M | if (priv->pc->no_enhancement_bit_flag == 0) { |
275 | 1.20M | for (int level_idx = 1; level_idx <= 2; level_idx++) { |
276 | 4.00M | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) { |
277 | 3.20M | ubs(1, surfaces_entropy_enabled_flag[plane_idx][level_idx][layer_idx], 3, plane_idx, level_idx, layer_idx); |
278 | 3.20M | ubs(1, surfaces_rle_only_flag[plane_idx][level_idx][layer_idx], 3, plane_idx, level_idx, layer_idx); |
279 | 3.20M | } |
280 | 801k | } |
281 | 400k | } |
282 | 1.36M | if (priv->pc->temporal_signalling_present_flag == 1) { |
283 | 1.80k | ubs(1, temporal_surfaces_entropy_enabled_flag[plane_idx], 1, plane_idx); |
284 | 1.56k | ubs(1, temporal_surfaces_rle_only_flag[plane_idx], 1, plane_idx); |
285 | 1.56k | } |
286 | 1.36M | } |
287 | | |
288 | 1.35M | CHECK(FUNC(byte_alignment)(ctx, rw)); |
289 | | |
290 | | #ifdef READ |
291 | 459k | if (!ff_cbs_h2645_read_more_rbsp_data(rw)) |
292 | 713 | return AVERROR_INVALIDDATA; |
293 | | |
294 | 458k | int pos = get_bits_count(rw) - start; |
295 | 458k | int len = state->payload_size; |
296 | | |
297 | 458k | current->header_size = pos / 8; |
298 | 458k | current->data_size = len - pos / 8; |
299 | 458k | skip_bits_long(rw, current->data_size * 8); |
300 | | #else |
301 | 893k | err = ff_cbs_h2645_write_slice_data(ctx, rw, current->data, |
302 | 893k | current->data_size, 0); |
303 | 893k | if (err < 0) |
304 | 0 | return err; |
305 | 893k | #endif |
306 | | |
307 | 893k | av_refstruct_replace(¤t->sc, priv->sc); |
308 | 893k | av_refstruct_replace(¤t->gc, priv->gc); |
309 | 893k | av_refstruct_replace(¤t->pc, priv->pc); |
310 | | |
311 | 893k | return 0; |
312 | 893k | } cbs_lcevc.c:cbs_lcevc_read_encoded_data Line | Count | Source | 259 | 462k | { | 260 | 462k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 261 | 462k | int nplanes, nlayers, err; | 262 | 462k | #ifdef READ | 263 | 462k | int start = get_bits_count(rw); | 264 | 462k | #endif | 265 | | | 266 | 462k | HEADER("Encoded Data"); | 267 | | | 268 | 462k | if (!priv->gc || !priv->pc) | 269 | 933 | return AVERROR_INVALIDDATA; | 270 | | | 271 | 461k | nplanes = priv->gc->planes_type ? 3 : 1; | 272 | 461k | nlayers = priv->gc->transform_type ? 16 : 4; | 273 | 926k | for (int plane_idx = 0; plane_idx < nplanes; plane_idx++) { | 274 | 466k | if (priv->pc->no_enhancement_bit_flag == 0) { | 275 | 1.18M | for (int level_idx = 1; level_idx <= 2; level_idx++) { | 276 | 3.95M | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) { | 277 | 3.16M | ubs(1, surfaces_entropy_enabled_flag[plane_idx][level_idx][layer_idx], 3, plane_idx, level_idx, layer_idx); | 278 | 3.16M | ubs(1, surfaces_rle_only_flag[plane_idx][level_idx][layer_idx], 3, plane_idx, level_idx, layer_idx); | 279 | 3.16M | } | 280 | 791k | } | 281 | 395k | } | 282 | 466k | if (priv->pc->temporal_signalling_present_flag == 1) { | 283 | 1.24k | ubs(1, temporal_surfaces_entropy_enabled_flag[plane_idx], 1, plane_idx); | 284 | 1.01k | ubs(1, temporal_surfaces_rle_only_flag[plane_idx], 1, plane_idx); | 285 | 1.01k | } | 286 | 466k | } | 287 | | | 288 | 460k | CHECK(FUNC(byte_alignment)(ctx, rw)); | 289 | | | 290 | 459k | #ifdef READ | 291 | 459k | if (!ff_cbs_h2645_read_more_rbsp_data(rw)) | 292 | 713 | return AVERROR_INVALIDDATA; | 293 | | | 294 | 458k | int pos = get_bits_count(rw) - start; | 295 | 458k | int len = state->payload_size; | 296 | | | 297 | 458k | current->header_size = pos / 8; | 298 | 458k | current->data_size = len - pos / 8; | 299 | 458k | skip_bits_long(rw, current->data_size * 8); | 300 | | #else | 301 | | err = ff_cbs_h2645_write_slice_data(ctx, rw, current->data, | 302 | | current->data_size, 0); | 303 | | if (err < 0) | 304 | | return err; | 305 | | #endif | 306 | | | 307 | 458k | av_refstruct_replace(¤t->sc, priv->sc); | 308 | 458k | av_refstruct_replace(¤t->gc, priv->gc); | 309 | 458k | av_refstruct_replace(¤t->pc, priv->pc); | 310 | | | 311 | 458k | return 0; | 312 | 459k | } |
cbs_lcevc.c:cbs_lcevc_write_encoded_data Line | Count | Source | 259 | 893k | { | 260 | 893k | CodedBitstreamLCEVCContext *priv = ctx->priv_data; | 261 | 893k | int nplanes, nlayers, err; | 262 | | #ifdef READ | 263 | | int start = get_bits_count(rw); | 264 | | #endif | 265 | | | 266 | 893k | HEADER("Encoded Data"); | 267 | | | 268 | 893k | if (!priv->gc || !priv->pc) | 269 | 398 | return AVERROR_INVALIDDATA; | 270 | | | 271 | 893k | nplanes = priv->gc->planes_type ? 3 : 1; | 272 | 893k | nlayers = priv->gc->transform_type ? 16 : 4; | 273 | 1.79M | for (int plane_idx = 0; plane_idx < nplanes; plane_idx++) { | 274 | 900k | if (priv->pc->no_enhancement_bit_flag == 0) { | 275 | 14.8k | for (int level_idx = 1; level_idx <= 2; level_idx++) { | 276 | 53.4k | for (int layer_idx = 0; layer_idx < nlayers; layer_idx++) { | 277 | 43.5k | ubs(1, surfaces_entropy_enabled_flag[plane_idx][level_idx][layer_idx], 3, plane_idx, level_idx, layer_idx); | 278 | 43.5k | ubs(1, surfaces_rle_only_flag[plane_idx][level_idx][layer_idx], 3, plane_idx, level_idx, layer_idx); | 279 | 43.5k | } | 280 | 9.89k | } | 281 | 4.94k | } | 282 | 900k | if (priv->pc->temporal_signalling_present_flag == 1) { | 283 | 552 | ubs(1, temporal_surfaces_entropy_enabled_flag[plane_idx], 1, plane_idx); | 284 | 552 | ubs(1, temporal_surfaces_rle_only_flag[plane_idx], 1, plane_idx); | 285 | 552 | } | 286 | 900k | } | 287 | | | 288 | 893k | CHECK(FUNC(byte_alignment)(ctx, rw)); | 289 | | | 290 | | #ifdef READ | 291 | | if (!ff_cbs_h2645_read_more_rbsp_data(rw)) | 292 | | return AVERROR_INVALIDDATA; | 293 | | | 294 | | int pos = get_bits_count(rw) - start; | 295 | | int len = state->payload_size; | 296 | | | 297 | | current->header_size = pos / 8; | 298 | | current->data_size = len - pos / 8; | 299 | | skip_bits_long(rw, current->data_size * 8); | 300 | | #else | 301 | 893k | err = ff_cbs_h2645_write_slice_data(ctx, rw, current->data, | 302 | 893k | current->data_size, 0); | 303 | 893k | if (err < 0) | 304 | 0 | return err; | 305 | 893k | #endif | 306 | | | 307 | 893k | av_refstruct_replace(¤t->sc, priv->sc); | 308 | 893k | av_refstruct_replace(¤t->gc, priv->gc); | 309 | 893k | av_refstruct_replace(¤t->pc, priv->pc); | 310 | | | 311 | 893k | return 0; | 312 | 893k | } |
|
313 | | |
314 | | static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw, |
315 | | LCEVCRawSEI *current, int payload_size) |
316 | 270k | { |
317 | 270k | SEIRawMessage *message = ¤t->message; |
318 | 270k | int sei_type; |
319 | 270k | int i, err; |
320 | | |
321 | 270k | ub(8, payload_type); |
322 | | |
323 | 269k | if (current->payload_type == 1) |
324 | 17.4k | sei_type = SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME; |
325 | 252k | else if (current->payload_type == 2) |
326 | 55.8k | sei_type = SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO; |
327 | 196k | else if (current->payload_type == 4) |
328 | 5.38k | sei_type = SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35; |
329 | 190k | else if (current->payload_type == 5) |
330 | 5.95k | sei_type = SEI_TYPE_USER_DATA_UNREGISTERED; |
331 | 184k | else { |
332 | 184k | uint8_t *data; |
333 | | |
334 | | #ifdef READ |
335 | | current->payload_size = payload_size; |
336 | 69.5k | allocate(current->payload_ref, current->payload_size); |
337 | 69.5k | current->payload = current->payload_ref; |
338 | | #else |
339 | 115k | allocate(current->payload, current->payload_size); |
340 | 115k | #endif |
341 | 115k | data = current->payload; |
342 | | |
343 | 652k | for (i = 0; i < current->payload_size; i++) |
344 | 467k | xu(8, reserved_sei_message_payload_byte[i], data[i], 0, 255, 1, i); |
345 | | |
346 | 184k | return 0; |
347 | 115k | } |
348 | | |
349 | 84.6k | message->payload_type = sei_type; |
350 | 84.6k | message->payload_size = payload_size; |
351 | | |
352 | 84.6k | CHECK(FUNC_SEI(message)(ctx, rw, message)); |
353 | | |
354 | 81.8k | return 0; |
355 | 84.6k | } cbs_lcevc.c:cbs_lcevc_read_sei_payload Line | Count | Source | 316 | 135k | { | 317 | 135k | SEIRawMessage *message = ¤t->message; | 318 | 135k | int sei_type; | 319 | 135k | int i, err; | 320 | | | 321 | 135k | ub(8, payload_type); | 322 | | | 323 | 135k | if (current->payload_type == 1) | 324 | 6.91k | sei_type = SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME; | 325 | 128k | else if (current->payload_type == 2) | 326 | 52.4k | sei_type = SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO; | 327 | 75.9k | else if (current->payload_type == 4) | 328 | 2.68k | sei_type = SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35; | 329 | 73.3k | else if (current->payload_type == 5) | 330 | 3.78k | sei_type = SEI_TYPE_USER_DATA_UNREGISTERED; | 331 | 69.5k | else { | 332 | 69.5k | uint8_t *data; | 333 | | | 334 | 69.5k | #ifdef READ | 335 | 69.5k | current->payload_size = payload_size; | 336 | 69.5k | allocate(current->payload_ref, current->payload_size); | 337 | 69.5k | current->payload = current->payload_ref; | 338 | | #else | 339 | | allocate(current->payload, current->payload_size); | 340 | | #endif | 341 | 69.5k | data = current->payload; | 342 | | | 343 | 297k | for (i = 0; i < current->payload_size; i++) | 344 | 227k | xu(8, reserved_sei_message_payload_byte[i], data[i], 0, 255, 1, i); | 345 | | | 346 | 69.5k | return 0; | 347 | 69.5k | } | 348 | | | 349 | 65.8k | message->payload_type = sei_type; | 350 | 65.8k | message->payload_size = payload_size; | 351 | | | 352 | 65.8k | CHECK(FUNC_SEI(message)(ctx, rw, message)); | 353 | | | 354 | 63.0k | return 0; | 355 | 65.8k | } |
cbs_lcevc.c:cbs_lcevc_write_sei_payload Line | Count | Source | 316 | 134k | { | 317 | 134k | SEIRawMessage *message = ¤t->message; | 318 | 134k | int sei_type; | 319 | 134k | int i, err; | 320 | | | 321 | 134k | ub(8, payload_type); | 322 | | | 323 | 134k | if (current->payload_type == 1) | 324 | 10.5k | sei_type = SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME; | 325 | 123k | else if (current->payload_type == 2) | 326 | 3.41k | sei_type = SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO; | 327 | 120k | else if (current->payload_type == 4) | 328 | 2.69k | sei_type = SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35; | 329 | 117k | else if (current->payload_type == 5) | 330 | 2.16k | sei_type = SEI_TYPE_USER_DATA_UNREGISTERED; | 331 | 115k | else { | 332 | 115k | uint8_t *data; | 333 | | | 334 | | #ifdef READ | 335 | | current->payload_size = payload_size; | 336 | | allocate(current->payload_ref, current->payload_size); | 337 | | current->payload = current->payload_ref; | 338 | | #else | 339 | 115k | allocate(current->payload, current->payload_size); | 340 | 115k | #endif | 341 | 115k | data = current->payload; | 342 | | | 343 | 355k | for (i = 0; i < current->payload_size; i++) | 344 | 239k | xu(8, reserved_sei_message_payload_byte[i], data[i], 0, 255, 1, i); | 345 | | | 346 | 115k | return 0; | 347 | 115k | } | 348 | | | 349 | 18.8k | message->payload_type = sei_type; | 350 | 18.8k | message->payload_size = payload_size; | 351 | | | 352 | 18.8k | CHECK(FUNC_SEI(message)(ctx, rw, message)); | 353 | | | 354 | 18.8k | return 0; | 355 | 18.8k | } |
|
356 | | |
357 | | static int FUNC(vui_parameters)(CodedBitstreamContext *ctx, RWContext *rw, |
358 | | LCEVCRawVUI *current) |
359 | 195k | { |
360 | 195k | int err; |
361 | | |
362 | 195k | HEADER("VUI Parameters"); |
363 | | |
364 | 195k | flag(aspect_ratio_info_present_flag); |
365 | 195k | if (current->aspect_ratio_info_present_flag) { |
366 | 5.03k | ub(8, aspect_ratio_idc); |
367 | | |
368 | 4.77k | if (current->aspect_ratio_idc == 255) { |
369 | 1.05k | ub(16, sar_width); |
370 | 861 | ub(16, sar_height); |
371 | 861 | } |
372 | 190k | } else { |
373 | 190k | infer(aspect_ratio_idc, 0); |
374 | 190k | } |
375 | | |
376 | 194k | flag(overscan_info_present_flag); |
377 | 194k | if (current->overscan_info_present_flag) |
378 | 194k | flag(overscan_appropriate_flag); |
379 | 191k | else |
380 | 191k | infer(overscan_appropriate_flag, 0); |
381 | | |
382 | 194k | flag(video_signal_type_present_flag); |
383 | 194k | if (current->video_signal_type_present_flag) { |
384 | 6.33k | u(3, video_format, 0, 5); |
385 | 6.07k | flag(video_full_range_flag); |
386 | 6.07k | flag(colour_description_present_flag); |
387 | 5.08k | if (current->colour_description_present_flag) { |
388 | 1.52k | ub(8, colour_primaries); |
389 | 1.27k | ub(8, transfer_characteristics); |
390 | 1.05k | ub(8, matrix_coefficients); |
391 | 3.55k | } else { |
392 | 3.55k | infer(colour_primaries, 2); |
393 | 3.55k | infer(transfer_characteristics, 2); |
394 | 3.55k | infer(matrix_coefficients, 2); |
395 | 1.45k | } |
396 | 187k | } else { |
397 | 187k | infer(video_format, 5); |
398 | 187k | infer(video_full_range_flag, 0); |
399 | 187k | infer(colour_description_present_flag, 0); |
400 | 187k | infer(colour_primaries, 2); |
401 | 187k | infer(transfer_characteristics, 2); |
402 | 187k | infer(matrix_coefficients, 2); |
403 | 118k | } |
404 | 192k | flag(chroma_loc_info_present_flag); |
405 | 192k | if (current->chroma_loc_info_present_flag) { |
406 | 185k | ue(chroma_sample_loc_type_top_field, 0, 5); |
407 | 184k | ue(chroma_sample_loc_type_bottom_field, 0, 5); |
408 | 184k | } else { |
409 | 6.66k | infer(chroma_sample_loc_type_top_field, 0); |
410 | 6.66k | infer(chroma_sample_loc_type_bottom_field, 0); |
411 | 3.44k | } |
412 | | |
413 | 190k | return 0; |
414 | 192k | } cbs_lcevc.c:cbs_lcevc_read_vui_parameters Line | Count | Source | 359 | 75.5k | { | 360 | 75.5k | int err; | 361 | | | 362 | 75.5k | HEADER("VUI Parameters"); | 363 | | | 364 | 75.5k | flag(aspect_ratio_info_present_flag); | 365 | 75.3k | if (current->aspect_ratio_info_present_flag) { | 366 | 3.75k | ub(8, aspect_ratio_idc); | 367 | | | 368 | 3.49k | if (current->aspect_ratio_idc == 255) { | 369 | 835 | ub(16, sar_width); | 370 | 637 | ub(16, sar_height); | 371 | 637 | } | 372 | 71.5k | } else { | 373 | 71.5k | infer(aspect_ratio_idc, 0); | 374 | 71.5k | } | 375 | | | 376 | 74.5k | flag(overscan_info_present_flag); | 377 | 74.5k | if (current->overscan_info_present_flag) | 378 | 74.5k | flag(overscan_appropriate_flag); | 379 | 72.5k | else | 380 | 72.5k | infer(overscan_appropriate_flag, 0); | 381 | | | 382 | 74.5k | flag(video_signal_type_present_flag); | 383 | 74.5k | if (current->video_signal_type_present_flag) { | 384 | 4.64k | u(3, video_format, 0, 5); | 385 | 4.38k | flag(video_full_range_flag); | 386 | 4.38k | flag(colour_description_present_flag); | 387 | 3.39k | if (current->colour_description_present_flag) { | 388 | 1.29k | ub(8, colour_primaries); | 389 | 1.03k | ub(8, transfer_characteristics); | 390 | 817 | ub(8, matrix_coefficients); | 391 | 2.10k | } else { | 392 | 2.10k | infer(colour_primaries, 2); | 393 | 2.10k | infer(transfer_characteristics, 2); | 394 | 2.10k | infer(matrix_coefficients, 2); | 395 | 2.10k | } | 396 | 69.9k | } else { | 397 | 69.9k | infer(video_format, 5); | 398 | 69.9k | infer(video_full_range_flag, 0); | 399 | 69.9k | infer(colour_description_present_flag, 0); | 400 | 69.9k | infer(colour_primaries, 2); | 401 | 69.9k | infer(transfer_characteristics, 2); | 402 | 69.9k | infer(matrix_coefficients, 2); | 403 | 69.9k | } | 404 | 72.6k | flag(chroma_loc_info_present_flag); | 405 | 72.3k | if (current->chroma_loc_info_present_flag) { | 406 | 69.1k | ue(chroma_sample_loc_type_top_field, 0, 5); | 407 | 68.5k | ue(chroma_sample_loc_type_bottom_field, 0, 5); | 408 | 68.5k | } else { | 409 | 3.22k | infer(chroma_sample_loc_type_top_field, 0); | 410 | 3.22k | infer(chroma_sample_loc_type_bottom_field, 0); | 411 | 3.22k | } | 412 | | | 413 | 71.2k | return 0; | 414 | 72.3k | } |
cbs_lcevc.c:cbs_lcevc_write_vui_parameters Line | Count | Source | 359 | 119k | { | 360 | 119k | int err; | 361 | | | 362 | 119k | HEADER("VUI Parameters"); | 363 | | | 364 | 119k | flag(aspect_ratio_info_present_flag); | 365 | 119k | if (current->aspect_ratio_info_present_flag) { | 366 | 1.27k | ub(8, aspect_ratio_idc); | 367 | | | 368 | 1.27k | if (current->aspect_ratio_idc == 255) { | 369 | 224 | ub(16, sar_width); | 370 | 224 | ub(16, sar_height); | 371 | 224 | } | 372 | 118k | } else { | 373 | 118k | infer(aspect_ratio_idc, 0); | 374 | 118k | } | 375 | | | 376 | 119k | flag(overscan_info_present_flag); | 377 | 119k | if (current->overscan_info_present_flag) | 378 | 119k | flag(overscan_appropriate_flag); | 379 | 119k | else | 380 | 119k | infer(overscan_appropriate_flag, 0); | 381 | | | 382 | 119k | flag(video_signal_type_present_flag); | 383 | 119k | if (current->video_signal_type_present_flag) { | 384 | 1.69k | u(3, video_format, 0, 5); | 385 | 1.69k | flag(video_full_range_flag); | 386 | 1.69k | flag(colour_description_present_flag); | 387 | 1.69k | if (current->colour_description_present_flag) { | 388 | 236 | ub(8, colour_primaries); | 389 | 236 | ub(8, transfer_characteristics); | 390 | 236 | ub(8, matrix_coefficients); | 391 | 1.45k | } else { | 392 | 1.45k | infer(colour_primaries, 2); | 393 | 1.45k | infer(transfer_characteristics, 2); | 394 | 1.45k | infer(matrix_coefficients, 2); | 395 | 1.45k | } | 396 | 118k | } else { | 397 | 118k | infer(video_format, 5); | 398 | 118k | infer(video_full_range_flag, 0); | 399 | 118k | infer(colour_description_present_flag, 0); | 400 | 118k | infer(colour_primaries, 2); | 401 | 118k | infer(transfer_characteristics, 2); | 402 | 118k | infer(matrix_coefficients, 2); | 403 | 118k | } | 404 | 119k | flag(chroma_loc_info_present_flag); | 405 | 119k | if (current->chroma_loc_info_present_flag) { | 406 | 116k | ue(chroma_sample_loc_type_top_field, 0, 5); | 407 | 116k | ue(chroma_sample_loc_type_bottom_field, 0, 5); | 408 | 116k | } else { | 409 | 3.44k | infer(chroma_sample_loc_type_top_field, 0); | 410 | 3.44k | infer(chroma_sample_loc_type_bottom_field, 0); | 411 | 3.44k | } | 412 | | | 413 | 119k | return 0; | 414 | 119k | } |
|
415 | | |
416 | | LCEVC_BLOCK_FUNC(additional_info, (CodedBitstreamContext *ctx, RWContext *rw, |
417 | | LCEVCRawAdditionalInfo *current, |
418 | | LCEVCProcessBlockState *state, |
419 | | int nal_unit_type)) |
420 | 5.36M | { |
421 | 5.36M | int i, err; |
422 | | |
423 | 5.36M | HEADER("Additional Info"); |
424 | | |
425 | 5.36M | ub(8, additional_info_type); |
426 | | |
427 | 5.36M | if (current->additional_info_type == LCEVC_ADDITIONAL_INFO_TYPE_SEI) { |
428 | 270k | CHECK(FUNC(sei_payload)(ctx, rw, ¤t->sei, state->payload_size - 2)); |
429 | 5.09M | } else if (current->additional_info_type == LCEVC_ADDITIONAL_INFO_TYPE_VUI) |
430 | 195k | CHECK(FUNC(vui_parameters)(ctx, rw, ¤t->vui)); |
431 | 4.89M | else { |
432 | 4.89M | uint8_t *data; |
433 | | |
434 | | #ifdef READ |
435 | | current->payload_size = state->payload_size - 1; |
436 | 1.79M | allocate(current->payload_ref, current->payload_size); |
437 | 1.79M | current->payload = current->payload_ref; |
438 | | #else |
439 | 3.09M | allocate(current->payload, current->payload_size); |
440 | 3.09M | #endif |
441 | 3.09M | data = current->payload; |
442 | | |
443 | 27.9M | for (i = 0; i < current->payload_size; i++) |
444 | 23.0M | xu(8, additional_info_byte[i], data[i], 0, 255, 1, i); |
445 | 3.09M | } |
446 | | |
447 | 5.35M | return 0; |
448 | 5.36M | } cbs_lcevc.c:cbs_lcevc_read_additional_info Line | Count | Source | 420 | 2.01M | { | 421 | 2.01M | int i, err; | 422 | | | 423 | 2.01M | HEADER("Additional Info"); | 424 | | | 425 | 2.01M | ub(8, additional_info_type); | 426 | | | 427 | 2.01M | if (current->additional_info_type == LCEVC_ADDITIONAL_INFO_TYPE_SEI) { | 428 | 135k | CHECK(FUNC(sei_payload)(ctx, rw, ¤t->sei, state->payload_size - 2)); | 429 | 1.87M | } else if (current->additional_info_type == LCEVC_ADDITIONAL_INFO_TYPE_VUI) | 430 | 75.5k | CHECK(FUNC(vui_parameters)(ctx, rw, ¤t->vui)); | 431 | 1.79M | else { | 432 | 1.79M | uint8_t *data; | 433 | | | 434 | 1.79M | #ifdef READ | 435 | 1.79M | current->payload_size = state->payload_size - 1; | 436 | 1.79M | allocate(current->payload_ref, current->payload_size); | 437 | 1.79M | current->payload = current->payload_ref; | 438 | | #else | 439 | | allocate(current->payload, current->payload_size); | 440 | | #endif | 441 | 1.79M | data = current->payload; | 442 | | | 443 | 10.2M | for (i = 0; i < current->payload_size; i++) | 444 | 8.43M | xu(8, additional_info_byte[i], data[i], 0, 255, 1, i); | 445 | 1.79M | } | 446 | | | 447 | 2.00M | return 0; | 448 | 2.01M | } |
cbs_lcevc.c:cbs_lcevc_write_additional_info Line | Count | Source | 420 | 3.35M | { | 421 | 3.35M | int i, err; | 422 | | | 423 | 3.35M | HEADER("Additional Info"); | 424 | | | 425 | 3.35M | ub(8, additional_info_type); | 426 | | | 427 | 3.35M | if (current->additional_info_type == LCEVC_ADDITIONAL_INFO_TYPE_SEI) { | 428 | 134k | CHECK(FUNC(sei_payload)(ctx, rw, ¤t->sei, state->payload_size - 2)); | 429 | 3.21M | } else if (current->additional_info_type == LCEVC_ADDITIONAL_INFO_TYPE_VUI) | 430 | 119k | CHECK(FUNC(vui_parameters)(ctx, rw, ¤t->vui)); | 431 | 3.09M | else { | 432 | 3.09M | uint8_t *data; | 433 | | | 434 | | #ifdef READ | 435 | | current->payload_size = state->payload_size - 1; | 436 | | allocate(current->payload_ref, current->payload_size); | 437 | | current->payload = current->payload_ref; | 438 | | #else | 439 | 3.09M | allocate(current->payload, current->payload_size); | 440 | 3.09M | #endif | 441 | 3.09M | data = current->payload; | 442 | | | 443 | 17.7M | for (i = 0; i < current->payload_size; i++) | 444 | 14.6M | xu(8, additional_info_byte[i], data[i], 0, 255, 1, i); | 445 | 3.09M | } | 446 | | | 447 | 3.35M | return 0; | 448 | 3.35M | } |
|
449 | | |
450 | | LCEVC_BLOCK_FUNC(filler, (CodedBitstreamContext *ctx, RWContext *rw, |
451 | | LCEVCRawFiller *current, |
452 | | LCEVCProcessBlockState *state, |
453 | | int nal_unit_type)) |
454 | 348k | { |
455 | 348k | int err; |
456 | | |
457 | 348k | HEADER("Filler"); |
458 | | |
459 | | |
460 | | #ifdef READ |
461 | 260k | while (show_bits(rw, 8) == 0xaa) { |
462 | 2.40k | fixed(8, filler_byte, 0xaa); |
463 | 1.66k | ++current->filler_size; |
464 | 1.66k | } |
465 | 257k | if (state->payload_size != current->filler_size) |
466 | 729 | return AVERROR_INVALIDDATA; |
467 | | |
468 | | #else |
469 | 91.1k | for (int i = 0; i < current->filler_size; i++) |
470 | 1.33k | fixed(8, filler_byte, 0xaa); |
471 | 89.8k | #endif |
472 | | |
473 | 346k | return 0; |
474 | 257k | } cbs_lcevc.c:cbs_lcevc_read_filler Line | Count | Source | 454 | 258k | { | 455 | 258k | int err; | 456 | | | 457 | 258k | HEADER("Filler"); | 458 | | | 459 | | | 460 | 258k | #ifdef READ | 461 | 260k | while (show_bits(rw, 8) == 0xaa) { | 462 | 2.40k | fixed(8, filler_byte, 0xaa); | 463 | 1.66k | ++current->filler_size; | 464 | 1.66k | } | 465 | 257k | if (state->payload_size != current->filler_size) | 466 | 729 | return AVERROR_INVALIDDATA; | 467 | | | 468 | | #else | 469 | | for (int i = 0; i < current->filler_size; i++) | 470 | | fixed(8, filler_byte, 0xaa); | 471 | | #endif | 472 | | | 473 | 256k | return 0; | 474 | 257k | } |
cbs_lcevc.c:cbs_lcevc_write_filler Line | Count | Source | 454 | 89.8k | { | 455 | 89.8k | int err; | 456 | | | 457 | 89.8k | HEADER("Filler"); | 458 | | | 459 | | | 460 | | #ifdef READ | 461 | | while (show_bits(rw, 8) == 0xaa) { | 462 | | fixed(8, filler_byte, 0xaa); | 463 | | ++current->filler_size; | 464 | | } | 465 | | if (state->payload_size != current->filler_size) | 466 | | return AVERROR_INVALIDDATA; | 467 | | | 468 | | #else | 469 | 91.1k | for (int i = 0; i < current->filler_size; i++) | 470 | 1.33k | fixed(8, filler_byte, 0xaa); | 471 | 89.8k | #endif | 472 | | | 473 | 89.8k | return 0; | 474 | 89.8k | } |
|
475 | | |
476 | | static int FUNC(process_block)(CodedBitstreamContext *ctx, RWContext *rw, |
477 | | LCEVCRawProcessBlock *current, |
478 | | int nal_unit_type) |
479 | 25.7M | { |
480 | 25.7M | const LCEVCProcessBlockTypeDescriptor *desc; |
481 | 25.7M | int err, i; |
482 | | |
483 | 25.7M | desc = ff_cbs_lcevc_process_block_find_type(ctx, current->payload_type); |
484 | 25.7M | if (desc) { |
485 | 7.79M | LCEVCProcessBlockState state = { |
486 | 7.79M | .payload_type = current->payload_type, |
487 | 7.79M | .payload_size = current->payload_size, |
488 | 7.79M | .extension_present = current->extension_bit_length > 0, |
489 | 7.79M | }; |
490 | 7.79M | int start_position, current_position, bits_written; |
491 | | |
492 | | #ifdef READ |
493 | 3.04M | CHECK(ff_cbs_lcevc_alloc_process_block_payload(current, desc)); |
494 | 3.04M | #endif |
495 | | |
496 | 7.79M | start_position = bit_position(rw); |
497 | | |
498 | 7.79M | CHECK(desc->READWRITE(ctx, rw, current->payload, &state, nal_unit_type)); |
499 | | |
500 | 7.76M | current_position = bit_position(rw); |
501 | 7.76M | bits_written = current_position - start_position; |
502 | | |
503 | 7.76M | if (byte_alignment(rw) || state.extension_present || |
504 | 7.26M | bits_written < 8 * current->payload_size) { |
505 | 1.49M | size_t bits_left; |
506 | | |
507 | | #ifdef READ |
508 | | GetBitContext tmp = *rw; |
509 | | int trailing_bits, trailing_zero_bits; |
510 | | |
511 | | bits_left = 8 * current->payload_size - bits_written; |
512 | 280k | if (bits_left > 8) |
513 | 272k | skip_bits_long(&tmp, bits_left - 8); |
514 | 280k | trailing_bits = get_bits(&tmp, FFMIN(bits_left, 8)); |
515 | 280k | if (trailing_bits == 0) { |
516 | | // The trailing bits must contain a payload_bit_equal_to_one, so |
517 | | // they can't all be zero. |
518 | 1.24k | return AVERROR_INVALIDDATA; |
519 | 1.24k | } |
520 | 279k | trailing_zero_bits = ff_ctz(trailing_bits); |
521 | | current->extension_bit_length = |
522 | | bits_left - 1 - trailing_zero_bits; |
523 | | #endif |
524 | | |
525 | 1.48M | if (current->extension_bit_length > 0) { |
526 | 710k | allocate(current->extension_data, |
527 | 710k | (current->extension_bit_length + 7) / 8); |
528 | | |
529 | 710k | bits_left = current->extension_bit_length; |
530 | 14.0M | for (i = 0; bits_left > 0; i++) { |
531 | 13.3M | int length = FFMIN(bits_left, 8); |
532 | 13.3M | xu(length, reserved_payload_extension_data, |
533 | 13.3M | current->extension_data[i], |
534 | 13.3M | 0, MAX_UINT_BITS(length), 0); |
535 | 13.3M | bits_left -= length; |
536 | 13.3M | } |
537 | 710k | } |
538 | | |
539 | 1.48M | fixed(1, payload_bit_equal_to_one, 1); |
540 | 7.43M | while (byte_alignment(rw)) |
541 | 5.94M | fixed(1, payload_bit_equal_to_zero, 0); |
542 | 1.48M | } |
543 | | |
544 | | #ifdef WRITE |
545 | 4.74M | current->payload_size = (put_bits_count(rw) - start_position) / 8; |
546 | 4.74M | #endif |
547 | 17.9M | } else { |
548 | 17.9M | uint8_t *data; |
549 | | |
550 | | #ifdef READ |
551 | 7.84M | allocate(current->payload_ref, current->payload_size); |
552 | 7.84M | current->payload = current->payload_ref; |
553 | | #else |
554 | 10.0M | allocate(current->payload, current->payload_size); |
555 | 10.0M | #endif |
556 | 10.0M | data = current->payload; |
557 | | |
558 | 47.7M | for (i = 0; i < current->payload_size; i++) |
559 | 29.7M | xu(8, payload_byte[i], data[i], 0, 255, 1, i); |
560 | 10.0M | } |
561 | | |
562 | 25.7M | return 0; |
563 | 25.7M | } cbs_lcevc.c:cbs_lcevc_read_process_block Line | Count | Source | 479 | 10.8M | { | 480 | 10.8M | const LCEVCProcessBlockTypeDescriptor *desc; | 481 | 10.8M | int err, i; | 482 | | | 483 | 10.8M | desc = ff_cbs_lcevc_process_block_find_type(ctx, current->payload_type); | 484 | 10.8M | if (desc) { | 485 | 3.04M | LCEVCProcessBlockState state = { | 486 | 3.04M | .payload_type = current->payload_type, | 487 | 3.04M | .payload_size = current->payload_size, | 488 | 3.04M | .extension_present = current->extension_bit_length > 0, | 489 | 3.04M | }; | 490 | 3.04M | int start_position, current_position, bits_written; | 491 | | | 492 | 3.04M | #ifdef READ | 493 | 3.04M | CHECK(ff_cbs_lcevc_alloc_process_block_payload(current, desc)); | 494 | 3.04M | #endif | 495 | | | 496 | 3.04M | start_position = bit_position(rw); | 497 | | | 498 | 3.04M | CHECK(desc->READWRITE(ctx, rw, current->payload, &state, nal_unit_type)); | 499 | | | 500 | 3.02M | current_position = bit_position(rw); | 501 | 3.02M | bits_written = current_position - start_position; | 502 | | | 503 | 3.02M | if (byte_alignment(rw) || state.extension_present || | 504 | 2.95M | bits_written < 8 * current->payload_size) { | 505 | 280k | size_t bits_left; | 506 | | | 507 | 280k | #ifdef READ | 508 | 280k | GetBitContext tmp = *rw; | 509 | 280k | int trailing_bits, trailing_zero_bits; | 510 | | | 511 | 280k | bits_left = 8 * current->payload_size - bits_written; | 512 | 280k | if (bits_left > 8) | 513 | 272k | skip_bits_long(&tmp, bits_left - 8); | 514 | 280k | trailing_bits = get_bits(&tmp, FFMIN(bits_left, 8)); | 515 | 280k | if (trailing_bits == 0) { | 516 | | // The trailing bits must contain a payload_bit_equal_to_one, so | 517 | | // they can't all be zero. | 518 | 1.24k | return AVERROR_INVALIDDATA; | 519 | 1.24k | } | 520 | 279k | trailing_zero_bits = ff_ctz(trailing_bits); | 521 | 279k | current->extension_bit_length = | 522 | 279k | bits_left - 1 - trailing_zero_bits; | 523 | 279k | #endif | 524 | | | 525 | 279k | if (current->extension_bit_length > 0) { | 526 | 279k | allocate(current->extension_data, | 527 | 279k | (current->extension_bit_length + 7) / 8); | 528 | | | 529 | 279k | bits_left = current->extension_bit_length; | 530 | 5.70M | for (i = 0; bits_left > 0; i++) { | 531 | 5.42M | int length = FFMIN(bits_left, 8); | 532 | 5.42M | xu(length, reserved_payload_extension_data, | 533 | 5.42M | current->extension_data[i], | 534 | 5.42M | 0, MAX_UINT_BITS(length), 0); | 535 | 5.42M | bits_left -= length; | 536 | 5.42M | } | 537 | 279k | } | 538 | | | 539 | 279k | fixed(1, payload_bit_equal_to_one, 1); | 540 | 511k | while (byte_alignment(rw)) | 541 | 231k | fixed(1, payload_bit_equal_to_zero, 0); | 542 | 279k | } | 543 | | | 544 | | #ifdef WRITE | 545 | | current->payload_size = (put_bits_count(rw) - start_position) / 8; | 546 | | #endif | 547 | 7.84M | } else { | 548 | 7.84M | uint8_t *data; | 549 | | | 550 | 7.84M | #ifdef READ | 551 | 7.84M | allocate(current->payload_ref, current->payload_size); | 552 | 7.84M | current->payload = current->payload_ref; | 553 | | #else | 554 | | allocate(current->payload, current->payload_size); | 555 | | #endif | 556 | 7.84M | data = current->payload; | 557 | | | 558 | 19.3M | for (i = 0; i < current->payload_size; i++) | 559 | 11.5M | xu(8, payload_byte[i], data[i], 0, 255, 1, i); | 560 | 7.84M | } | 561 | | | 562 | 10.8M | return 0; | 563 | 10.8M | } |
cbs_lcevc.c:cbs_lcevc_write_process_block Line | Count | Source | 479 | 14.8M | { | 480 | 14.8M | const LCEVCProcessBlockTypeDescriptor *desc; | 481 | 14.8M | int err, i; | 482 | | | 483 | 14.8M | desc = ff_cbs_lcevc_process_block_find_type(ctx, current->payload_type); | 484 | 14.8M | if (desc) { | 485 | 4.74M | LCEVCProcessBlockState state = { | 486 | 4.74M | .payload_type = current->payload_type, | 487 | 4.74M | .payload_size = current->payload_size, | 488 | 4.74M | .extension_present = current->extension_bit_length > 0, | 489 | 4.74M | }; | 490 | 4.74M | int start_position, current_position, bits_written; | 491 | | | 492 | | #ifdef READ | 493 | | CHECK(ff_cbs_lcevc_alloc_process_block_payload(current, desc)); | 494 | | #endif | 495 | | | 496 | 4.74M | start_position = bit_position(rw); | 497 | | | 498 | 4.74M | CHECK(desc->READWRITE(ctx, rw, current->payload, &state, nal_unit_type)); | 499 | | | 500 | 4.74M | current_position = bit_position(rw); | 501 | 4.74M | bits_written = current_position - start_position; | 502 | | | 503 | 4.74M | if (byte_alignment(rw) || state.extension_present || | 504 | 4.31M | bits_written < 8 * current->payload_size) { | 505 | 1.21M | size_t bits_left; | 506 | | | 507 | | #ifdef READ | 508 | | GetBitContext tmp = *rw; | 509 | | int trailing_bits, trailing_zero_bits; | 510 | | | 511 | | bits_left = 8 * current->payload_size - bits_written; | 512 | | if (bits_left > 8) | 513 | | skip_bits_long(&tmp, bits_left - 8); | 514 | | trailing_bits = get_bits(&tmp, FFMIN(bits_left, 8)); | 515 | | if (trailing_bits == 0) { | 516 | | // The trailing bits must contain a payload_bit_equal_to_one, so | 517 | | // they can't all be zero. | 518 | | return AVERROR_INVALIDDATA; | 519 | | } | 520 | | trailing_zero_bits = ff_ctz(trailing_bits); | 521 | | current->extension_bit_length = | 522 | | bits_left - 1 - trailing_zero_bits; | 523 | | #endif | 524 | | | 525 | 1.21M | if (current->extension_bit_length > 0) { | 526 | 431k | allocate(current->extension_data, | 527 | 431k | (current->extension_bit_length + 7) / 8); | 528 | | | 529 | 431k | bits_left = current->extension_bit_length; | 530 | 8.39M | for (i = 0; bits_left > 0; i++) { | 531 | 7.96M | int length = FFMIN(bits_left, 8); | 532 | 7.96M | xu(length, reserved_payload_extension_data, | 533 | 7.96M | current->extension_data[i], | 534 | 7.96M | 0, MAX_UINT_BITS(length), 0); | 535 | 7.96M | bits_left -= length; | 536 | 7.96M | } | 537 | 431k | } | 538 | | | 539 | 1.21M | fixed(1, payload_bit_equal_to_one, 1); | 540 | 6.91M | while (byte_alignment(rw)) | 541 | 5.70M | fixed(1, payload_bit_equal_to_zero, 0); | 542 | 1.21M | } | 543 | | | 544 | 4.74M | #ifdef WRITE | 545 | 4.74M | current->payload_size = (put_bits_count(rw) - start_position) / 8; | 546 | 4.74M | #endif | 547 | 10.0M | } else { | 548 | 10.0M | uint8_t *data; | 549 | | | 550 | | #ifdef READ | 551 | | allocate(current->payload_ref, current->payload_size); | 552 | | current->payload = current->payload_ref; | 553 | | #else | 554 | 10.0M | allocate(current->payload, current->payload_size); | 555 | 10.0M | #endif | 556 | 10.0M | data = current->payload; | 557 | | | 558 | 28.3M | for (i = 0; i < current->payload_size; i++) | 559 | 18.2M | xu(8, payload_byte[i], data[i], 0, 255, 1, i); | 560 | 10.0M | } | 561 | | | 562 | 14.8M | return 0; | 563 | 14.8M | } |
|
564 | | |
565 | | static int FUNC(process_block_list)(CodedBitstreamContext *ctx, RWContext *rw, |
566 | | LCEVCRawProcessBlockList *current, |
567 | | int nal_unit_type) |
568 | 42.5k | { |
569 | 42.5k | LCEVCRawProcessBlock *block; |
570 | 42.5k | int err, k; |
571 | | |
572 | | #ifdef READ |
573 | 10.8M | for (k = 0;; k++) { |
574 | 10.8M | int payload_size_type; |
575 | 10.8M | int payload_type; |
576 | 10.8M | uint32_t payload_size; |
577 | 10.8M | uint32_t tmp; |
578 | 10.8M | GetBitContext payload_gbc; |
579 | | |
580 | 10.8M | HEADER("Process Block"); |
581 | | |
582 | 10.8M | xu(3, payload_size_type, tmp, 0, MAX_UINT_BITS(3), 0); |
583 | 10.8M | payload_size_type = tmp; |
584 | 10.8M | xu(5, payload_type, tmp, 0, MAX_UINT_BITS(5), 0); |
585 | 10.8M | payload_type = tmp; |
586 | | |
587 | 10.8M | if (payload_size_type == 6) { |
588 | 358 | av_log(ctx->log_ctx, AV_LOG_ERROR, "payload_size_type == 6\n"); |
589 | 358 | return AVERROR_INVALIDDATA; |
590 | 358 | } |
591 | | |
592 | 10.8M | payload_size = payload_size_type; |
593 | 10.8M | if (payload_size_type == 7) |
594 | 263k | xmb(custom_byte_size, payload_size); |
595 | | |
596 | | // There must be space remaining for the payload |
597 | 10.8M | if (payload_size > get_bits_left(rw) / 8) { |
598 | 1.58k | av_log(ctx->log_ctx, AV_LOG_ERROR, |
599 | 1.58k | "Invalid process block: payload_size too large " |
600 | 1.58k | "(%"PRIu32" bytes).\n", payload_size); |
601 | 1.58k | return AVERROR_INVALIDDATA; |
602 | 1.58k | } |
603 | 10.8M | CHECK(init_get_bits(&payload_gbc, rw->buffer, |
604 | 10.8M | get_bits_count(rw) + 8 * payload_size)); |
605 | 10.8M | skip_bits_long(&payload_gbc, get_bits_count(rw)); |
606 | | |
607 | 10.8M | CHECK(ff_cbs_lcevc_list_add(current, -1)); |
608 | 10.8M | block = ¤t->blocks[k]; |
609 | | |
610 | 10.8M | block->payload_type = payload_type; |
611 | 10.8M | block->payload_size = payload_size; |
612 | | |
613 | 10.8M | CHECK(FUNC(process_block)(ctx, &payload_gbc, block, nal_unit_type)); |
614 | | |
615 | 10.8M | skip_bits_long(rw, 8 * payload_size); |
616 | | |
617 | 10.8M | if (!ff_cbs_h2645_read_more_rbsp_data(rw)) |
618 | 7.22k | break; |
619 | 10.8M | } |
620 | | #else |
621 | 7.42M | for (k = 0; k < current->nb_blocks; k++) { |
622 | 7.41M | PutBitContext start_state; |
623 | 7.41M | uint32_t tmp; |
624 | 7.41M | int trace, i; |
625 | | |
626 | | block = ¤t->blocks[k]; |
627 | | |
628 | | // We write the payload twice in order to find the size. Trace |
629 | | // output is switched off for the first write. |
630 | | trace = ctx->trace_enable; |
631 | | ctx->trace_enable = 0; |
632 | | |
633 | | start_state = *rw; |
634 | 22.2M | for (i = 0; i < 2; i++) { |
635 | 14.8M | *rw = start_state; |
636 | | |
637 | 14.8M | tmp = FFMIN(block->payload_size, 7); |
638 | 14.8M | if (tmp == 6) |
639 | 1.49k | tmp = 7; |
640 | 14.8M | xu(3, payload_size_type, tmp, 0, 7, 0); |
641 | 14.8M | xu(5, payload_type, block->payload_type, 0, MAX_UINT_BITS(5), 0); |
642 | | |
643 | 14.8M | if (tmp == 7) |
644 | 314k | xmb(custom_byte_size, block->payload_size); |
645 | | |
646 | 14.8M | err = FUNC(process_block)(ctx, rw, block, nal_unit_type); |
647 | 14.8M | ctx->trace_enable = trace; |
648 | 14.8M | if (err < 0) |
649 | 1.24k | return err; |
650 | 14.8M | } |
651 | 7.41M | } |
652 | 3.75k | #endif |
653 | | |
654 | 10.9k | return 0; |
655 | 42.5k | } cbs_lcevc.c:cbs_lcevc_read_process_block_list Line | Count | Source | 568 | 37.5k | { | 569 | 37.5k | LCEVCRawProcessBlock *block; | 570 | 37.5k | int err, k; | 571 | | | 572 | 37.5k | #ifdef READ | 573 | 10.8M | for (k = 0;; k++) { | 574 | 10.8M | int payload_size_type; | 575 | 10.8M | int payload_type; | 576 | 10.8M | uint32_t payload_size; | 577 | 10.8M | uint32_t tmp; | 578 | 10.8M | GetBitContext payload_gbc; | 579 | | | 580 | 10.8M | HEADER("Process Block"); | 581 | | | 582 | 10.8M | xu(3, payload_size_type, tmp, 0, MAX_UINT_BITS(3), 0); | 583 | 10.8M | payload_size_type = tmp; | 584 | 10.8M | xu(5, payload_type, tmp, 0, MAX_UINT_BITS(5), 0); | 585 | 10.8M | payload_type = tmp; | 586 | | | 587 | 10.8M | if (payload_size_type == 6) { | 588 | 358 | av_log(ctx->log_ctx, AV_LOG_ERROR, "payload_size_type == 6\n"); | 589 | 358 | return AVERROR_INVALIDDATA; | 590 | 358 | } | 591 | | | 592 | 10.8M | payload_size = payload_size_type; | 593 | 10.8M | if (payload_size_type == 7) | 594 | 263k | xmb(custom_byte_size, payload_size); | 595 | | | 596 | | // There must be space remaining for the payload | 597 | 10.8M | if (payload_size > get_bits_left(rw) / 8) { | 598 | 1.58k | av_log(ctx->log_ctx, AV_LOG_ERROR, | 599 | 1.58k | "Invalid process block: payload_size too large " | 600 | 1.58k | "(%"PRIu32" bytes).\n", payload_size); | 601 | 1.58k | return AVERROR_INVALIDDATA; | 602 | 1.58k | } | 603 | 10.8M | CHECK(init_get_bits(&payload_gbc, rw->buffer, | 604 | 10.8M | get_bits_count(rw) + 8 * payload_size)); | 605 | 10.8M | skip_bits_long(&payload_gbc, get_bits_count(rw)); | 606 | | | 607 | 10.8M | CHECK(ff_cbs_lcevc_list_add(current, -1)); | 608 | 10.8M | block = ¤t->blocks[k]; | 609 | | | 610 | 10.8M | block->payload_type = payload_type; | 611 | 10.8M | block->payload_size = payload_size; | 612 | | | 613 | 10.8M | CHECK(FUNC(process_block)(ctx, &payload_gbc, block, nal_unit_type)); | 614 | | | 615 | 10.8M | skip_bits_long(rw, 8 * payload_size); | 616 | | | 617 | 10.8M | if (!ff_cbs_h2645_read_more_rbsp_data(rw)) | 618 | 7.22k | break; | 619 | 10.8M | } | 620 | | #else | 621 | | for (k = 0; k < current->nb_blocks; k++) { | 622 | | PutBitContext start_state; | 623 | | uint32_t tmp; | 624 | | int trace, i; | 625 | | | 626 | | block = ¤t->blocks[k]; | 627 | | | 628 | | // We write the payload twice in order to find the size. Trace | 629 | | // output is switched off for the first write. | 630 | | trace = ctx->trace_enable; | 631 | | ctx->trace_enable = 0; | 632 | | | 633 | | start_state = *rw; | 634 | | for (i = 0; i < 2; i++) { | 635 | | *rw = start_state; | 636 | | | 637 | | tmp = FFMIN(block->payload_size, 7); | 638 | | if (tmp == 6) | 639 | | tmp = 7; | 640 | | xu(3, payload_size_type, tmp, 0, 7, 0); | 641 | | xu(5, payload_type, block->payload_type, 0, MAX_UINT_BITS(5), 0); | 642 | | | 643 | | if (tmp == 7) | 644 | | xmb(custom_byte_size, block->payload_size); | 645 | | | 646 | | err = FUNC(process_block)(ctx, rw, block, nal_unit_type); | 647 | | ctx->trace_enable = trace; | 648 | | if (err < 0) | 649 | | return err; | 650 | | } | 651 | | } | 652 | | #endif | 653 | | | 654 | 7.22k | return 0; | 655 | 37.5k | } |
cbs_lcevc.c:cbs_lcevc_write_process_block_list Line | Count | Source | 568 | 4.99k | { | 569 | 4.99k | LCEVCRawProcessBlock *block; | 570 | 4.99k | int err, k; | 571 | | | 572 | | #ifdef READ | 573 | | for (k = 0;; k++) { | 574 | | int payload_size_type; | 575 | | int payload_type; | 576 | | uint32_t payload_size; | 577 | | uint32_t tmp; | 578 | | GetBitContext payload_gbc; | 579 | | | 580 | | HEADER("Process Block"); | 581 | | | 582 | | xu(3, payload_size_type, tmp, 0, MAX_UINT_BITS(3), 0); | 583 | | payload_size_type = tmp; | 584 | | xu(5, payload_type, tmp, 0, MAX_UINT_BITS(5), 0); | 585 | | payload_type = tmp; | 586 | | | 587 | | if (payload_size_type == 6) { | 588 | | av_log(ctx->log_ctx, AV_LOG_ERROR, "payload_size_type == 6\n"); | 589 | | return AVERROR_INVALIDDATA; | 590 | | } | 591 | | | 592 | | payload_size = payload_size_type; | 593 | | if (payload_size_type == 7) | 594 | | xmb(custom_byte_size, payload_size); | 595 | | | 596 | | // There must be space remaining for the payload | 597 | | if (payload_size > get_bits_left(rw) / 8) { | 598 | | av_log(ctx->log_ctx, AV_LOG_ERROR, | 599 | | "Invalid process block: payload_size too large " | 600 | | "(%"PRIu32" bytes).\n", payload_size); | 601 | | return AVERROR_INVALIDDATA; | 602 | | } | 603 | | CHECK(init_get_bits(&payload_gbc, rw->buffer, | 604 | | get_bits_count(rw) + 8 * payload_size)); | 605 | | skip_bits_long(&payload_gbc, get_bits_count(rw)); | 606 | | | 607 | | CHECK(ff_cbs_lcevc_list_add(current, -1)); | 608 | | block = ¤t->blocks[k]; | 609 | | | 610 | | block->payload_type = payload_type; | 611 | | block->payload_size = payload_size; | 612 | | | 613 | | CHECK(FUNC(process_block)(ctx, &payload_gbc, block, nal_unit_type)); | 614 | | | 615 | | skip_bits_long(rw, 8 * payload_size); | 616 | | | 617 | | if (!ff_cbs_h2645_read_more_rbsp_data(rw)) | 618 | | break; | 619 | | } | 620 | | #else | 621 | 7.42M | for (k = 0; k < current->nb_blocks; k++) { | 622 | 7.41M | PutBitContext start_state; | 623 | 7.41M | uint32_t tmp; | 624 | 7.41M | int trace, i; | 625 | | | 626 | 7.41M | block = ¤t->blocks[k]; | 627 | | | 628 | | // We write the payload twice in order to find the size. Trace | 629 | | // output is switched off for the first write. | 630 | 7.41M | trace = ctx->trace_enable; | 631 | 7.41M | ctx->trace_enable = 0; | 632 | | | 633 | 7.41M | start_state = *rw; | 634 | 22.2M | for (i = 0; i < 2; i++) { | 635 | 14.8M | *rw = start_state; | 636 | | | 637 | 14.8M | tmp = FFMIN(block->payload_size, 7); | 638 | 14.8M | if (tmp == 6) | 639 | 1.49k | tmp = 7; | 640 | 14.8M | xu(3, payload_size_type, tmp, 0, 7, 0); | 641 | 14.8M | xu(5, payload_type, block->payload_type, 0, MAX_UINT_BITS(5), 0); | 642 | | | 643 | 14.8M | if (tmp == 7) | 644 | 314k | xmb(custom_byte_size, block->payload_size); | 645 | | | 646 | 14.8M | err = FUNC(process_block)(ctx, rw, block, nal_unit_type); | 647 | 14.8M | ctx->trace_enable = trace; | 648 | 14.8M | if (err < 0) | 649 | 1.24k | return err; | 650 | 14.8M | } | 651 | 7.41M | } | 652 | 3.75k | #endif | 653 | | | 654 | 3.75k | return 0; | 655 | 4.99k | } |
|
656 | | |
657 | | static int FUNC(nal)(CodedBitstreamContext *ctx, RWContext *rw, |
658 | | LCEVCRawNAL *current, int nal_unit_type) |
659 | 42.9k | { |
660 | 42.9k | int err; |
661 | | |
662 | 42.9k | if (nal_unit_type == LCEVC_NON_IDR_NUT) |
663 | 24.9k | HEADER("Non IDR"); |
664 | 17.9k | else |
665 | 17.9k | HEADER("IDR"); |
666 | | |
667 | 42.9k | CHECK(FUNC(nal_unit_header)(ctx, rw, ¤t->nal_unit_header, |
668 | 42.9k | (1 << LCEVC_IDR_NUT) | (1 << LCEVC_NON_IDR_NUT))); |
669 | | |
670 | 42.5k | CHECK(FUNC(process_block_list) (ctx, rw, ¤t->process_block_list, |
671 | 42.5k | current->nal_unit_header.nal_unit_type)); |
672 | | |
673 | 10.9k | CHECK(FUNC(rbsp_trailing_bits)(ctx, rw)); |
674 | | |
675 | 10.3k | return 0; |
676 | 10.9k | } cbs_lcevc.c:cbs_lcevc_read_nal Line | Count | Source | 659 | 37.9k | { | 660 | 37.9k | int err; | 661 | | | 662 | 37.9k | if (nal_unit_type == LCEVC_NON_IDR_NUT) | 663 | 21.2k | HEADER("Non IDR"); | 664 | 16.6k | else | 665 | 16.6k | HEADER("IDR"); | 666 | | | 667 | 37.9k | CHECK(FUNC(nal_unit_header)(ctx, rw, ¤t->nal_unit_header, | 668 | 37.9k | (1 << LCEVC_IDR_NUT) | (1 << LCEVC_NON_IDR_NUT))); | 669 | | | 670 | 37.5k | CHECK(FUNC(process_block_list) (ctx, rw, ¤t->process_block_list, | 671 | 37.5k | current->nal_unit_header.nal_unit_type)); | 672 | | | 673 | 7.22k | CHECK(FUNC(rbsp_trailing_bits)(ctx, rw)); | 674 | | | 675 | 6.62k | return 0; | 676 | 7.22k | } |
cbs_lcevc.c:cbs_lcevc_write_nal Line | Count | Source | 659 | 4.99k | { | 660 | 4.99k | int err; | 661 | | | 662 | 4.99k | if (nal_unit_type == LCEVC_NON_IDR_NUT) | 663 | 3.66k | HEADER("Non IDR"); | 664 | 1.32k | else | 665 | 1.32k | HEADER("IDR"); | 666 | | | 667 | 4.99k | CHECK(FUNC(nal_unit_header)(ctx, rw, ¤t->nal_unit_header, | 668 | 4.99k | (1 << LCEVC_IDR_NUT) | (1 << LCEVC_NON_IDR_NUT))); | 669 | | | 670 | 4.99k | CHECK(FUNC(process_block_list) (ctx, rw, ¤t->process_block_list, | 671 | 4.99k | current->nal_unit_header.nal_unit_type)); | 672 | | | 673 | 3.75k | CHECK(FUNC(rbsp_trailing_bits)(ctx, rw)); | 674 | | | 675 | 3.75k | return 0; | 676 | 3.75k | } |
|