obudec.c (17162B)
1 /* 2 * Copyright (c) 2017, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include <stdio.h> 13 #include <stdlib.h> 14 #include <string.h> 15 #include <assert.h> 16 17 #include "common/obudec.h" 18 19 #include "aom_dsp/aom_dsp_common.h" 20 #include "aom_ports/mem_ops.h" 21 #include "av1/common/common.h" 22 #include "av1/common/obu_util.h" 23 #include "tools_common.h" 24 25 #define OBU_BUFFER_SIZE (500 * 1024) 26 27 #define OBU_HEADER_SIZE 1 28 #define OBU_EXTENSION_SIZE 1 29 #define OBU_MAX_LENGTH_FIELD_SIZE 8 30 31 #define OBU_MAX_HEADER_SIZE \ 32 (OBU_HEADER_SIZE + OBU_EXTENSION_SIZE + 2 * OBU_MAX_LENGTH_FIELD_SIZE) 33 34 #define OBU_DETECTION_SIZE \ 35 (OBU_HEADER_SIZE + OBU_EXTENSION_SIZE + 4 * OBU_MAX_LENGTH_FIELD_SIZE) 36 37 // Reads unsigned LEB128 integer and returns 0 upon successful read and decode. 38 // Stores raw bytes in 'value_buffer', length of the number in 'value_length', 39 // and decoded value in 'value'. If 'buffered' is true, it is buffered in the 40 // detect buffer first. 41 static int obudec_read_leb128(struct AvxInputContext *input_ctx, 42 uint8_t *value_buffer, size_t *value_length, 43 uint64_t *value, bool buffered) { 44 if (!input_ctx || !value_buffer || !value_length || !value) return -1; 45 size_t len; 46 for (len = 0; len < OBU_MAX_LENGTH_FIELD_SIZE; ++len) { 47 const size_t num_read = 48 buffer_input(input_ctx, 1, &value_buffer[len], buffered); 49 if (num_read == 0) { 50 if (len == 0 && input_eof(input_ctx)) { 51 *value_length = 0; 52 return 0; 53 } 54 // Ran out of data before completing read of value. 55 return -1; 56 } 57 if ((value_buffer[len] >> 7) == 0) { 58 ++len; 59 *value_length = len; 60 break; 61 } 62 } 63 64 return aom_uleb_decode(value_buffer, len, value, NULL); 65 } 66 67 // Reads OBU header from 'input_ctx'. The 'buffer_capacity' passed in must be 68 // large enough to store an OBU header with extension (2 bytes). Raw OBU data is 69 // written to 'obu_data', parsed OBU header values are written to 'obu_header', 70 // and total bytes read from file are written to 'bytes_read'. Returns 0 for 71 // success, and non-zero on failure. When end of file is reached, the return 72 // value is 0 and the 'bytes_read' value is set to 0. If 'buffered' is true, it 73 // is buffered in the detect buffer first. 74 static int obudec_read_obu_header(struct AvxInputContext *input_ctx, 75 size_t buffer_capacity, int is_annexb, 76 uint8_t *obu_data, ObuHeader *obu_header, 77 size_t *bytes_read, bool buffered) { 78 if (!input_ctx || buffer_capacity < (OBU_HEADER_SIZE + OBU_EXTENSION_SIZE) || 79 !obu_data || !obu_header || !bytes_read) { 80 return -1; 81 } 82 *bytes_read = buffer_input(input_ctx, 1, obu_data, buffered); 83 84 if (input_eof(input_ctx) && *bytes_read == 0) { 85 return 0; 86 } else if (*bytes_read != 1) { 87 fprintf(stderr, "obudec: Failure reading OBU header.\n"); 88 return -1; 89 } 90 91 const int has_extension = (obu_data[0] >> 2) & 0x1; 92 if (has_extension) { 93 if (buffer_input(input_ctx, 1, &obu_data[1], buffered) != 1) { 94 fprintf(stderr, "obudec: Failure reading OBU extension."); 95 return -1; 96 } 97 ++*bytes_read; 98 } 99 100 size_t obu_bytes_parsed = 0; 101 const aom_codec_err_t parse_result = aom_read_obu_header( 102 obu_data, *bytes_read, &obu_bytes_parsed, obu_header, is_annexb); 103 if (parse_result != AOM_CODEC_OK || *bytes_read != obu_bytes_parsed) { 104 fprintf(stderr, "obudec: Error parsing OBU header.\n"); 105 return -1; 106 } 107 108 return 0; 109 } 110 111 // Reads OBU payload from 'input_ctx' and returns 0 for success when all payload 112 // bytes are read from the file. Payload data is written to 'obu_data', and 113 // actual bytes read added to 'bytes_read'. If 'buffered' is true, it is 114 // buffered in the detect buffer first. 115 static int obudec_read_obu_payload(struct AvxInputContext *input_ctx, 116 size_t payload_length, uint8_t *obu_data, 117 size_t *bytes_read, bool buffered) { 118 if (!input_ctx || payload_length == 0 || !obu_data || !bytes_read) return -1; 119 120 if (buffer_input(input_ctx, payload_length, obu_data, buffered) != 121 payload_length) { 122 fprintf(stderr, "obudec: Failure reading OBU payload.\n"); 123 return -1; 124 } 125 126 *bytes_read += payload_length; 127 return 0; 128 } 129 130 static int obudec_read_obu_header_and_size( 131 struct AvxInputContext *input_ctx, size_t buffer_capacity, int is_annexb, 132 uint8_t *buffer, size_t *bytes_read, size_t *payload_length, 133 ObuHeader *obu_header, bool buffered) { 134 const size_t kMinimumBufferSize = OBU_MAX_HEADER_SIZE; 135 if (!input_ctx || !buffer || !bytes_read || !payload_length || !obu_header || 136 buffer_capacity < kMinimumBufferSize) { 137 return -1; 138 } 139 140 size_t leb128_length_obu = 0; 141 size_t leb128_length_payload = 0; 142 uint64_t obu_size = 0; 143 if (is_annexb) { 144 if (obudec_read_leb128(input_ctx, &buffer[0], &leb128_length_obu, &obu_size, 145 buffered) != 0) { 146 fprintf(stderr, "obudec: Failure reading OBU size length.\n"); 147 return -1; 148 } else if (leb128_length_obu == 0) { 149 *payload_length = 0; 150 return 0; 151 } 152 if (obu_size > UINT32_MAX) { 153 fprintf(stderr, "obudec: OBU payload length too large.\n"); 154 return -1; 155 } 156 } 157 158 size_t header_size = 0; 159 if (obudec_read_obu_header(input_ctx, buffer_capacity - leb128_length_obu, 160 is_annexb, buffer + leb128_length_obu, obu_header, 161 &header_size, buffered) != 0) { 162 return -1; 163 } else if (header_size == 0) { 164 *payload_length = 0; 165 return 0; 166 } 167 168 if (!obu_header->has_size_field) { 169 assert(is_annexb); 170 if (obu_size < header_size) { 171 fprintf(stderr, "obudec: OBU size is too small.\n"); 172 return -1; 173 } 174 *payload_length = (size_t)obu_size - header_size; 175 } else { 176 uint64_t u64_payload_length = 0; 177 if (obudec_read_leb128(input_ctx, &buffer[leb128_length_obu + header_size], 178 &leb128_length_payload, &u64_payload_length, 179 buffered) != 0) { 180 fprintf(stderr, "obudec: Failure reading OBU payload length.\n"); 181 return -1; 182 } 183 if (u64_payload_length > UINT32_MAX) { 184 fprintf(stderr, "obudec: OBU payload length too large.\n"); 185 return -1; 186 } 187 188 *payload_length = (size_t)u64_payload_length; 189 } 190 191 *bytes_read = leb128_length_obu + header_size + leb128_length_payload; 192 return 0; 193 } 194 195 static int obudec_grow_buffer(size_t growth_amount, uint8_t **obu_buffer, 196 size_t *obu_buffer_capacity) { 197 if (!*obu_buffer || !obu_buffer_capacity || growth_amount == 0) { 198 return -1; 199 } 200 201 const size_t capacity = *obu_buffer_capacity; 202 if (SIZE_MAX - growth_amount < capacity) { 203 fprintf(stderr, "obudec: cannot grow buffer, capacity will roll over.\n"); 204 return -1; 205 } 206 207 const size_t new_capacity = capacity + growth_amount; 208 209 #if defined AOM_MAX_ALLOCABLE_MEMORY 210 if (new_capacity > AOM_MAX_ALLOCABLE_MEMORY) { 211 fprintf(stderr, "obudec: OBU size exceeds max alloc size.\n"); 212 return -1; 213 } 214 #endif 215 216 uint8_t *new_buffer = (uint8_t *)realloc(*obu_buffer, new_capacity); 217 if (!new_buffer) { 218 fprintf(stderr, "obudec: Failed to allocate compressed data buffer.\n"); 219 return -1; 220 } 221 222 *obu_buffer = new_buffer; 223 *obu_buffer_capacity = new_capacity; 224 return 0; 225 } 226 227 static int obudec_read_one_obu(struct AvxInputContext *input_ctx, 228 uint8_t **obu_buffer, size_t obu_bytes_buffered, 229 size_t *obu_buffer_capacity, size_t *obu_length, 230 ObuHeader *obu_header, int is_annexb, 231 bool buffered) { 232 if (!input_ctx || !(*obu_buffer) || !obu_buffer_capacity || !obu_length || 233 !obu_header) { 234 return -1; 235 } 236 237 size_t bytes_read = 0; 238 size_t obu_payload_length = 0; 239 size_t available_buffer_capacity = *obu_buffer_capacity - obu_bytes_buffered; 240 241 if (available_buffer_capacity < OBU_MAX_HEADER_SIZE) { 242 if (obudec_grow_buffer(AOMMAX(*obu_buffer_capacity, OBU_MAX_HEADER_SIZE), 243 obu_buffer, obu_buffer_capacity) != 0) { 244 *obu_length = bytes_read; 245 return -1; 246 } 247 available_buffer_capacity += 248 AOMMAX(*obu_buffer_capacity, OBU_MAX_HEADER_SIZE); 249 } 250 251 const int status = obudec_read_obu_header_and_size( 252 input_ctx, available_buffer_capacity, is_annexb, 253 *obu_buffer + obu_bytes_buffered, &bytes_read, &obu_payload_length, 254 obu_header, buffered); 255 if (status < 0) return status; 256 257 if (obu_payload_length > SIZE_MAX - bytes_read) return -1; 258 259 if (obu_payload_length > 256 * 1024 * 1024) { 260 fprintf(stderr, "obudec: Read invalid OBU size (%u)\n", 261 (unsigned int)obu_payload_length); 262 *obu_length = bytes_read + obu_payload_length; 263 return -1; 264 } 265 266 if (bytes_read + obu_payload_length > available_buffer_capacity && 267 obudec_grow_buffer(AOMMAX(*obu_buffer_capacity, obu_payload_length), 268 obu_buffer, obu_buffer_capacity) != 0) { 269 *obu_length = bytes_read + obu_payload_length; 270 return -1; 271 } 272 273 if (obu_payload_length > 0 && 274 obudec_read_obu_payload(input_ctx, obu_payload_length, 275 *obu_buffer + obu_bytes_buffered + bytes_read, 276 &bytes_read, buffered) != 0) { 277 return -1; 278 } 279 280 *obu_length = bytes_read; 281 return 0; 282 } 283 284 int file_is_obu(struct ObuDecInputContext *obu_ctx) { 285 if (!obu_ctx || !obu_ctx->avx_ctx) return 0; 286 287 struct AvxInputContext *avx_ctx = obu_ctx->avx_ctx; 288 uint8_t detect_buf[OBU_DETECTION_SIZE] = { 0 }; 289 const int is_annexb = obu_ctx->is_annexb; 290 size_t payload_length = 0; 291 ObuHeader obu_header; 292 memset(&obu_header, 0, sizeof(obu_header)); 293 size_t length_of_unit_size = 0; 294 size_t annexb_header_length = 0; 295 uint64_t unit_size = 0; 296 297 if (is_annexb) { 298 // read the size of first temporal unit 299 if (obudec_read_leb128(avx_ctx, &detect_buf[0], &length_of_unit_size, 300 &unit_size, /*buffered=*/true) != 0) { 301 fprintf(stderr, "obudec: Failure reading temporal unit header\n"); 302 rewind_detect(avx_ctx); 303 return 0; 304 } 305 306 // read the size of first frame unit 307 if (obudec_read_leb128(avx_ctx, &detect_buf[length_of_unit_size], 308 &annexb_header_length, &unit_size, 309 /*buffered=*/true) != 0) { 310 fprintf(stderr, "obudec: Failure reading frame unit header\n"); 311 rewind_detect(avx_ctx); 312 return 0; 313 } 314 annexb_header_length += length_of_unit_size; 315 } 316 317 size_t bytes_read = 0; 318 if (obudec_read_obu_header_and_size( 319 avx_ctx, OBU_DETECTION_SIZE - annexb_header_length, is_annexb, 320 &detect_buf[annexb_header_length], &bytes_read, &payload_length, 321 &obu_header, /*buffered=*/true) != 0) { 322 fprintf(stderr, "obudec: Failure reading first OBU.\n"); 323 rewind_detect(avx_ctx); 324 return 0; 325 } 326 327 if (is_annexb) { 328 bytes_read += annexb_header_length; 329 } 330 331 if (obu_header.type != OBU_TEMPORAL_DELIMITER && 332 obu_header.type != OBU_SEQUENCE_HEADER) { 333 rewind_detect(avx_ctx); 334 return 0; 335 } 336 337 if (obu_header.has_size_field) { 338 if (obu_header.type == OBU_TEMPORAL_DELIMITER && payload_length != 0) { 339 fprintf( 340 stderr, 341 "obudec: Invalid OBU_TEMPORAL_DELIMITER payload length (non-zero)."); 342 rewind_detect(avx_ctx); 343 return 0; 344 } 345 } else if (!is_annexb) { 346 fprintf(stderr, "obudec: OBU size fields required, cannot decode input.\n"); 347 rewind_detect(avx_ctx); 348 return 0; 349 } 350 351 // Appears that input is valid Section 5 AV1 stream. 352 obu_ctx->buffer = (uint8_t *)malloc(OBU_BUFFER_SIZE); 353 if (!obu_ctx->buffer) { 354 fprintf(stderr, "Out of memory.\n"); 355 rewind_detect(avx_ctx); 356 return 0; 357 } 358 obu_ctx->buffer_capacity = OBU_BUFFER_SIZE; 359 360 memcpy(obu_ctx->buffer, &detect_buf[0], bytes_read); 361 obu_ctx->bytes_buffered = bytes_read; 362 // If the first OBU is a SEQUENCE_HEADER, then it will have a payload. 363 // We need to read this in so that our buffer only contains complete OBUs. 364 if (payload_length > 0) { 365 if (payload_length > (obu_ctx->buffer_capacity - bytes_read)) { 366 fprintf(stderr, "obudec: First OBU's payload is too large\n"); 367 rewind_detect(avx_ctx); 368 obudec_free(obu_ctx); 369 return 0; 370 } 371 372 size_t payload_bytes = 0; 373 const int status = obudec_read_obu_payload( 374 avx_ctx, payload_length, &obu_ctx->buffer[bytes_read], &payload_bytes, 375 /*buffered=*/false); 376 if (status < 0) { 377 rewind_detect(avx_ctx); 378 obudec_free(obu_ctx); 379 return 0; 380 } 381 obu_ctx->bytes_buffered += payload_bytes; 382 } 383 return 1; 384 } 385 386 int obudec_read_temporal_unit(struct ObuDecInputContext *obu_ctx, 387 uint8_t **buffer, size_t *bytes_read, 388 size_t *buffer_size) { 389 FILE *f = obu_ctx->avx_ctx->file; 390 if (!f) return -1; 391 392 *buffer_size = 0; 393 *bytes_read = 0; 394 395 if (input_eof(obu_ctx->avx_ctx)) { 396 return 1; 397 } 398 399 size_t tu_size; 400 size_t obu_size = 0; 401 size_t length_of_temporal_unit_size = 0; 402 uint8_t tuheader[OBU_MAX_LENGTH_FIELD_SIZE] = { 0 }; 403 404 if (obu_ctx->is_annexb) { 405 uint64_t size = 0; 406 407 if (obu_ctx->bytes_buffered == 0) { 408 if (obudec_read_leb128(obu_ctx->avx_ctx, &tuheader[0], 409 &length_of_temporal_unit_size, &size, 410 /*buffered=*/false) != 0) { 411 fprintf(stderr, "obudec: Failure reading temporal unit header\n"); 412 return -1; 413 } 414 if (size == 0 && input_eof(obu_ctx->avx_ctx)) { 415 return 1; 416 } 417 } else { 418 // temporal unit size was already stored in buffer 419 if (aom_uleb_decode(obu_ctx->buffer, obu_ctx->bytes_buffered, &size, 420 &length_of_temporal_unit_size) != 0) { 421 fprintf(stderr, "obudec: Failure reading temporal unit header\n"); 422 return -1; 423 } 424 } 425 426 if (size > UINT32_MAX || size + length_of_temporal_unit_size > UINT32_MAX) { 427 fprintf(stderr, "obudec: TU too large.\n"); 428 return -1; 429 } 430 431 size += length_of_temporal_unit_size; 432 tu_size = (size_t)size; 433 } else { 434 while (1) { 435 ObuHeader obu_header; 436 memset(&obu_header, 0, sizeof(obu_header)); 437 438 if (obudec_read_one_obu(obu_ctx->avx_ctx, &obu_ctx->buffer, 439 obu_ctx->bytes_buffered, 440 &obu_ctx->buffer_capacity, &obu_size, &obu_header, 441 0, /*buffered=*/false) != 0) { 442 fprintf(stderr, "obudec: read_one_obu failed in TU loop\n"); 443 return -1; 444 } 445 446 if (obu_header.type == OBU_TEMPORAL_DELIMITER || obu_size == 0) { 447 tu_size = obu_ctx->bytes_buffered; 448 break; 449 } else { 450 obu_ctx->bytes_buffered += obu_size; 451 } 452 } 453 } 454 455 #if defined AOM_MAX_ALLOCABLE_MEMORY 456 if (tu_size > AOM_MAX_ALLOCABLE_MEMORY) { 457 fprintf(stderr, "obudec: Temporal Unit size exceeds max alloc size.\n"); 458 return -1; 459 } 460 #endif 461 if (tu_size > 0) { 462 uint8_t *new_buffer = (uint8_t *)realloc(*buffer, tu_size); 463 if (!new_buffer) { 464 free(*buffer); 465 fprintf(stderr, "obudec: Out of memory.\n"); 466 return -1; 467 } 468 *buffer = new_buffer; 469 } 470 *bytes_read = tu_size; 471 *buffer_size = tu_size; 472 473 if (!obu_ctx->is_annexb) { 474 memcpy(*buffer, obu_ctx->buffer, tu_size); 475 476 // At this point, (obu_ctx->buffer + obu_ctx->bytes_buffered + obu_size) 477 // points to the end of the buffer. 478 memmove(obu_ctx->buffer, obu_ctx->buffer + obu_ctx->bytes_buffered, 479 obu_size); 480 obu_ctx->bytes_buffered = obu_size; 481 } else { 482 if (!input_eof(obu_ctx->avx_ctx)) { 483 size_t data_size; 484 size_t offset; 485 if (!obu_ctx->bytes_buffered) { 486 data_size = tu_size - length_of_temporal_unit_size; 487 memcpy(*buffer, &tuheader[0], length_of_temporal_unit_size); 488 offset = length_of_temporal_unit_size; 489 } else { 490 const size_t copy_size = AOMMIN(obu_ctx->bytes_buffered, tu_size); 491 memcpy(*buffer, obu_ctx->buffer, copy_size); 492 offset = copy_size; 493 data_size = tu_size - copy_size; 494 obu_ctx->bytes_buffered -= copy_size; 495 } 496 497 if (read_from_input(obu_ctx->avx_ctx, data_size, *buffer + offset) != 498 data_size) { 499 fprintf(stderr, "obudec: Failed to read full temporal unit\n"); 500 return -1; 501 } 502 } 503 } 504 return 0; 505 } 506 507 void obudec_free(struct ObuDecInputContext *obu_ctx) { 508 free(obu_ctx->buffer); 509 obu_ctx->buffer = NULL; 510 obu_ctx->buffer_capacity = 0; 511 obu_ctx->bytes_buffered = 0; 512 }