FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
av1_parse.c
Go to the documentation of this file.
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 #include "config.h"
22 
23 #include "libavutil/mem.h"
24 
25 #include "av1.h"
26 #include "av1_parse.h"
27 #include "bytestream.h"
28 
29 int ff_av1_extract_obu(AV1OBU *obu, const uint8_t *buf, int length, void *logctx)
30 {
31  int64_t obu_size;
32  int start_pos, type, temporal_id, spatial_id;
33  int len;
34 
35  len = parse_obu_header(buf, length, &obu_size, &start_pos,
36  &type, &temporal_id, &spatial_id);
37  if (len < 0)
38  return len;
39 
40  obu->type = type;
41  obu->temporal_id = temporal_id;
42  obu->spatial_id = spatial_id;
43 
44  obu->data = buf + start_pos;
45  obu->size = obu_size;
46  obu->raw_data = buf;
47  obu->raw_size = len;
48 
49  av_log(logctx, AV_LOG_DEBUG,
50  "obu_type: %d, temporal_id: %d, spatial_id: %d, payload size: %d\n",
51  obu->type, obu->temporal_id, obu->spatial_id, obu->size);
52 
53  return len;
54 }
55 
56 int ff_av1_packet_split(AV1Packet *pkt, const uint8_t *buf, int length, void *logctx)
57 {
58  GetByteContext bc;
59  int ret, consumed;
60 
61  bytestream2_init(&bc, buf, length);
62  pkt->nb_obus = 0;
63 
64  while (bytestream2_get_bytes_left(&bc) > 0) {
65  AV1OBU *obu;
66 
67  if (pkt->obus_allocated < pkt->nb_obus + 1) {
68  int new_size = pkt->obus_allocated + 1;
69  AV1OBU *tmp = av_realloc_array(pkt->obus, new_size, sizeof(*tmp));
70  if (!tmp)
71  return AVERROR(ENOMEM);
72 
73  pkt->obus = tmp;
74  memset(pkt->obus + pkt->obus_allocated, 0,
75  (new_size - pkt->obus_allocated) * sizeof(*tmp));
76  pkt->obus_allocated = new_size;
77  }
78  obu = &pkt->obus[pkt->nb_obus];
79 
80  consumed = ff_av1_extract_obu(obu, bc.buffer, bytestream2_get_bytes_left(&bc), logctx);
81  if (consumed < 0)
82  return consumed;
83 
84  bytestream2_skip(&bc, consumed);
85 
86  obu->size_bits = get_obu_bit_length(obu->data, obu->size, obu->type);
87 
88  if (obu->size_bits < 0 || (!obu->size_bits && obu->type != AV1_OBU_TEMPORAL_DELIMITER)) {
89  av_log(logctx, AV_LOG_ERROR, "Invalid OBU of type %d, skipping.\n", obu->type);
90  continue;
91  }
92 
93  pkt->nb_obus++;
94 
95  ret = init_get_bits(&obu->gb, obu->data, obu->size_bits);
96  if (ret < 0)
97  return ret;
98  }
99 
100  return 0;
101 }
102 
104 {
105  av_freep(&pkt->obus);
106  pkt->obus_allocated = 0;
107 }
Memory handling functions.
const uint8_t * raw_data
Definition: av1_parse.h:43
int spatial_id
Definition: av1_parse.h:51
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:133
int ff_av1_extract_obu(AV1OBU *obu, const uint8_t *buf, int length, void *logctx)
Extract an OBU from a raw bitstream.
Definition: av1_parse.c:29
static AVPacket pkt
const uint8_t * data
Definition: av1_parse.h:33
uint8_t
int size
Size of payload.
Definition: av1_parse.h:32
const uint8_t * buffer
Definition: bytestream.h:34
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:198
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define AVERROR(e)
Definition: error.h:43
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:164
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:154
GetBitContext gb
GetBitContext initialized to the start of the payload.
Definition: av1_parse.h:46
GLsizei GLsizei * length
Definition: opengl_enc.c:115
int temporal_id
Definition: av1_parse.h:50
static int parse_obu_header(const uint8_t *buf, int buf_size, int64_t *obu_size, int *start_pos, int *type, int *temporal_id, int *spatial_id)
Definition: av1_parse.h:99
int nb_obus
Definition: av1_parse.h:57
AV1OBU * obus
Definition: av1_parse.h:56
int ff_av1_packet_split(AV1Packet *pkt, const uint8_t *buf, int length, void *logctx)
Split an input packet into OBUs.
Definition: av1_parse.c:56
void * buf
Definition: avisynth_c.h:690
AV1 common definitions.
GLint GLenum type
Definition: opengl_enc.c:105
int type
Definition: av1_parse.h:48
void ff_av1_packet_uninit(AV1Packet *pkt)
Free all the allocated memory in the packet.
Definition: av1_parse.c:103
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:615
int obus_allocated
Definition: av1_parse.h:58
int size_bits
Size, in bits, of just the data, excluding the trailing_one_bit and any trailing padding.
Definition: av1_parse.h:39
An input packet split into OBUs.
Definition: av1_parse.h:55
int raw_size
Size of entire OBU, including header.
Definition: av1_parse.h:42
static int get_obu_bit_length(const uint8_t *buf, int size, int type)
Definition: av1_parse.h:143
int len
#define av_freep(p)
static uint8_t tmp[11]
Definition: aes_ctr.c:26