| Line | Branch | Exec | 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 | ✗ | SEI_FUNC(filler_payload, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 20 | SEIRawFillerPayload *current, | ||
| 21 | SEIMessageState *state)) | ||
| 22 | { | ||
| 23 | int err, i; | ||
| 24 | |||
| 25 | ✗ | HEADER("Filler Payload"); | |
| 26 | |||
| 27 | #ifdef READ | ||
| 28 | ✗ | current->payload_size = state->payload_size; | |
| 29 | #endif | ||
| 30 | |||
| 31 | ✗ | for (i = 0; i < current->payload_size; i++) | |
| 32 | ✗ | fixed(8, ff_byte, 0xff); | |
| 33 | |||
| 34 | ✗ | return 0; | |
| 35 | } | ||
| 36 | |||
| 37 | 300 | SEI_FUNC(user_data_registered, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 38 | SEIRawUserDataRegistered *current, | ||
| 39 | SEIMessageState *state)) | ||
| 40 | { | ||
| 41 | int err, i, j; | ||
| 42 | |||
| 43 | 150 | HEADER("User Data Registered ITU-T T.35"); | |
| 44 | |||
| 45 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 75 times.
|
150 | u(8, itu_t_t35_country_code, 0x00, 0xff); |
| 46 |
1/2✓ Branch 0 taken 75 times.
✗ Branch 1 not taken.
|
150 | if (current->itu_t_t35_country_code != 0xff) |
| 47 | 150 | i = 1; | |
| 48 | else { | ||
| 49 | ✗ | u(8, itu_t_t35_country_code_extension_byte, 0x00, 0xff); | |
| 50 | ✗ | i = 2; | |
| 51 | } | ||
| 52 | |||
| 53 | #ifdef READ | ||
| 54 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
|
50 | if (state->payload_size < i) { |
| 55 | ✗ | av_log(ctx->log_ctx, AV_LOG_ERROR, | |
| 56 | "Invalid SEI user data registered payload.\n"); | ||
| 57 | ✗ | return AVERROR_INVALIDDATA; | |
| 58 | } | ||
| 59 | 50 | current->data_length = state->payload_size - i; | |
| 60 | #endif | ||
| 61 | |||
| 62 |
2/3✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
✓ Branch 2 taken 25 times.
|
150 | allocate(current->data, current->data_length); |
| 63 |
2/2✓ Branch 0 taken 729 times.
✓ Branch 1 taken 75 times.
|
1608 | for (j = 0; j < current->data_length; j++) |
| 64 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 729 times.
|
1458 | xu(8, itu_t_t35_payload_byte[], current->data[j], 0x00, 0xff, 1, i + j); |
| 65 | |||
| 66 | 150 | return 0; | |
| 67 | } | ||
| 68 | |||
| 69 | 264 | SEI_FUNC(user_data_unregistered, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 70 | SEIRawUserDataUnregistered *current, | ||
| 71 | SEIMessageState *state)) | ||
| 72 | { | ||
| 73 | int err, i; | ||
| 74 | |||
| 75 | 132 | HEADER("User Data Unregistered"); | |
| 76 | |||
| 77 | #ifdef READ | ||
| 78 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
|
44 | if (state->payload_size < 16) { |
| 79 | ✗ | av_log(ctx->log_ctx, AV_LOG_ERROR, | |
| 80 | "Invalid SEI user data unregistered payload.\n"); | ||
| 81 | ✗ | return AVERROR_INVALIDDATA; | |
| 82 | } | ||
| 83 | 44 | current->data_length = state->payload_size - 16; | |
| 84 | #endif | ||
| 85 | |||
| 86 |
2/2✓ Branch 0 taken 1056 times.
✓ Branch 1 taken 66 times.
|
2244 | for (i = 0; i < 16; i++) |
| 87 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1056 times.
|
2112 | us(8, uuid_iso_iec_11578[i], 0x00, 0xff, 1, i); |
| 88 | |||
| 89 |
2/3✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
✓ Branch 2 taken 22 times.
|
132 | allocate(current->data, current->data_length); |
| 90 | |||
| 91 |
2/2✓ Branch 0 taken 18363 times.
✓ Branch 1 taken 66 times.
|
36858 | for (i = 0; i < current->data_length; i++) |
| 92 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 18363 times.
|
36726 | xu(8, user_data_payload_byte[i], current->data[i], 0x00, 0xff, 1, i); |
| 93 | |||
| 94 | 132 | return 0; | |
| 95 | } | ||
| 96 | |||
| 97 | ✗ | SEI_FUNC(frame_packing_arrangement, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 98 | SEIRawFramePackingArrangement *current, | ||
| 99 | SEIMessageState *unused)) | ||
| 100 | { | ||
| 101 | int err; | ||
| 102 | |||
| 103 | ✗ | HEADER("Frame Packing Arrangement"); | |
| 104 | |||
| 105 | ✗ | ue(fp_arrangement_id, 0, MAX_UINT_BITS(31)); | |
| 106 | ✗ | flag(fp_arrangement_cancel_flag); | |
| 107 | ✗ | if (!current->fp_arrangement_cancel_flag) { | |
| 108 | ✗ | u(7, fp_arrangement_type, 3, 5); | |
| 109 | ✗ | flag(fp_quincunx_sampling_flag); | |
| 110 | ✗ | u(6, fp_content_interpretation_type, 0, 2); | |
| 111 | ✗ | flag(fp_spatial_flipping_flag); | |
| 112 | ✗ | flag(fp_frame0_flipped_flag); | |
| 113 | ✗ | flag(fp_field_views_flag); | |
| 114 | ✗ | flag(fp_current_frame_is_frame0_flag); | |
| 115 | ✗ | flag(fp_frame0_self_contained_flag); | |
| 116 | ✗ | flag(fp_frame1_self_contained_flag); | |
| 117 | ✗ | if (!current->fp_quincunx_sampling_flag && current->fp_arrangement_type != 5) { | |
| 118 | ✗ | ub(4, fp_frame0_grid_position_x); | |
| 119 | ✗ | ub(4, fp_frame0_grid_position_y); | |
| 120 | ✗ | ub(4, fp_frame1_grid_position_x); | |
| 121 | ✗ | ub(4, fp_frame1_grid_position_y); | |
| 122 | } | ||
| 123 | ✗ | fixed(8, fp_arrangement_reserved_byte, 0); | |
| 124 | ✗ | flag(fp_arrangement_persistence_flag); | |
| 125 | } | ||
| 126 | ✗ | flag(fp_upsampled_aspect_ratio_flag); | |
| 127 | |||
| 128 | ✗ | return 0; | |
| 129 | } | ||
| 130 | |||
| 131 | 29568 | SEI_FUNC(decoded_picture_hash, (CodedBitstreamContext *ctx, | |
| 132 | RWContext *rw, | ||
| 133 | SEIRawDecodedPictureHash *current, | ||
| 134 | SEIMessageState *unused)) | ||
| 135 | { | ||
| 136 | int err, c_idx, i; | ||
| 137 | |||
| 138 | 14784 | HEADER("Decoded Picture Hash"); | |
| 139 | |||
| 140 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 7392 times.
|
14784 | u(8, dph_sei_hash_type, 0, 2); |
| 141 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 7392 times.
|
14784 | flag(dph_sei_single_component_flag); |
| 142 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 7392 times.
|
14784 | ub(7, dph_sei_reserved_zero_7bits); |
| 143 | |||
| 144 |
4/4✓ Branch 0 taken 516 times.
✓ Branch 1 taken 28536 times.
✓ Branch 2 taken 21660 times.
✓ Branch 3 taken 7392 times.
|
58104 | for (c_idx = 0; c_idx < (current->dph_sei_single_component_flag ? 1 : 3); |
| 145 | 43320 | c_idx++) { | |
| 146 |
1/2✓ Branch 0 taken 21660 times.
✗ Branch 1 not taken.
|
43320 | if (current->dph_sei_hash_type == 0) { |
| 147 |
2/2✓ Branch 0 taken 346560 times.
✓ Branch 1 taken 21660 times.
|
736440 | for (i = 0; i < 16; i++) |
| 148 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 346560 times.
|
693120 | us(8, dph_sei_picture_md5[c_idx][i], 0x00, 0xff, 2, c_idx, i); |
| 149 | ✗ | } else if (current->dph_sei_hash_type == 1) { | |
| 150 | ✗ | us(16, dph_sei_picture_crc[c_idx], 0x0000, 0xffff, 1, c_idx); | |
| 151 | ✗ | } else if (current->dph_sei_hash_type == 2) { | |
| 152 | ✗ | us(32, dph_sei_picture_checksum[c_idx], 0x00000000, 0xffffffff, 1, | |
| 153 | c_idx); | ||
| 154 | } | ||
| 155 | } | ||
| 156 | 14784 | return 0; | |
| 157 | } | ||
| 158 | |||
| 159 | 12 | SEI_FUNC(mastering_display_colour_volume, | |
| 160 | (CodedBitstreamContext *ctx, RWContext *rw, | ||
| 161 | SEIRawMasteringDisplayColourVolume *current, | ||
| 162 | SEIMessageState *state)) | ||
| 163 | { | ||
| 164 | int err, c; | ||
| 165 | |||
| 166 | 6 | HEADER("Mastering Display Colour Volume"); | |
| 167 | |||
| 168 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
|
24 | for (c = 0; c < 3; c++) { |
| 169 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
|
18 | ubs(16, display_primaries_x[c], 1, c); |
| 170 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
|
18 | ubs(16, display_primaries_y[c], 1, c); |
| 171 | } | ||
| 172 | |||
| 173 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
6 | ub(16, white_point_x); |
| 174 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
6 | ub(16, white_point_y); |
| 175 | |||
| 176 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
6 | ub(32, max_display_mastering_luminance); |
| 177 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
6 | ub(32, min_display_mastering_luminance); |
| 178 | |||
| 179 | 6 | return 0; | |
| 180 | } | ||
| 181 | |||
| 182 | ✗ | SEI_FUNC(content_light_level_info, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 183 | SEIRawContentLightLevelInfo *current, | ||
| 184 | SEIMessageState *state)) | ||
| 185 | { | ||
| 186 | int err; | ||
| 187 | |||
| 188 | ✗ | HEADER("Content Light Level Information"); | |
| 189 | |||
| 190 | ✗ | ub(16, max_content_light_level); | |
| 191 | ✗ | ub(16, max_pic_average_light_level); | |
| 192 | |||
| 193 | ✗ | return 0; | |
| 194 | } | ||
| 195 | |||
| 196 | ✗ | SEI_FUNC(alternative_transfer_characteristics, | |
| 197 | (CodedBitstreamContext *ctx, RWContext *rw, | ||
| 198 | SEIRawAlternativeTransferCharacteristics *current, | ||
| 199 | SEIMessageState *state)) | ||
| 200 | { | ||
| 201 | int err; | ||
| 202 | |||
| 203 | ✗ | HEADER("Alternative Transfer Characteristics"); | |
| 204 | |||
| 205 | ✗ | ub(8, preferred_transfer_characteristics); | |
| 206 | |||
| 207 | ✗ | return 0; | |
| 208 | } | ||
| 209 | |||
| 210 | ✗ | SEI_FUNC(ambient_viewing_environment, | |
| 211 | (CodedBitstreamContext *ctx, RWContext *rw, | ||
| 212 | SEIRawAmbientViewingEnvironment *current, | ||
| 213 | SEIMessageState *state)) | ||
| 214 | { | ||
| 215 | static const uint16_t max_ambient_light_value = 50000; | ||
| 216 | int err; | ||
| 217 | |||
| 218 | ✗ | HEADER("Ambient Viewing Environment"); | |
| 219 | |||
| 220 | ✗ | u(32, ambient_illuminance, 1, MAX_UINT_BITS(32)); | |
| 221 | ✗ | u(16, ambient_light_x, 0, max_ambient_light_value); | |
| 222 | ✗ | u(16, ambient_light_y, 0, max_ambient_light_value); | |
| 223 | |||
| 224 | ✗ | return 0; | |
| 225 | } | ||
| 226 | |||
| 227 | ✗ | SEI_FUNC(film_grain_characteristics, | |
| 228 | (CodedBitstreamContext *ctx, RWContext *rw, | ||
| 229 | SEIRawFilmGrainCharacteristics *current, | ||
| 230 | SEIMessageState *state)) | ||
| 231 | { | ||
| 232 | int err, c, i, j; | ||
| 233 | |||
| 234 | ✗ | HEADER("Film Grain Characteristics"); | |
| 235 | |||
| 236 | ✗ | flag(fg_characteristics_cancel_flag); | |
| 237 | ✗ | if (!current->fg_characteristics_cancel_flag) { | |
| 238 | int filmGrainBitDepth[3]; | ||
| 239 | |||
| 240 | ✗ | u(2, fg_model_id, 0, 1); | |
| 241 | ✗ | flag(fg_separate_colour_description_present_flag); | |
| 242 | ✗ | if (current->fg_separate_colour_description_present_flag) { | |
| 243 | ✗ | ub(3, fg_bit_depth_luma_minus8); | |
| 244 | ✗ | ub(3, fg_bit_depth_chroma_minus8); | |
| 245 | ✗ | flag(fg_full_range_flag); | |
| 246 | ✗ | ub(8, fg_colour_primaries); | |
| 247 | ✗ | ub(8, fg_transfer_characteristics); | |
| 248 | ✗ | ub(8, fg_matrix_coeffs); | |
| 249 | } | ||
| 250 | |||
| 251 | ✗ | filmGrainBitDepth[0] = current->fg_bit_depth_luma_minus8 + 8; | |
| 252 | ✗ | filmGrainBitDepth[1] = | |
| 253 | ✗ | filmGrainBitDepth[2] = current->fg_bit_depth_chroma_minus8 + 8; | |
| 254 | |||
| 255 | ✗ | u(2, fg_blending_mode_id, 0, 1); | |
| 256 | ✗ | ub(4, fg_log2_scale_factor); | |
| 257 | ✗ | for (c = 0; c < 3; c++) | |
| 258 | ✗ | flags(fg_comp_model_present_flag[c], 1, c); | |
| 259 | |||
| 260 | ✗ | for (c = 0; c < 3; c++) { | |
| 261 | ✗ | if (current->fg_comp_model_present_flag[c]) { | |
| 262 | ✗ | ubs(8, fg_num_intensity_intervals_minus1[c], 1, c); | |
| 263 | ✗ | us(3, fg_num_model_values_minus1[c], 0, 5, 1, c); | |
| 264 | ✗ | for (i = 0; i <= current->fg_num_intensity_intervals_minus1[c]; i++) { | |
| 265 | ✗ | ubs(8, fg_intensity_interval_lower_bound[c][i], 2, c, i); | |
| 266 | ✗ | ubs(8, fg_intensity_interval_upper_bound[c][i], 2, c, i); | |
| 267 | ✗ | for (j = 0; j <= current->fg_num_model_values_minus1[c]; j++) | |
| 268 | ✗ | ses(fg_comp_model_value[c][i][j], 0 - current->fg_model_id * (1 << (filmGrainBitDepth[c] - 1)), | |
| 269 | ((1 << filmGrainBitDepth[c]) - 1) - current->fg_model_id * (1 << (filmGrainBitDepth[c] - 1)), | ||
| 270 | 3, c, i, j); | ||
| 271 | } | ||
| 272 | } | ||
| 273 | } | ||
| 274 | ✗ | flag(fg_characteristics_persistence_flag); | |
| 275 | } | ||
| 276 | |||
| 277 | ✗ | return 0; | |
| 278 | } | ||
| 279 | |||
| 280 | ✗ | SEI_FUNC(display_orientation, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 281 | SEIRawDisplayOrientation *current, | ||
| 282 | SEIMessageState *state)) | ||
| 283 | { | ||
| 284 | int err; | ||
| 285 | |||
| 286 | ✗ | HEADER("Display Orientation"); | |
| 287 | |||
| 288 | ✗ | flag(display_orientation_cancel_flag); | |
| 289 | ✗ | if (!current->display_orientation_cancel_flag) { | |
| 290 | ✗ | flag(display_orientation_persistence_flag); | |
| 291 | ✗ | u(3, display_orientation_transform_type, 0, 7); | |
| 292 | ✗ | ub(3, display_orientation_reserved_zero_3bits); | |
| 293 | } | ||
| 294 | |||
| 295 | ✗ | return 0; | |
| 296 | } | ||
| 297 | |||
| 298 | 88 | SEI_FUNC(frame_field_information, (CodedBitstreamContext *ctx, RWContext *rw, | |
| 299 | SEIRawFrameFieldInformation *current, | ||
| 300 | SEIMessageState *state)) | ||
| 301 | { | ||
| 302 | int err; | ||
| 303 | |||
| 304 | 44 | HEADER("Frame-field information"); | |
| 305 | |||
| 306 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
|
44 | flag(ffi_field_pic_flag); |
| 307 |
1/2✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
|
44 | if (current->ffi_field_pic_flag) { |
| 308 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
|
44 | flag(ffi_bottom_field_flag); |
| 309 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
|
44 | flag(ffi_pairing_indicated_flag); |
| 310 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
|
44 | if (current->ffi_pairing_indicated_flag) |
| 311 | ✗ | flag(ffi_paired_with_next_field_flag); | |
| 312 | } else { | ||
| 313 | ✗ | flag(ffi_display_fields_from_frame_flag); | |
| 314 | ✗ | if (current->ffi_display_fields_from_frame_flag) | |
| 315 | ✗ | flag(ffi_top_field_first_flag); | |
| 316 | ✗ | u(8, ffi_display_elemental_periods_minus1, 0, 0xff); | |
| 317 | } | ||
| 318 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
|
44 | u(2, ffi_source_scan_type, 0, 3); |
| 319 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
|
44 | flag(ffi_duplicate_flag); |
| 320 | |||
| 321 | 44 | return 0; | |
| 322 | } | ||
| 323 | |||
| 324 | 29276 | static int FUNC(message)(CodedBitstreamContext *ctx, RWContext *rw, | |
| 325 | SEIRawMessage *current) | ||
| 326 | { | ||
| 327 | const SEIMessageTypeDescriptor *desc; | ||
| 328 | int err, i; | ||
| 329 | |||
| 330 | 29276 | desc = ff_cbs_sei_find_type(ctx, current->payload_type); | |
| 331 |
2/2✓ Branch 0 taken 14369 times.
✓ Branch 1 taken 269 times.
|
29276 | if (desc) { |
| 332 | 28738 | SEIMessageState state = { | |
| 333 | 28738 | .payload_type = current->payload_type, | |
| 334 | 28738 | .payload_size = current->payload_size, | |
| 335 | 28738 | .extension_present = current->extension_bit_length > 0, | |
| 336 | }; | ||
| 337 | int start_position, current_position, bits_written; | ||
| 338 | |||
| 339 | #ifdef READ | ||
| 340 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5945 times.
|
11890 | CHECK(ff_cbs_sei_alloc_message_payload(current, desc)); |
| 341 | #endif | ||
| 342 | |||
| 343 | 28738 | start_position = bit_position(rw); | |
| 344 | |||
| 345 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 14369 times.
|
28738 | CHECK(desc->READWRITE(ctx, rw, current->payload, &state)); |
| 346 | |||
| 347 | 28738 | current_position = bit_position(rw); | |
| 348 | 28738 | bits_written = current_position - start_position; | |
| 349 | |||
| 350 |
3/4✓ Branch 1 taken 12064 times.
✓ Branch 2 taken 2305 times.
✓ Branch 3 taken 12064 times.
✗ Branch 4 not taken.
|
28738 | if (byte_alignment(rw) || state.extension_present || |
| 351 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12064 times.
|
24128 | bits_written < 8 * current->payload_size) { |
| 352 | size_t bits_left; | ||
| 353 | |||
| 354 | #ifdef READ | ||
| 355 | 2110 | GetBitContext tmp = *rw; | |
| 356 | int trailing_bits, trailing_zero_bits; | ||
| 357 | |||
| 358 | 2110 | bits_left = 8 * current->payload_size - bits_written; | |
| 359 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1055 times.
|
2110 | if (bits_left > 8) |
| 360 | ✗ | skip_bits_long(&tmp, bits_left - 8); | |
| 361 | 2110 | trailing_bits = get_bits(&tmp, FFMIN(bits_left, 8)); | |
| 362 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1055 times.
|
2110 | if (trailing_bits == 0) { |
| 363 | // The trailing bits must contain a bit_equal_to_one, so | ||
| 364 | // they can't all be zero. | ||
| 365 | ✗ | return AVERROR_INVALIDDATA; | |
| 366 | } | ||
| 367 | 2110 | trailing_zero_bits = ff_ctz(trailing_bits); | |
| 368 | 2110 | current->extension_bit_length = | |
| 369 | 2110 | bits_left - 1 - trailing_zero_bits; | |
| 370 | #endif | ||
| 371 | |||
| 372 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2305 times.
|
4610 | if (current->extension_bit_length > 0) { |
| 373 | ✗ | allocate(current->extension_data, | |
| 374 | (current->extension_bit_length + 7) / 8); | ||
| 375 | |||
| 376 | ✗ | bits_left = current->extension_bit_length; | |
| 377 | ✗ | for (i = 0; bits_left > 0; i++) { | |
| 378 | ✗ | int length = FFMIN(bits_left, 8); | |
| 379 | ✗ | xu(length, reserved_payload_extension_data, | |
| 380 | current->extension_data[i], | ||
| 381 | 0, MAX_UINT_BITS(length), 0); | ||
| 382 | ✗ | bits_left -= length; | |
| 383 | } | ||
| 384 | } | ||
| 385 | |||
| 386 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2305 times.
|
4610 | fixed(1, bit_equal_to_one, 1); |
| 387 |
2/2✓ Branch 1 taken 3124 times.
✓ Branch 2 taken 2305 times.
|
10858 | while (byte_alignment(rw)) |
| 388 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3124 times.
|
6248 | fixed(1, bit_equal_to_zero, 0); |
| 389 | } | ||
| 390 | |||
| 391 | #ifdef WRITE | ||
| 392 | 16848 | current->payload_size = (put_bits_count(rw) - start_position) / 8; | |
| 393 | #endif | ||
| 394 | } else { | ||
| 395 | uint8_t *data; | ||
| 396 | |||
| 397 | #ifdef READ | ||
| 398 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
|
270 | allocate(current->payload_ref, current->payload_size); |
| 399 | 270 | current->payload = current->payload_ref; | |
| 400 | #else | ||
| 401 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 134 times.
|
268 | allocate(current->payload, current->payload_size); |
| 402 | #endif | ||
| 403 | 538 | data = current->payload; | |
| 404 | |||
| 405 |
2/2✓ Branch 0 taken 6370 times.
✓ Branch 1 taken 269 times.
|
13278 | for (i = 0; i < current->payload_size; i++) |
| 406 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6370 times.
|
12740 | xu(8, payload_byte[i], data[i], 0, 255, 1, i); |
| 407 | } | ||
| 408 | |||
| 409 | 29276 | return 0; | |
| 410 | } | ||
| 411 | |||
| 412 | 10319 | static int FUNC(message_list)(CodedBitstreamContext *ctx, RWContext *rw, | |
| 413 | SEIRawMessageList *current, int prefix) | ||
| 414 | { | ||
| 415 | SEIRawMessage *message; | ||
| 416 | int err, k; | ||
| 417 | |||
| 418 | #ifdef READ | ||
| 419 | 6080 | for (k = 0;; k++) { | |
| 420 | 6080 | uint32_t payload_type = 0; | |
| 421 | 6080 | uint32_t payload_size = 0; | |
| 422 | uint32_t tmp; | ||
| 423 | GetBitContext payload_gbc; | ||
| 424 | |||
| 425 | 6100 | while (show_bits(rw, 8) == 0xff) { | |
| 426 | 20 | fixed(8, ff_byte, 0xff); | |
| 427 | 20 | payload_type += 255; | |
| 428 | } | ||
| 429 | 6080 | xu(8, last_payload_type_byte, tmp, 0, 254, 0); | |
| 430 | 6080 | payload_type += tmp; | |
| 431 | |||
| 432 | 6103 | while (show_bits(rw, 8) == 0xff) { | |
| 433 | 23 | fixed(8, ff_byte, 0xff); | |
| 434 | 23 | payload_size += 255; | |
| 435 | } | ||
| 436 | 6080 | xu(8, last_payload_size_byte, tmp, 0, 254, 0); | |
| 437 | 6080 | payload_size += tmp; | |
| 438 | |||
| 439 | // There must be space remaining for both the payload and | ||
| 440 | // the trailing bits on the SEI NAL unit. | ||
| 441 | 6080 | if (payload_size + 1 > get_bits_left(rw) / 8) { | |
| 442 | ✗ | av_log(ctx->log_ctx, AV_LOG_ERROR, | |
| 443 | "Invalid SEI message: payload_size too large " | ||
| 444 | "(%"PRIu32" bytes).\n", payload_size); | ||
| 445 | ✗ | return AVERROR_INVALIDDATA; | |
| 446 | } | ||
| 447 | 6080 | CHECK(init_get_bits(&payload_gbc, rw->buffer, | |
| 448 | get_bits_count(rw) + 8 * payload_size)); | ||
| 449 | 6080 | skip_bits_long(&payload_gbc, get_bits_count(rw)); | |
| 450 | |||
| 451 | 6080 | CHECK(ff_cbs_sei_list_add(current)); | |
| 452 | 6080 | message = ¤t->messages[k]; | |
| 453 | |||
| 454 | 6080 | message->payload_type = payload_type; | |
| 455 | 6080 | message->payload_size = payload_size; | |
| 456 | |||
| 457 | 6080 | CHECK(FUNC(message)(ctx, &payload_gbc, message)); | |
| 458 | |||
| 459 | 6080 | skip_bits_long(rw, 8 * payload_size); | |
| 460 | |||
| 461 | 6080 | if (!cbs_h2645_read_more_rbsp_data(rw)) | |
| 462 | 6060 | break; | |
| 463 | } | ||
| 464 | #else | ||
| 465 | 8538 | for (k = 0; k < current->nb_messages; k++) { | |
| 466 | PutBitContext start_state; | ||
| 467 | uint32_t tmp; | ||
| 468 | int trace, i; | ||
| 469 | |||
| 470 | 4279 | message = ¤t->messages[k]; | |
| 471 | |||
| 472 | // We write the payload twice in order to find the size. Trace | ||
| 473 | // output is switched off for the first write. | ||
| 474 | 4279 | trace = ctx->trace_enable; | |
| 475 | 4279 | ctx->trace_enable = 0; | |
| 476 | |||
| 477 | 4279 | start_state = *rw; | |
| 478 | 12837 | for (i = 0; i < 2; i++) { | |
| 479 | 8558 | *rw = start_state; | |
| 480 | |||
| 481 | 8558 | tmp = message->payload_type; | |
| 482 | 8598 | while (tmp >= 255) { | |
| 483 | 40 | fixed(8, ff_byte, 0xff); | |
| 484 | 40 | tmp -= 255; | |
| 485 | } | ||
| 486 | 8558 | xu(8, last_payload_type_byte, tmp, 0, 254, 0); | |
| 487 | |||
| 488 | 8558 | tmp = message->payload_size; | |
| 489 | 8604 | while (tmp >= 255) { | |
| 490 | 46 | fixed(8, ff_byte, 0xff); | |
| 491 | 46 | tmp -= 255; | |
| 492 | } | ||
| 493 | 8558 | xu(8, last_payload_size_byte, tmp, 0, 254, 0); | |
| 494 | |||
| 495 | 8558 | err = FUNC(message)(ctx, rw, message); | |
| 496 | 8558 | ctx->trace_enable = trace; | |
| 497 | 8558 | if (err < 0) | |
| 498 | ✗ | return err; | |
| 499 | } | ||
| 500 | } | ||
| 501 | #endif | ||
| 502 | |||
| 503 | 10319 | return 0; | |
| 504 | } | ||
| 505 |