tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }