From patchwork Tue Sep 15 13:24:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 22418 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 54F84448519 for ; Tue, 15 Sep 2020 16:24:56 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2E9E868B946; Tue, 15 Sep 2020 16:24:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f67.google.com (mail-qv1-f67.google.com [209.85.219.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 773E968B90C for ; Tue, 15 Sep 2020 16:24:50 +0300 (EEST) Received: by mail-qv1-f67.google.com with SMTP id q10so1701117qvs.1 for ; Tue, 15 Sep 2020 06:24:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=WpjRQ/zzwwcD1Rj8GzMU5EOhCQS//gPJ7o8qGOGoMMs=; b=VeXM1w+cimKJ3d0Y52iWNWseSKjmbNCu1Ji+ZUH5XoNaA+qAQjxRhXlYCDBVUUXiO7 XCqDLk2O13RJrgaFnsTS5rAHMJQTL8/tmBct9l8QvL4bo/O7Bkx10iM1vp0dBRNAyT5T IyDcudZ3ujABfUzDBOMawXc/6olXgu7rHFzJ5jPCLnvbaofQS9uXoVKvqGKSrmgqCIP9 N+oFaabN2tWN2N6mqhO9LUBTkiZZcWkvZ5Vrj52ub3/+aHyMX8VdNXb1G0iGE9K4lmvR pt6EF1s7uTBFfjiD8Y3EpaCcnB6meuKIhsNkCdwXo07GWNVVqQ6wdFdsqQtyj+choIac nZYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=WpjRQ/zzwwcD1Rj8GzMU5EOhCQS//gPJ7o8qGOGoMMs=; b=ihxC2w7KXP8F2slfoco8xPcwPcOxIX0Q163ggPjXn/i8qoO1UGTz5TqWT6LR94sjHX 8ryiTBAk595aFDYHOzKsvhxNE1t+aKEB5Jd3CLQnSE9oZrUIpUy03GzSPyiZJA4VAizS kI6CeJpqnv69kL03vV+TYbzKM7pwccsH4a1SIDGgBly+FB/hOI3nku6uEjeuOZucs52F vrwAtbWUHw/hZ4tiRDx+j36Fj6yoZvafECLkJZtt5JesnSVm1ron+OXZJ/piPRVopr+W 4C4CqBsMK7CnDxTHTd5jDmwPwNVlEDoakjl2xyw6pwjfLTzeDXa4uq0SiyHCrZLZiVE3 3/oA== X-Gm-Message-State: AOAM532EWFkNflRDGEogUOFEIFGO7JTFDPJUk3VqWpg0M+ceraw4GV4O VqpwTIILIFazvueDzMozMPz52/LsVK0= X-Google-Smtp-Source: ABdhPJzj/4Xdh/qeOOIc8WMBBbZXcKvs05rcyiBu5ZXprR20iZ6qnCjsY/tHnRefp+lLehUHB/r6Vg== X-Received: by 2002:ad4:4891:: with SMTP id bv17mr17727470qvb.20.1600176288774; Tue, 15 Sep 2020 06:24:48 -0700 (PDT) Received: from localhost.localdomain ([191.83.208.67]) by smtp.gmail.com with ESMTPSA id n11sm16593225qkk.105.2020.09.15.06.24.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2020 06:24:47 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 15 Sep 2020 10:24:23 -0300 Message-Id: <20200915132425.5527-1-jamrial@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/libdav1d: use ff_decode_frame_props() to fill frame properties X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The main benefit comes from propagating container level metadata like hdr, which is more commonly used than the relevant Metadata OBUs. Signed-off-by: James Almer --- libavcodec/libdav1d.c | 94 +++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 3af7ef4edc..1b9289824f 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -119,9 +119,45 @@ static void libdav1d_picture_release(Dav1dPicture *p, void *cookie) av_buffer_unref(&buf); } +static void libdav1d_init_params(AVCodecContext *c, Dav1dSequenceHeader *seq) +{ + c->profile = seq->profile; + c->level = ((seq->operating_points[0].major_level - 2) << 2) + | seq->operating_points[0].minor_level; + + switch (seq->chr) { + case DAV1D_CHR_VERTICAL: + c->chroma_sample_location = AVCHROMA_LOC_LEFT; + break; + case DAV1D_CHR_COLOCATED: + c->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; + break; + } + c->colorspace = (enum AVColorSpace) seq->mtrx; + c->color_primaries = (enum AVColorPrimaries) seq->pri; + c->color_trc = (enum AVColorTransferCharacteristic) seq->trc; + c->color_range = seq->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + + if (seq->layout == DAV1D_PIXEL_LAYOUT_I444 && + seq->mtrx == DAV1D_MC_IDENTITY && + seq->pri == DAV1D_COLOR_PRI_BT709 && + seq->trc == DAV1D_TRC_SRGB) + c->pix_fmt = pix_fmt_rgb[seq->hbd]; + else + c->pix_fmt = pix_fmt[seq->layout][seq->hbd]; + + if (seq->num_units_in_tick && seq->time_scale) { + av_reduce(&c->framerate.den, &c->framerate.num, + seq->num_units_in_tick, seq->time_scale, INT_MAX); + if (seq->equal_picture_interval) + c->ticks_per_frame = seq->num_ticks_per_picture; + } +} + static av_cold int libdav1d_init(AVCodecContext *c) { Libdav1dContext *dav1d = c->priv_data; + Dav1dSequenceHeader seq; Dav1dSettings s; int threads = (c->thread_count ? c->thread_count : av_cpu_count()) * 3 / 2; int res; @@ -198,10 +234,6 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) return res; } - data->m.timestamp = pkt.pts; - data->m.offset = pkt.pos; - data->m.duration = pkt.duration; - pkt.buf = NULL; av_packet_unref(&pkt); @@ -258,9 +290,11 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) frame->linesize[1] = p->stride[1]; frame->linesize[2] = p->stride[1]; - c->profile = p->seq_hdr->profile; - c->level = ((p->seq_hdr->operating_points[0].major_level - 2) << 2) - | p->seq_hdr->operating_points[0].minor_level; + libdav1d_init_params(c, p->seq_hdr); + res = ff_decode_frame_props(c, frame); + if (res < 0) + goto fail; + frame->width = p->p.w; frame->height = p->p.h; if (c->width != p->p.w || c->height != p->p.h) { @@ -276,50 +310,12 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) INT_MAX); ff_set_sar(c, frame->sample_aspect_ratio); - switch (p->seq_hdr->chr) { - case DAV1D_CHR_VERTICAL: - frame->chroma_location = c->chroma_sample_location = AVCHROMA_LOC_LEFT; - break; - case DAV1D_CHR_COLOCATED: - frame->chroma_location = c->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; - break; - } - frame->colorspace = c->colorspace = (enum AVColorSpace) p->seq_hdr->mtrx; - frame->color_primaries = c->color_primaries = (enum AVColorPrimaries) p->seq_hdr->pri; - 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]; - if (p->m.user_data.data) memcpy(&frame->reordered_opaque, p->m.user_data.data, sizeof(frame->reordered_opaque)); else frame->reordered_opaque = AV_NOPTS_VALUE; - if (p->seq_hdr->num_units_in_tick && p->seq_hdr->time_scale) { - av_reduce(&c->framerate.den, &c->framerate.num, - p->seq_hdr->num_units_in_tick, p->seq_hdr->time_scale, INT_MAX); - if (p->seq_hdr->equal_picture_interval) - c->ticks_per_frame = p->seq_hdr->num_ticks_per_picture; - } - - // match timestamps and packet size - frame->pts = frame->best_effort_timestamp = p->m.timestamp; -#if FF_API_PKT_PTS -FF_DISABLE_DEPRECATION_WARNINGS - frame->pkt_pts = p->m.timestamp; -FF_ENABLE_DEPRECATION_WARNINGS -#endif - frame->pkt_dts = p->m.timestamp; - frame->pkt_pos = p->m.offset; - frame->pkt_size = p->m.size; - frame->pkt_duration = p->m.duration; + frame->best_effort_timestamp = frame->pts; frame->key_frame = p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY; switch (p->frame_hdr->frame_type) { @@ -338,7 +334,9 @@ FF_ENABLE_DEPRECATION_WARNINGS goto fail; } - if (p->mastering_display) { + // Give priority to metadata at the container level. + // See "AV1 Codec ISO Media File Format Binding". + if (p->mastering_display && !av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA)) { AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame); if (!mastering) { res = AVERROR(ENOMEM); @@ -358,7 +356,7 @@ FF_ENABLE_DEPRECATION_WARNINGS mastering->has_primaries = 1; mastering->has_luminance = 1; } - if (p->content_light) { + if (p->content_light && !av_frame_get_side_data(frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) { AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame); if (!light) { res = AVERROR(ENOMEM);