1 /*
2 * AV1 Annex B demuxer
3 * Copyright (c) 2019 James Almer <jamrial@gmail.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include "config.h"
23 #include "config_components.h"
24
25 #include "libavutil/common.h"
26 #include "libavutil/opt.h"
27 #include "libavcodec/av1_parse.h"
28 #include "libavcodec/bsf.h"
29 #include "avformat.h"
30 #include "avio_internal.h"
31 #include "internal.h"
32
33 typedef struct AV1DemuxContext {
34 const AVClass *class;
35 AVBSFContext *bsf;
36 AVRational framerate;
37 uint32_t temporal_unit_size;
38 uint32_t frame_unit_size;
39 } AV1DemuxContext;
40
41 //return < 0 if we need more data
get_score(int type,int * seq)42 static int get_score(int type, int *seq)
43 {
44 switch (type) {
45 case AV1_OBU_SEQUENCE_HEADER:
46 *seq = 1;
47 return -1;
48 case AV1_OBU_FRAME:
49 case AV1_OBU_FRAME_HEADER:
50 return *seq ? AVPROBE_SCORE_EXTENSION + 1 : 0;
51 case AV1_OBU_METADATA:
52 case AV1_OBU_PADDING:
53 return -1;
54 default:
55 break;
56 }
57 return 0;
58 }
59
av1_read_header(AVFormatContext * s)60 static int av1_read_header(AVFormatContext *s)
61 {
62 AV1DemuxContext *const c = s->priv_data;
63 const AVBitStreamFilter *filter = av_bsf_get_by_name("av1_frame_merge");
64 AVStream *st;
65 FFStream *sti;
66 int ret;
67
68 if (!filter) {
69 av_log(s, AV_LOG_ERROR, "av1_frame_merge bitstream filter "
70 "not found. This is a bug, please report it.\n");
71 return AVERROR_BUG;
72 }
73
74 st = avformat_new_stream(s, NULL);
75 if (!st)
76 return AVERROR(ENOMEM);
77 sti = ffstream(st);
78
79 st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
80 st->codecpar->codec_id = AV_CODEC_ID_AV1;
81 sti->need_parsing = AVSTREAM_PARSE_HEADERS;
82
83 sti->avctx->framerate = c->framerate;
84 // taken from rawvideo demuxers
85 avpriv_set_pts_info(st, 64, 1, 1200000);
86
87 ret = av_bsf_alloc(filter, &c->bsf);
88 if (ret < 0)
89 return ret;
90
91 ret = avcodec_parameters_copy(c->bsf->par_in, st->codecpar);
92 if (ret < 0)
93 return ret;
94
95 ret = av_bsf_init(c->bsf);
96 if (ret < 0)
97 return ret;
98
99 return 0;
100 }
101
av1_read_close(AVFormatContext * s)102 static int av1_read_close(AVFormatContext *s)
103 {
104 AV1DemuxContext *const c = s->priv_data;
105
106 av_bsf_free(&c->bsf);
107 return 0;
108 }
109
110 #define DEC AV_OPT_FLAG_DECODING_PARAM
111 #define OFFSET(x) offsetof(AV1DemuxContext, x)
112 static const AVOption av1_options[] = {
113 { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC},
114 { NULL },
115 };
116 #undef OFFSET
117
118 static const AVClass av1_demuxer_class = {
119 .class_name = "AV1 Annex B/low overhead OBU demuxer",
120 .item_name = av_default_item_name,
121 .option = av1_options,
122 .version = LIBAVUTIL_VERSION_INT,
123 };
124
125 #if CONFIG_AV1_DEMUXER
126
leb(AVIOContext * pb,uint32_t * len)127 static int leb(AVIOContext *pb, uint32_t *len) {
128 int more, i = 0;
129 uint8_t byte;
130 *len = 0;
131 do {
132 unsigned bits;
133 byte = avio_r8(pb);
134 more = byte & 0x80;
135 bits = byte & 0x7f;
136 if (i <= 3 || (i == 4 && bits < (1 << 4)))
137 *len |= bits << (i * 7);
138 else if (bits)
139 return AVERROR_INVALIDDATA;
140 if (++i == 8 && more)
141 return AVERROR_INVALIDDATA;
142 if (pb->eof_reached || pb->error)
143 return pb->error ? pb->error : AVERROR(EIO);
144 } while (more);
145 return i;
146 }
147
read_obu(const uint8_t * buf,int size,int64_t * obu_size,int * type)148 static int read_obu(const uint8_t *buf, int size, int64_t *obu_size, int *type)
149 {
150 int start_pos, temporal_id, spatial_id;
151 int len;
152
153 len = parse_obu_header(buf, size, obu_size, &start_pos,
154 type, &temporal_id, &spatial_id);
155 if (len < 0)
156 return len;
157
158 return 0;
159 }
160
annexb_probe(const AVProbeData * p)161 static int annexb_probe(const AVProbeData *p)
162 {
163 FFIOContext ctx;
164 AVIOContext *const pb = &ctx.pub;
165 int64_t obu_size;
166 uint32_t temporal_unit_size, frame_unit_size, obu_unit_size;
167 int seq = 0;
168 int ret, type, cnt = 0;
169
170 ffio_init_context(&ctx, p->buf, p->buf_size, 0,
171 NULL, NULL, NULL, NULL);
172
173 ret = leb(pb, &temporal_unit_size);
174 if (ret < 0)
175 return 0;
176 cnt += ret;
177 ret = leb(pb, &frame_unit_size);
178 if (ret < 0 || ((int64_t)frame_unit_size + ret) > temporal_unit_size)
179 return 0;
180 cnt += ret;
181 ret = leb(pb, &obu_unit_size);
182 if (ret < 0 || ((int64_t)obu_unit_size + ret) >= frame_unit_size)
183 return 0;
184 cnt += ret;
185
186 frame_unit_size -= obu_unit_size + ret;
187
188 avio_skip(pb, obu_unit_size);
189 if (pb->eof_reached || pb->error)
190 return 0;
191
192 // Check that the first OBU is a Temporal Delimiter.
193 ret = read_obu(p->buf + cnt, FFMIN(p->buf_size - cnt, obu_unit_size), &obu_size, &type);
194 if (ret < 0 || type != AV1_OBU_TEMPORAL_DELIMITER || obu_size > 0)
195 return 0;
196 cnt += obu_unit_size;
197
198 do {
199 ret = leb(pb, &obu_unit_size);
200 if (ret < 0 || ((int64_t)obu_unit_size + ret) > frame_unit_size)
201 return 0;
202 cnt += ret;
203
204 avio_skip(pb, obu_unit_size);
205 if (pb->eof_reached || pb->error)
206 return 0;
207
208 ret = read_obu(p->buf + cnt, FFMIN(p->buf_size - cnt, obu_unit_size), &obu_size, &type);
209 if (ret < 0)
210 return 0;
211 cnt += obu_unit_size;
212
213 ret = get_score(type, &seq);
214 if (ret >= 0)
215 return ret;
216
217 frame_unit_size -= obu_unit_size + ret;
218 } while (frame_unit_size);
219
220 return 0;
221 }
222
annexb_read_packet(AVFormatContext * s,AVPacket * pkt)223 static int annexb_read_packet(AVFormatContext *s, AVPacket *pkt)
224 {
225 AV1DemuxContext *const c = s->priv_data;
226 uint32_t obu_unit_size;
227 int ret, len;
228
229 retry:
230 if (avio_feof(s->pb)) {
231 if (c->temporal_unit_size || c->frame_unit_size)
232 return AVERROR(EIO);
233 goto end;
234 }
235
236 if (!c->temporal_unit_size) {
237 len = leb(s->pb, &c->temporal_unit_size);
238 if (len < 0) return AVERROR_INVALIDDATA;
239 }
240
241 if (!c->frame_unit_size) {
242 len = leb(s->pb, &c->frame_unit_size);
243 if (len < 0 || ((int64_t)c->frame_unit_size + len) > c->temporal_unit_size)
244 return AVERROR_INVALIDDATA;
245 c->temporal_unit_size -= len;
246 }
247
248 len = leb(s->pb, &obu_unit_size);
249 if (len < 0 || ((int64_t)obu_unit_size + len) > c->frame_unit_size)
250 return AVERROR_INVALIDDATA;
251
252 ret = av_get_packet(s->pb, pkt, obu_unit_size);
253 if (ret < 0)
254 return ret;
255 if (ret != obu_unit_size)
256 return AVERROR(EIO);
257
258 c->temporal_unit_size -= obu_unit_size + len;
259 c->frame_unit_size -= obu_unit_size + len;
260
261 end:
262 ret = av_bsf_send_packet(c->bsf, pkt);
263 if (ret < 0) {
264 av_log(s, AV_LOG_ERROR, "Failed to send packet to "
265 "av1_frame_merge filter\n");
266 return ret;
267 }
268
269 ret = av_bsf_receive_packet(c->bsf, pkt);
270 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
271 av_log(s, AV_LOG_ERROR, "av1_frame_merge filter failed to "
272 "send output packet\n");
273
274 if (ret == AVERROR(EAGAIN))
275 goto retry;
276
277 return ret;
278 }
279
280 const AVInputFormat ff_av1_demuxer = {
281 .name = "av1",
282 .long_name = NULL_IF_CONFIG_SMALL("AV1 Annex B"),
283 .priv_data_size = sizeof(AV1DemuxContext),
284 .flags_internal = FF_FMT_INIT_CLEANUP,
285 .read_probe = annexb_probe,
286 .read_header = av1_read_header,
287 .read_packet = annexb_read_packet,
288 .read_close = av1_read_close,
289 .extensions = "obu",
290 .flags = AVFMT_GENERIC_INDEX,
291 .priv_class = &av1_demuxer_class,
292 };
293 #endif
294
295 #if CONFIG_OBU_DEMUXER
296 //For low overhead obu, we can't foresee the obu size before we parsed the header.
297 //So, we can't use parse_obu_header here, since it will check size <= buf_size
298 //see c27c7b49dc for more details
read_obu_with_size(const uint8_t * buf,int buf_size,int64_t * obu_size,int * type)299 static int read_obu_with_size(const uint8_t *buf, int buf_size, int64_t *obu_size, int *type)
300 {
301 GetBitContext gb;
302 int ret, extension_flag, start_pos;
303 int64_t size;
304
305 ret = init_get_bits8(&gb, buf, FFMIN(buf_size, MAX_OBU_HEADER_SIZE));
306 if (ret < 0)
307 return ret;
308
309 if (get_bits1(&gb) != 0) // obu_forbidden_bit
310 return AVERROR_INVALIDDATA;
311
312 *type = get_bits(&gb, 4);
313 extension_flag = get_bits1(&gb);
314 if (!get_bits1(&gb)) // has_size_flag
315 return AVERROR_INVALIDDATA;
316 skip_bits1(&gb); // obu_reserved_1bit
317
318 if (extension_flag) {
319 get_bits(&gb, 3); // temporal_id
320 get_bits(&gb, 2); // spatial_id
321 skip_bits(&gb, 3); // extension_header_reserved_3bits
322 }
323
324 *obu_size = leb128(&gb);
325 if (*obu_size > INT_MAX)
326 return AVERROR_INVALIDDATA;
327
328 if (get_bits_left(&gb) < 0)
329 return AVERROR_INVALIDDATA;
330
331 start_pos = get_bits_count(&gb) / 8;
332
333 size = *obu_size + start_pos;
334 if (size > INT_MAX)
335 return AVERROR_INVALIDDATA;
336 return size;
337 }
338
obu_probe(const AVProbeData * p)339 static int obu_probe(const AVProbeData *p)
340 {
341 int64_t obu_size;
342 int seq = 0;
343 int ret, type, cnt;
344
345 // Check that the first OBU is a Temporal Delimiter.
346 cnt = read_obu_with_size(p->buf, p->buf_size, &obu_size, &type);
347 if (cnt < 0 || type != AV1_OBU_TEMPORAL_DELIMITER || obu_size != 0)
348 return 0;
349
350 while (1) {
351 ret = read_obu_with_size(p->buf + cnt, p->buf_size - cnt, &obu_size, &type);
352 if (ret < 0 || obu_size <= 0)
353 return 0;
354 cnt += FFMIN(ret, p->buf_size - cnt);
355
356 ret = get_score(type, &seq);
357 if (ret >= 0)
358 return ret;
359 }
360 return 0;
361 }
362
obu_get_packet(AVFormatContext * s,AVPacket * pkt)363 static int obu_get_packet(AVFormatContext *s, AVPacket *pkt)
364 {
365 AV1DemuxContext *const c = s->priv_data;
366 uint8_t header[MAX_OBU_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
367 int64_t obu_size;
368 int size;
369 int ret, len, type;
370
371 if ((ret = ffio_ensure_seekback(s->pb, MAX_OBU_HEADER_SIZE)) < 0)
372 return ret;
373 size = avio_read(s->pb, header, MAX_OBU_HEADER_SIZE);
374 if (size < 0)
375 return size;
376
377 len = read_obu_with_size(header, size, &obu_size, &type);
378 if (len < 0) {
379 av_log(c, AV_LOG_ERROR, "Failed to read obu\n");
380 return len;
381 }
382 avio_seek(s->pb, -size, SEEK_CUR);
383
384 ret = av_get_packet(s->pb, pkt, len);
385 if (ret != len) {
386 av_log(c, AV_LOG_ERROR, "Failed to get packet for obu\n");
387 return ret < 0 ? ret : AVERROR_INVALIDDATA;
388 }
389 return 0;
390 }
391
obu_read_packet(AVFormatContext * s,AVPacket * pkt)392 static int obu_read_packet(AVFormatContext *s, AVPacket *pkt)
393 {
394 AV1DemuxContext *const c = s->priv_data;
395 int ret;
396
397 if (s->io_repositioned) {
398 av_bsf_flush(c->bsf);
399 s->io_repositioned = 0;
400 }
401 while (1) {
402 ret = obu_get_packet(s, pkt);
403 /* In case of AVERROR_EOF we need to flush the BSF. Conveniently
404 * obu_get_packet() returns a blank pkt in this case which
405 * can be used to signal that the BSF should be flushed. */
406 if (ret < 0 && ret != AVERROR_EOF)
407 return ret;
408 ret = av_bsf_send_packet(c->bsf, pkt);
409 if (ret < 0) {
410 av_log(s, AV_LOG_ERROR, "Failed to send packet to "
411 "av1_frame_merge filter\n");
412 return ret;
413 }
414 ret = av_bsf_receive_packet(c->bsf, pkt);
415 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
416 av_log(s, AV_LOG_ERROR, "av1_frame_merge filter failed to "
417 "send output packet\n");
418 if (ret != AVERROR(EAGAIN))
419 break;
420 }
421
422 return ret;
423 }
424
425 const AVInputFormat ff_obu_demuxer = {
426 .name = "obu",
427 .long_name = NULL_IF_CONFIG_SMALL("AV1 low overhead OBU"),
428 .priv_data_size = sizeof(AV1DemuxContext),
429 .flags_internal = FF_FMT_INIT_CLEANUP,
430 .read_probe = obu_probe,
431 .read_header = av1_read_header,
432 .read_packet = obu_read_packet,
433 .read_close = av1_read_close,
434 .extensions = "obu",
435 .flags = AVFMT_GENERIC_INDEX | AVFMT_NO_BYTE_SEEK,
436 .priv_class = &av1_demuxer_class,
437 };
438 #endif
439