[DAV1D_PIXEL_LAYOUT_I444] = { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12 },
};
+static const enum AVPixelFormat pix_fmt_rgb[3] = {
+ AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
+};
+
static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl)
{
AVCodecContext *c = opaque;
s.allocator.cookie = dav1d;
s.allocator.alloc_picture_callback = libdav1d_picture_allocator;
s.allocator.release_picture_callback = libdav1d_picture_release;
+ s.frame_size_limit = c->max_pixels;
s.apply_grain = dav1d->apply_grain;
s.n_tile_threads = dav1d->tile_threads
return res;
}
- av_assert0(p->data[0] != NULL);
+ av_assert0(p->data[0] && p->allocator_data);
// This requires the custom allocator above
frame->buf[0] = av_buffer_ref(p->allocator_data);
frame->linesize[2] = p->stride[1];
c->profile = p->seq_hdr->profile;
- frame->format = c->pix_fmt = pix_fmt[p->p.layout][p->seq_hdr->hbd];
+ c->level = ((p->seq_hdr->operating_points[0].major_level - 2) << 2)
+ | p->seq_hdr->operating_points[0].minor_level;
frame->width = p->p.w;
frame->height = p->p.h;
if (c->width != p->p.w || c->height != p->p.h) {
frame->color_trc = c->color_trc = (enum AVColorTransferCharacteristic) p->seq_hdr->trc;
frame->color_range = c->color_range = p->seq_hdr->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
+ if (p->p.layout == DAV1D_PIXEL_LAYOUT_I444 &&
+ p->seq_hdr->mtrx == DAV1D_MC_IDENTITY &&
+ p->seq_hdr->pri == DAV1D_COLOR_PRI_BT709 &&
+ p->seq_hdr->trc == DAV1D_TRC_SRGB)
+ frame->format = c->pix_fmt = pix_fmt_rgb[p->seq_hdr->hbd];
+ else
+ frame->format = c->pix_fmt = pix_fmt[p->p.layout][p->seq_hdr->hbd];
+
// match timestamps and packet size
frame->pts = frame->best_effort_timestamp = p->m.timestamp;
#if FF_API_PKT_PTS