FFmpeg
Loading...
Searching...
No Matches
libdav1d.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Ronald S. Bultje <rsbultje gmail com>
3 * Copyright (c) 2018 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 <dav1d/dav1d.h>
23
24#include "libavutil/avassert.h"
25#include "libavutil/cpu.h"
29#include "libavutil/imgutils.h"
30#include "libavutil/opt.h"
31
32#include "atsc_a53.h"
33#include "av1_parse.h"
34#include "avcodec.h"
35#include "bytestream.h"
36#include "codec_internal.h"
37#include "decode.h"
38#include "dovi_rpu.h"
39#include "internal.h"
40#include "itut35.h"
41
42#define FF_DAV1D_VERSION_AT_LEAST(x,y) \
43 (DAV1D_API_VERSION_MAJOR > (x) || DAV1D_API_VERSION_MAJOR == (x) && DAV1D_API_VERSION_MINOR >= (y))
44
58
59static const enum AVPixelFormat pix_fmt[][3] = {
60 [DAV1D_PIXEL_LAYOUT_I400] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12 },
61 [DAV1D_PIXEL_LAYOUT_I420] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12 },
62 [DAV1D_PIXEL_LAYOUT_I422] = { AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12 },
63 [DAV1D_PIXEL_LAYOUT_I444] = { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12 },
64};
65
69
70static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl)
71{
72 AVCodecContext *c = opaque;
73
74 av_vlog(c, AV_LOG_ERROR, fmt, vl);
75}
76
77static int libdav1d_picture_allocator(Dav1dPicture *p, void *cookie)
78{
79 Libdav1dContext *dav1d = cookie;
80 enum AVPixelFormat format = pix_fmt[p->p.layout][p->seq_hdr->hbd];
81 int ret, linesize[4], h = FFALIGN(p->p.h, 128), w = FFALIGN(p->p.w, 128);
82 uint8_t *aligned_ptr, *data[4];
83 AVBufferRef *buf;
84
85 ret = av_image_get_buffer_size(format, w, h, DAV1D_PICTURE_ALIGNMENT);
86 if (ret < 0)
87 return ret;
88
89 if (ret != dav1d->pool_size) {
91 // Use twice the amount of required padding bytes for aligned_ptr below.
92 dav1d->pool = av_buffer_pool_init(ret + DAV1D_PICTURE_ALIGNMENT * 2, NULL);
93 if (!dav1d->pool) {
94 dav1d->pool_size = 0;
95 return AVERROR(ENOMEM);
96 }
97 dav1d->pool_size = ret;
98 }
99 buf = av_buffer_pool_get(dav1d->pool);
100 if (!buf)
101 return AVERROR(ENOMEM);
102
103 // libdav1d requires DAV1D_PICTURE_ALIGNMENT aligned buffers, which av_malloc()
104 // doesn't guarantee for example when AVX is disabled at configure time.
105 // Use the extra DAV1D_PICTURE_ALIGNMENT padding bytes in the buffer to align it
106 // if required.
107 aligned_ptr = (uint8_t *)FFALIGN((uintptr_t)buf->data, DAV1D_PICTURE_ALIGNMENT);
108 ret = av_image_fill_arrays(data, linesize, aligned_ptr, format, w, h,
109 DAV1D_PICTURE_ALIGNMENT);
110 if (ret < 0) {
111 av_buffer_unref(&buf);
112 return ret;
113 }
114
115 p->data[0] = data[0];
116 p->data[1] = data[1];
117 p->data[2] = data[2];
118 p->stride[0] = linesize[0];
119 p->stride[1] = linesize[1];
120 p->allocator_data = buf;
121
122 return 0;
123}
124
125static void libdav1d_picture_release(Dav1dPicture *p, void *cookie)
126{
127 AVBufferRef *buf = p->allocator_data;
128
129 av_buffer_unref(&buf);
130}
131
132static void libdav1d_init_params(AVCodecContext *c, const Dav1dSequenceHeader *seq)
133{
134 c->profile = seq->profile;
135 c->level = ((seq->operating_points[0].major_level - 2) << 2)
136 | seq->operating_points[0].minor_level;
137
138 switch (seq->chr) {
139 case DAV1D_CHR_VERTICAL:
140 c->chroma_sample_location = AVCHROMA_LOC_LEFT;
141 break;
142 case DAV1D_CHR_COLOCATED:
143 c->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
144 break;
145 }
146 if (seq->color_description_present) {
147 c->colorspace = (enum AVColorSpace) seq->mtrx;
148 c->color_primaries = (enum AVColorPrimaries) seq->pri;
149 c->color_trc = (enum AVColorTransferCharacteristic) seq->trc;
150 }
151 c->color_range = seq->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
152
153 if (seq->layout == DAV1D_PIXEL_LAYOUT_I444 && c->colorspace == AVCOL_SPC_RGB)
154 c->pix_fmt = pix_fmt_rgb[seq->hbd];
155 else
156 c->pix_fmt = pix_fmt[seq->layout][seq->hbd];
157
158 c->framerate = ff_av1_framerate(seq->num_ticks_per_picture,
159 (unsigned)seq->num_units_in_tick,
160 (unsigned)seq->time_scale);
161}
162
164{
165 Dav1dSequenceHeader seq;
166 size_t offset = 0;
167 int res;
168
169 if (!c->extradata || c->extradata_size <= 0)
170 return 0;
171
172 if (c->extradata[0] & 0x80) {
173 int version = c->extradata[0] & 0x7F;
174
175 if (version != 1 || c->extradata_size < 4) {
176 int explode = !!(c->err_recognition & AV_EF_EXPLODE);
177 av_log(c, explode ? AV_LOG_ERROR : AV_LOG_WARNING,
178 "Error decoding extradata\n");
179 return explode ? AVERROR_INVALIDDATA : 0;
180 }
181
182 // Do nothing if there are no configOBUs to parse
183 if (c->extradata_size == 4)
184 return 0;
185
186 offset = 4;
187 }
188
189 res = dav1d_parse_sequence_header(&seq, c->extradata + offset,
190 c->extradata_size - offset);
191 if (res < 0)
192 return 0; // Assume no seqhdr OBUs are present
193
194 libdav1d_init_params(c, &seq);
195 res = ff_set_dimensions(c, seq.max_width, seq.max_height);
196 if (res < 0)
197 return res;
198
199 return 0;
200}
201
203{
204 Libdav1dContext *dav1d = c->priv_data;
205 Dav1dSettings s;
206 int threads = c->thread_count;
207 const AVPacketSideData *sd;
208 int res;
209
210 av_log(c, AV_LOG_VERBOSE, "libdav1d %s\n", dav1d_version());
211
212 dav1d_default_settings(&s);
213 s.logger.cookie = c;
214 s.logger.callback = libdav1d_log_callback;
215 s.allocator.cookie = dav1d;
216 s.allocator.alloc_picture_callback = libdav1d_picture_allocator;
217 s.allocator.release_picture_callback = libdav1d_picture_release;
218 s.frame_size_limit = c->max_pixels;
219 if (dav1d->apply_grain >= 0)
220 s.apply_grain = dav1d->apply_grain;
221 else
222 s.apply_grain = !(c->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN);
223
224 s.all_layers = dav1d->all_layers;
225 if (dav1d->operating_point >= 0)
226 s.operating_point = dav1d->operating_point;
227 s.strict_std_compliance = c->strict_std_compliance > 0;
228
229 s.n_threads = FFMIN(threads, DAV1D_MAX_THREADS);
230 if (dav1d->max_frame_delay > 0 && (c->flags & AV_CODEC_FLAG_LOW_DELAY))
231 av_log(c, AV_LOG_WARNING, "Low delay mode requested, forcing max_frame_delay 1\n");
232 s.max_frame_delay = (c->flags & AV_CODEC_FLAG_LOW_DELAY) ? 1 : dav1d->max_frame_delay;
233 av_log(c, AV_LOG_DEBUG, "Using %d threads, %d max_frame_delay\n",
234 s.n_threads, s.max_frame_delay);
235
236#if FF_DAV1D_VERSION_AT_LEAST(6,8)
237 if (c->skip_frame >= AVDISCARD_NONKEY)
238 s.decode_frame_type = DAV1D_DECODEFRAMETYPE_KEY;
239 else if (c->skip_frame >= AVDISCARD_NONINTRA)
240 s.decode_frame_type = DAV1D_DECODEFRAMETYPE_INTRA;
241 else if (c->skip_frame >= AVDISCARD_NONREF)
242 s.decode_frame_type = DAV1D_DECODEFRAMETYPE_REFERENCE;
243#endif
244
246 if (res < 0)
247 return res;
248
249 res = dav1d_open(&dav1d->c, &s);
250 if (res < 0)
251 return AVERROR(ENOMEM);
252
253#if FF_DAV1D_VERSION_AT_LEAST(6,7)
254 res = dav1d_get_frame_delay(&s);
255 if (res < 0) // Should not happen
256 return AVERROR_EXTERNAL;
257
258 // When dav1d_get_frame_delay() returns 1, there's no delay whatsoever
259 c->delay = res > 1 ? res : 0;
260#endif
261
262 dav1d->dovi.logctx = c;
263 dav1d->dovi.cfg.dv_profile = 10; // default for AV1
265 if (sd && sd->size >= sizeof(dav1d->dovi.cfg))
267 return 0;
268}
269
271{
272 Libdav1dContext *dav1d = c->priv_data;
273
274 dav1d_data_unref(&dav1d->data);
275 dav1d_flush(dav1d->c);
276}
277
278static void libdav1d_data_free(const uint8_t *data, void *opaque) {
279 AVBufferRef *buf = opaque;
280
281 av_buffer_unref(&buf);
282}
283
284static void libdav1d_user_data_free(const uint8_t *data, void *opaque) {
285 AVPacket *pkt = opaque;
286 av_assert0(data == opaque);
288}
289
291{
292 Libdav1dContext *dav1d = c->priv_data;
293 Dav1dData *data = &dav1d->data;
294 int res;
295
296 if (!data->sz) {
298
299 if (!pkt)
300 return AVERROR(ENOMEM);
301
302 res = ff_decode_get_packet(c, pkt);
303 if (res < 0 && res != AVERROR_EOF) {
305 return res;
306 }
307
308 if (pkt->size) {
309 res = dav1d_data_wrap(data, pkt->data, pkt->size,
310 libdav1d_data_free, pkt->buf);
311 if (res < 0) {
313 return res;
314 }
315
316 pkt->buf = NULL;
317
318 res = dav1d_data_wrap_user_data(data, (const uint8_t *)pkt,
320 if (res < 0) {
322 dav1d_data_unref(data);
323 return res;
324 }
325 pkt = NULL;
326 } else {
328 if (res >= 0)
329 return AVERROR(EAGAIN);
330 }
331 }
332
333 res = dav1d_send_data(dav1d->c, data);
334 if (res < 0) {
335 if (res == AVERROR(EINVAL))
337 if (res != AVERROR(EAGAIN)) {
338 dav1d_data_unref(data);
339 return res;
340 }
341 }
342
343 res = dav1d_get_picture(dav1d->c, p);
344 if (res < 0) {
345 if (res == AVERROR(EINVAL)) {
346 dav1d_data_unref(data);
348 } else if (res == AVERROR(EAGAIN))
349 res = c->internal->draining ? AVERROR_EOF : 1;
350 }
351
352 return res;
353}
354
355static int parse_itut_t35_metadata(Libdav1dContext *dav1d, Dav1dPicture *p,
356 const Dav1dITUTT35 *itut_t35, AVCodecContext *c,
357 AVFrame *frame) {
358 FFITUTT35 itut35 = { .country_code = itut_t35->country_code };
359 FFITUTT35Aux aux = { .dovi = &dav1d->dovi };
360 int res;
361
362 res = ff_itut_t35_parse_buffer(&itut35, itut_t35->payload, itut_t35->payload_size,
364 if (res <= 0)
365 return res;
366
367 res = ff_itut_t35_parse_payload_to_frame(&itut35, &aux, c, frame);
368 if (res < 0)
369 return res;
370
371 return 0;
372}
373
375{
376 Libdav1dContext *dav1d = c->priv_data;
377 Dav1dPicture pic = { 0 }, *p = &pic;
378 const AVPacket *pkt;
379 enum Dav1dEventFlags event_flags = 0;
380 int res;
381
382 do {
384 } while (res > 0);
385
386 if (res < 0)
387 return res;
388
389 av_assert0(p->data[0] && p->allocator_data);
390
391 // This requires the custom allocator above
392 frame->buf[0] = av_buffer_ref(p->allocator_data);
393 if (!frame->buf[0]) {
394 dav1d_picture_unref(p);
395 return AVERROR(ENOMEM);
396 }
397
398 frame->data[0] = p->data[0];
399 frame->data[1] = p->data[1];
400 frame->data[2] = p->data[2];
401 frame->linesize[0] = p->stride[0];
402 frame->linesize[1] = p->stride[1];
403 frame->linesize[2] = p->stride[1];
404
405 dav1d_get_event_flags(dav1d->c, &event_flags);
406 if (c->pix_fmt == AV_PIX_FMT_NONE || event_flags & DAV1D_EVENT_FLAG_NEW_SEQUENCE)
407 libdav1d_init_params(c, p->seq_hdr);
408
410 if (res < 0)
411 goto fail;
412
413 frame->width = p->p.w;
414 frame->height = p->p.h;
415 if (c->width != p->p.w || c->height != p->p.h) {
416 res = ff_set_dimensions(c, p->p.w, p->p.h);
417 if (res < 0)
418 goto fail;
419 }
420
421 av_reduce(&frame->sample_aspect_ratio.num,
422 &frame->sample_aspect_ratio.den,
423 frame->height * (int64_t)p->frame_hdr->render_width,
424 frame->width * (int64_t)p->frame_hdr->render_height,
425 INT_MAX);
426 ff_set_sar(c, frame->sample_aspect_ratio);
427
428 pkt = (const AVPacket *)p->m.user_data.data;
429
430 // match timestamps and packet size
432 if (res < 0)
433 goto fail;
434
435 frame->pkt_dts = pkt->pts;
436 if (p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY)
437 frame->flags |= AV_FRAME_FLAG_KEY;
438 else
439 frame->flags &= ~AV_FRAME_FLAG_KEY;
440
441 switch (p->frame_hdr->frame_type) {
442 case DAV1D_FRAME_TYPE_KEY:
443 case DAV1D_FRAME_TYPE_INTRA:
444 frame->pict_type = AV_PICTURE_TYPE_I;
445 break;
446 case DAV1D_FRAME_TYPE_INTER:
447 frame->pict_type = AV_PICTURE_TYPE_P;
448 break;
449 case DAV1D_FRAME_TYPE_SWITCH:
450 frame->pict_type = AV_PICTURE_TYPE_SP;
451 break;
452 default:
454 goto fail;
455 }
456
457 if (p->mastering_display) {
459
460 res = ff_decode_mastering_display_new(c, frame, &mastering);
461 if (res < 0)
462 goto fail;
463
464 if (mastering) {
465 for (int i = 0; i < 3; i++) {
466 mastering->display_primaries[i][0] = av_make_q(p->mastering_display->primaries[i][0], 1 << 16);
467 mastering->display_primaries[i][1] = av_make_q(p->mastering_display->primaries[i][1], 1 << 16);
468 }
469 mastering->white_point[0] = av_make_q(p->mastering_display->white_point[0], 1 << 16);
470 mastering->white_point[1] = av_make_q(p->mastering_display->white_point[1], 1 << 16);
471
472 mastering->max_luminance = av_make_q(p->mastering_display->max_luminance, 1 << 8);
473 mastering->min_luminance = av_make_q(p->mastering_display->min_luminance, 1 << 14);
474
475 mastering->has_primaries = 1;
476 mastering->has_luminance = 1;
477 }
478 }
479 if (p->content_light) {
481
482 res = ff_decode_content_light_new(c, frame, &light);
483 if (res < 0)
484 goto fail;
485
486 if (light) {
487 light->MaxCLL = p->content_light->max_content_light_level;
488 light->MaxFALL = p->content_light->max_frame_average_light_level;
489 }
490 }
491 if (p->itut_t35) {
492#if FF_DAV1D_VERSION_AT_LEAST(6,9)
493 for (size_t i = 0; i < p->n_itut_t35; i++) {
494 const Dav1dITUTT35 *itut_t35 = &p->itut_t35[i];
495#else
496 const Dav1dITUTT35 *itut_t35 = p->itut_t35;
497#endif
498 res = parse_itut_t35_metadata(dav1d, p, itut_t35, c, frame);
499 if (res < 0)
500 goto fail;
501#if FF_DAV1D_VERSION_AT_LEAST(6,9)
502 }
503#endif
504 }
505 if (p->frame_hdr->film_grain.present && (!dav1d->apply_grain ||
506 (c->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))) {
508 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(frame->format);
509 av_assert0(pixdesc);
510 if (!fgp) {
511 res = AVERROR(ENOMEM);
512 goto fail;
513 }
514
516 fgp->seed = p->frame_hdr->film_grain.data.seed;
517 fgp->width = frame->width;
518 fgp->height = frame->height;
519 fgp->color_range = frame->color_range;
520 fgp->color_primaries = frame->color_primaries;
521 fgp->color_trc = frame->color_trc;
522 fgp->color_space = frame->colorspace;
523 fgp->subsampling_x = pixdesc->log2_chroma_w;
524 fgp->subsampling_y = pixdesc->log2_chroma_h;
525 fgp->codec.aom.num_y_points = p->frame_hdr->film_grain.data.num_y_points;
526 fgp->codec.aom.chroma_scaling_from_luma = p->frame_hdr->film_grain.data.chroma_scaling_from_luma;
527 fgp->codec.aom.scaling_shift = p->frame_hdr->film_grain.data.scaling_shift;
528 fgp->codec.aom.ar_coeff_lag = p->frame_hdr->film_grain.data.ar_coeff_lag;
529 fgp->codec.aom.ar_coeff_shift = p->frame_hdr->film_grain.data.ar_coeff_shift;
530 fgp->codec.aom.grain_scale_shift = p->frame_hdr->film_grain.data.grain_scale_shift;
531 fgp->codec.aom.overlap_flag = p->frame_hdr->film_grain.data.overlap_flag;
532 fgp->codec.aom.limit_output_range = p->frame_hdr->film_grain.data.clip_to_restricted_range;
533
534 memcpy(&fgp->codec.aom.y_points, &p->frame_hdr->film_grain.data.y_points,
535 sizeof(fgp->codec.aom.y_points));
536 memcpy(&fgp->codec.aom.num_uv_points, &p->frame_hdr->film_grain.data.num_uv_points,
537 sizeof(fgp->codec.aom.num_uv_points));
538 memcpy(&fgp->codec.aom.uv_points, &p->frame_hdr->film_grain.data.uv_points,
539 sizeof(fgp->codec.aom.uv_points));
540 memcpy(&fgp->codec.aom.ar_coeffs_y, &p->frame_hdr->film_grain.data.ar_coeffs_y,
541 sizeof(fgp->codec.aom.ar_coeffs_y));
542 memcpy(&fgp->codec.aom.ar_coeffs_uv[0], &p->frame_hdr->film_grain.data.ar_coeffs_uv[0],
543 sizeof(fgp->codec.aom.ar_coeffs_uv[0]));
544 memcpy(&fgp->codec.aom.ar_coeffs_uv[1], &p->frame_hdr->film_grain.data.ar_coeffs_uv[1],
545 sizeof(fgp->codec.aom.ar_coeffs_uv[1]));
546 memcpy(&fgp->codec.aom.uv_mult, &p->frame_hdr->film_grain.data.uv_mult,
547 sizeof(fgp->codec.aom.uv_mult));
548 memcpy(&fgp->codec.aom.uv_mult_luma, &p->frame_hdr->film_grain.data.uv_luma_mult,
549 sizeof(fgp->codec.aom.uv_mult_luma));
550 memcpy(&fgp->codec.aom.uv_offset, &p->frame_hdr->film_grain.data.uv_offset,
551 sizeof(fgp->codec.aom.uv_offset));
552 }
553
555 if (res < 0)
556 goto fail;
557
558 res = 0;
559fail:
560 dav1d_picture_unref(p);
561 if (res < 0)
563 return res;
564}
565
567{
568 Libdav1dContext *dav1d = c->priv_data;
569
571 ff_dovi_ctx_unref(&dav1d->dovi);
572 dav1d_data_unref(&dav1d->data);
573 dav1d_close(&dav1d->c);
574
575 return 0;
576}
577
578#ifndef DAV1D_MAX_FRAME_THREADS
579#define DAV1D_MAX_FRAME_THREADS DAV1D_MAX_THREADS
580#endif
581#ifndef DAV1D_MAX_TILE_THREADS
582#define DAV1D_MAX_TILE_THREADS DAV1D_MAX_THREADS
583#endif
584#ifndef DAV1D_MAX_FRAME_DELAY
585#define DAV1D_MAX_FRAME_DELAY DAV1D_MAX_FRAME_THREADS
586#endif
587
588#define OFFSET(x) offsetof(Libdav1dContext, x)
589#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
590static const AVOption libdav1d_options[] = {
591 { "max_frame_delay", "Max frame delay", OFFSET(max_frame_delay), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_FRAME_DELAY, VD },
592 { "filmgrain", "Apply Film Grain", OFFSET(apply_grain), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VD | AV_OPT_FLAG_DEPRECATED },
593 { "oppoint", "Select an operating point of the scalable bitstream", OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 31, VD },
594 { "alllayers", "Output all spatial layers", OFFSET(all_layers), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
595 { NULL }
596};
597
598static const AVClass libdav1d_class = {
599 .class_name = "libdav1d decoder",
600 .item_name = av_default_item_name,
601 .option = libdav1d_options,
602 .version = LIBAVUTIL_VERSION_INT,
603};
604
606 .p.name = "libdav1d",
607 CODEC_LONG_NAME("dav1d AV1 decoder by VideoLAN"),
608 .p.type = AVMEDIA_TYPE_VIDEO,
609 .p.id = AV_CODEC_ID_AV1,
610 .priv_data_size = sizeof(Libdav1dContext),
616 .caps_internal = FF_CODEC_CAP_SETS_FRAME_PROPS |
618 .p.priv_class = &libdav1d_class,
619 .p.wrapper_name = "libdav1d",
620};
static const char *const format[]
Definition af_aiir.c:444
const FFCodec ff_libdav1d_decoder
Definition libdav1d.c:605
#define VD
Definition amfdec.c:787
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
AVRational ff_av1_framerate(int64_t ticks_per_frame, int64_t units_per_tick, int64_t time_scale)
Definition av1_parse.c:110
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_RECEIVE_FRAME_CB(func)
#define FF_CODEC_CAP_SETS_FRAME_PROPS
Codec handles output frame properties internally instead of letting the internal logic derive them fr...
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
Set various frame properties from the codec context / packet data.
Definition decode.c:1598
int ff_attach_decode_data(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:1704
int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame, AVContentLightMetadata **clm)
Wrapper around av_content_light_metadata_create_side_data(), which rejects side data overridden by th...
Definition decode.c:2308
const AVPacketSideData * ff_get_coded_side_data(const AVCodecContext *avctx, enum AVPacketSideDataType type)
Get side data of the given type from a decoding context.
Definition decode.c:1378
int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame, AVMasteringDisplayMetadata **mdm)
Wrapper around av_mastering_display_metadata_create_side_data(), which rejects side data overridden b...
Definition decode.c:2263
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition decode.c:254
int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt)
Set various frame properties from the provided packet.
Definition decode.c:1550
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition utils.c:106
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Definition utils.c:91
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
static AVPacket * pkt
static enum AVPixelFormat pix_fmt
static AVFrame * frame
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition dovi_rpu.c:30
void(* flush)(AVBSFContext *ctx)
Definition dts2pts.c:610
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
AVFilmGrainParams * av_film_grain_params_create_side_data(AVFrame *frame)
Allocate a complete AVFilmGrainParams and add it to the frame.
@ AV_FILM_GRAIN_PARAMS_AV1
The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)
#define fail
Definition test.h:479
#define AV_OPT_FLAG_DEPRECATED
Set if option is deprecated, users should refer to AVOption.help text for more information.
Definition opt.h:385
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
Definition codec.h:112
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition avcodec.h:404
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
Definition avcodec.h:314
@ AV_CODEC_ID_AV1
Definition codec_id.h:275
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition defs.h:231
@ AVDISCARD_NONINTRA
discard all non intra frames
Definition defs.h:230
@ AVDISCARD_NONREF
discard all non reference
Definition defs.h:228
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition packet.h:280
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition packet.c:63
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition buffer.c:139
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:103
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition buffer.c:328
AVBufferPool * av_buffer_pool_init(size_t size, AVBufferRef *(*alloc)(size_t size))
Allocate and initialize a buffer pool.
Definition buffer.c:283
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition buffer.c:390
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition error.h:59
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:687
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
void av_vlog(void *avcl, int level, const char *fmt, va_list vl)
Send the specified message to the log if the level is less than or equal to the current av_log_level.
Definition log.c:459
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition rational.h:71
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align)
Return the size in bytes of the amount of data required to store an image with the given parameters.
Definition imgutils.c:466
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align)
Setup the data pointers and linesizes based on the specified image parameters and the provided array.
Definition imgutils.c:446
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_SP
Switching Predicted.
Definition avutil.h:283
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
misc image utilities
int ff_itut_t35_parse_buffer(FFITUTT35 *const itut_t35, const uint8_t *buf, size_t buf_size, int flags)
Parse a raw ITU-T T35 buffer to get the country code, provider code, and set them plus the pointer an...
Definition itut35.c:34
int ff_itut_t35_parse_payload_to_frame(FFITUTT35 *const itut_t35, FFITUTT35Aux *const aux, AVCodecContext *const avctx, AVFrame *const frame)
Parse a pre-processed ITU-T T35 payload to fill a frame's side data.
Definition itut35.c:322
#define FF_ITUT_T35_FLAG_COUNTRY_CODE
country_code is assumed to not be the first byte of the buffer and must be set by the caller beforeha...
Definition itut35.h:83
unsigned offset
Definition libaomenc.c:763
common internal api header.
#define av_cold
Definition attributes.h:117
static void libdav1d_data_free(const uint8_t *data, void *opaque)
Definition libdav1d.c:278
static int libdav1d_picture_allocator(Dav1dPicture *p, void *cookie)
Definition libdav1d.c:77
static av_cold int libdav1d_init(AVCodecContext *c)
Definition libdav1d.c:202
static enum AVPixelFormat pix_fmt_rgb[3]
Definition libdav1d.c:66
static void libdav1d_user_data_free(const uint8_t *data, void *opaque)
Definition libdav1d.c:284
static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
Definition libdav1d.c:290
static void libdav1d_picture_release(Dav1dPicture *p, void *cookie)
Definition libdav1d.c:125
static const AVOption libdav1d_options[]
Definition libdav1d.c:590
static void libdav1d_init_params(AVCodecContext *c, const Dav1dSequenceHeader *seq)
Definition libdav1d.c:132
static const AVClass libdav1d_class
Definition libdav1d.c:598
static av_cold int libdav1d_parse_extradata(AVCodecContext *c)
Definition libdav1d.c:163
#define DAV1D_MAX_FRAME_DELAY
Definition libdav1d.c:585
static av_cold int libdav1d_close(AVCodecContext *c)
Definition libdav1d.c:566
static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl)
Definition libdav1d.c:70
static void libdav1d_flush(AVCodecContext *c)
Definition libdav1d.c:270
#define OFFSET(x)
Definition libdav1d.c:588
static int parse_itut_t35_metadata(Libdav1dContext *dav1d, Dav1dPicture *p, const Dav1dITUTT35 *itut_t35, AVCodecContext *c, AVFrame *frame)
Definition libdav1d.c:355
static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
Definition libdav1d.c:374
version
Definition libkvazaar.c:313
uint8_t w
Definition llvidencdsp.c:39
#define FFMIN(a, b)
Definition macros.h:49
#define FFALIGN(x, a)
Definition macros.h:78
const char data[16]
Definition mxf.c:149
AVOptions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:806
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_GBRP10
Definition pixfmt.h:564
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_GRAY12
Definition pixfmt.h:526
#define AV_PIX_FMT_GBRP12
Definition pixfmt.h:565
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition pixfmt.h:165
#define AV_PIX_FMT_GRAY10
Definition pixfmt.h:525
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition pixfmt.h:642
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition pixfmt.h:672
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
AVColorSpace
YUV colorspace type.
Definition pixfmt.h:706
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition pixfmt.h:707
The buffer pool.
A reference to a data buffer.
Definition buffer.h:82
uint8_t * data
The data buffer.
Definition buffer.h:90
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
unsigned MaxFALL
Max average light level per frame (cd/m^2).
unsigned MaxCLL
Max content light level (cd/m^2).
int chroma_scaling_from_luma
Signals whether to derive the chroma scaling function from the luma.
int limit_output_range
Signals to clip to limited color levels after film grain application.
int scaling_shift
Specifies the shift applied to the chroma components.
int grain_scale_shift
Signals the down shift applied to the generated gaussian numbers during synthesis.
int num_uv_points[2]
If chroma_scaling_from_luma is set to 0, signals the chroma scaling function parameters.
int overlap_flag
Signals whether to overlap film grain blocks.
int ar_coeff_lag
Specifies the auto-regression lag.
int uv_offset[2]
Offset used for component scaling function.
int ar_coeff_shift
Specifies the range of the auto-regressive coefficients.
uint8_t uv_points[2][10][2]
int8_t ar_coeffs_uv[2][25]
Chroma auto-regression coefficients.
int uv_mult[2]
Specifies the luma/chroma multipliers for the index to the component scaling function.
int8_t ar_coeffs_y[24]
Luma auto-regression coefficients.
int num_y_points
Number of points, and the scale and value for each point of the piecewise linear scaling function for...
This structure describes how to handle film grain synthesis in video for specific codecs.
enum AVColorPrimaries color_primaries
AVFilmGrainAOMParams aom
enum AVColorRange color_range
Intended video signal characteristics.
int subsampling_x
Intended subsampling ratio, or 0 for luma-only streams.
union AVFilmGrainParams::@177057277273004265167152242113040056044005264354 codec
Additional fields may be added both here and in any structure included.
enum AVFilmGrainParamsType type
Specifies the codec for which this structure is valid.
int width
Intended display resolution.
uint64_t seed
Seed to use for the synthesis process, if the codec allows for it.
enum AVColorTransferCharacteristic color_trc
enum AVColorSpace color_space
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
Mastering display metadata capable of representing the color volume of the display used to master the...
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
AVOption.
Definition opt.h:428
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition packet.h:424
uint8_t * data
Definition packet.h:425
This structure stores compressed data.
Definition packet.h:580
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition pixdesc.h:80
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition pixdesc.h:89
AVDOVIDecoderConfigurationRecord cfg
Currently active dolby vision configuration, or {0} for none.
Definition dovi_rpu.h:61
void * logctx
Definition dovi_rpu.h:43
const uint8_t * payload
Definition itut35.h:56
DOVIContext dovi
Definition libdav1d.c:49
AVBufferPool * pool
Definition libdav1d.c:48
Dav1dData data
Definition libdav1d.c:52
Dav1dContext * c
Definition libdav1d.c:47
int operating_point
Definition libdav1d.c:55
int max_frame_delay
Definition libdav1d.c:53
#define av_log(a,...)
static double c[64]