1/* 2 * AV1 common parsing code 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#ifndef AVCODEC_AV1_PARSE_H 22#define AVCODEC_AV1_PARSE_H 23 24#include <limits.h> 25#include <stdint.h> 26 27#include "libavutil/error.h" 28#include "libavutil/intmath.h" 29#include "libavutil/macros.h" 30 31#include "av1.h" 32#include "get_bits.h" 33 34// OBU header fields + max leb128 length 35#define MAX_OBU_HEADER_SIZE (2 + 8) 36 37typedef struct AV1OBU { 38 /** Size of payload */ 39 int size; 40 const uint8_t *data; 41 42 /** 43 * Size, in bits, of just the data, excluding the trailing_one_bit and 44 * any trailing padding. 45 */ 46 int size_bits; 47 48 /** Size of entire OBU, including header */ 49 int raw_size; 50 const uint8_t *raw_data; 51 52 /** GetBitContext initialized to the start of the payload */ 53 GetBitContext gb; 54 55 int type; 56 57 int temporal_id; 58 int spatial_id; 59} AV1OBU; 60 61/** An input packet split into OBUs */ 62typedef struct AV1Packet { 63 AV1OBU *obus; 64 int nb_obus; 65 int obus_allocated; 66 unsigned obus_allocated_size; 67} AV1Packet; 68 69/** 70 * Extract an OBU from a raw bitstream. 71 * 72 * @note This function does not copy or store any bitstream data. All 73 * the pointers in the AV1OBU structure will be valid as long 74 * as the input buffer also is. 75 */ 76int ff_av1_extract_obu(AV1OBU *obu, const uint8_t *buf, int length, 77 void *logctx); 78 79/** 80 * Split an input packet into OBUs. 81 * 82 * @note This function does not copy or store any bitstream data. All 83 * the pointers in the AV1Packet structure will be valid as 84 * long as the input buffer also is. 85 */ 86int ff_av1_packet_split(AV1Packet *pkt, const uint8_t *buf, int length, 87 void *logctx); 88 89/** 90 * Free all the allocated memory in the packet. 91 */ 92void ff_av1_packet_uninit(AV1Packet *pkt); 93 94static inline int64_t leb128(GetBitContext *gb) { 95 int64_t ret = 0; 96 int i; 97 98 for (i = 0; i < 8; i++) { 99 int byte = get_bits(gb, 8); 100 ret |= (int64_t)(byte & 0x7f) << (i * 7); 101 if (!(byte & 0x80)) 102 break; 103 } 104 return ret; 105} 106 107static inline int parse_obu_header(const uint8_t *buf, int buf_size, 108 int64_t *obu_size, int *start_pos, int *type, 109 int *temporal_id, int *spatial_id) 110{ 111 GetBitContext gb; 112 int ret, extension_flag, has_size_flag; 113 int64_t size; 114 115 ret = init_get_bits8(&gb, buf, FFMIN(buf_size, MAX_OBU_HEADER_SIZE)); 116 if (ret < 0) 117 return ret; 118 119 if (get_bits1(&gb) != 0) // obu_forbidden_bit 120 return AVERROR_INVALIDDATA; 121 122 *type = get_bits(&gb, 4); 123 extension_flag = get_bits1(&gb); 124 has_size_flag = get_bits1(&gb); 125 skip_bits1(&gb); // obu_reserved_1bit 126 127 if (extension_flag) { 128 *temporal_id = get_bits(&gb, 3); 129 *spatial_id = get_bits(&gb, 2); 130 skip_bits(&gb, 3); // extension_header_reserved_3bits 131 } else { 132 *temporal_id = *spatial_id = 0; 133 } 134 135 *obu_size = has_size_flag ? leb128(&gb) 136 : buf_size - 1 - extension_flag; 137 138 if (get_bits_left(&gb) < 0) 139 return AVERROR_INVALIDDATA; 140 141 *start_pos = get_bits_count(&gb) / 8; 142 143 size = *obu_size + *start_pos; 144 145 if (size > buf_size) 146 return AVERROR_INVALIDDATA; 147 148 return size; 149} 150 151static inline int get_obu_bit_length(const uint8_t *buf, int size, int type) 152{ 153 int v; 154 155 /* There are no trailing bits on these */ 156 if (type == AV1_OBU_TILE_GROUP || 157 type == AV1_OBU_TILE_LIST || 158 type == AV1_OBU_FRAME) { 159 if (size > INT_MAX / 8) 160 return AVERROR(ERANGE); 161 else 162 return size * 8; 163 } 164 165 while (size > 0 && buf[size - 1] == 0) 166 size--; 167 168 if (!size) 169 return 0; 170 171 v = buf[size - 1]; 172 173 if (size > INT_MAX / 8) 174 return AVERROR(ERANGE); 175 size *= 8; 176 177 /* Remove the trailing_one_bit and following trailing zeros */ 178 if (v) 179 size -= ff_ctz(v) + 1; 180 181 return size; 182} 183 184#endif /* AVCODEC_AV1_PARSE_H */ 185