From patchwork Mon May 11 14:27:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 19624 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 66C44449401 for ; Mon, 11 May 2020 17:28:21 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 46FD1687F83; Mon, 11 May 2020 17:28:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C5CE6687F31 for ; Mon, 11 May 2020 17:28:14 +0300 (EEST) Received: by mail-qt1-f195.google.com with SMTP id z90so8020972qtd.10 for ; Mon, 11 May 2020 07:28:14 -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=55rOa5oPZYDHTKYtexVenSQuqJRViFL2siTPymS8f78=; b=uoaQkWOwM9ejfcF+9rASyI6fGcZIToEdqsdc9hROnIEO4THz3ixfbghy9r9bnMoKKg ztl7VCajmqTY7ZcQVuStj4/x4+m/2vUrljadk9P1zOCPcn6VYOIMOdZjmpqBXq6q3AOZ m+Cxs8vKNnxNvT+6XJcvRld+04MvlhoIILEkIpCy95ukJ3UfEDB5siICWA0P4tFaittw tgrz4xm01RIUVqGk5oVWha4xM58+tuRY8juE3J5aNoCkIPOWIsC9BV5cntE+A3x0sjTt yu5AxbrxCE/avxl2KY6E61d1GDafCzcVzVpYF0HhSYrFV5hAX+FjHNW+a5msAPbsr4ex 2X6A== 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=55rOa5oPZYDHTKYtexVenSQuqJRViFL2siTPymS8f78=; b=LdB08TT603gQbvuVUlxf7w4HTqrAdfWcARlQhovcre0UNofsqjJwnsqiAOaLVoefGf pHoozU59mQ0YOPC0iY/8vqideTr9FGvqkIEaKKMwgIKxmE3oSoe09EpkyPzrNaqy/gnP GgG11Ee58ZgoEz9M/jqzbMvM9z30ii4wrhjm+KzEep+arCO6BTCWfz9VQLA7TuBnkOdK QA4XvVYoPwvcd34mpHWnjJusISJBITrGhePJt6o2jji6bm2ly0W+6uuQz0WfCBZUdaMN 3mq1QLRcvC00aTLnEub/lZ/rjDgirs9o3KZCdom8DFYztPLm9kiXcXdbu2UH3U2Bm8mN Rjxg== X-Gm-Message-State: AGi0PuZAljwvsXv7acwosi/cxrCFYMoMnHbp98CiEaZ/FPqRgshq3wBn MQ0VRT05B+w2dRAuc9E+uEm/pQ0x X-Google-Smtp-Source: APiQypLigc08pI2H1PW5VPMEz32Pj6T0CzE5VcV9TxVwJk8P87rdieW+d45iuK2vVAMeI6n3UyK89w== X-Received: by 2002:ac8:1b97:: with SMTP id z23mr16264375qtj.294.1589207292793; Mon, 11 May 2020 07:28:12 -0700 (PDT) Received: from localhost.localdomain ([181.23.75.91]) by smtp.gmail.com with ESMTPSA id i24sm3528478qtm.85.2020.05.11.07.28.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2020 07:28:11 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 11 May 2020 11:27:55 -0300 Message-Id: <20200511142756.1868-1-jamrial@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/libdav1d: try to set decoder context parameters during init() 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" If extradata is available, use it to initialize the AVCodecContext before packet data is seen. Also, don't constantly overwrite it after it's set. Signed-off-by: James Almer --- The main benefit from this is using ff_decode_frame_props() to fill frame props, which includes copying any relevant side data that may be present in packets, like for example container mastering metadata propagated by a demuxer. libavcodec/libdav1d.c | 102 +++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 31 deletions(-) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 5248e3f9f5..72f06c550e 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -42,6 +42,8 @@ typedef struct Libdav1dContext { int apply_grain; int operating_point; int all_layers; + + int inited; } Libdav1dContext; static const enum AVPixelFormat pix_fmt[][3] = { @@ -117,9 +119,59 @@ static void libdav1d_picture_release(Dav1dPicture *p, void *cookie) av_buffer_unref(&buf); } +static int libdav1d_init_params(AVCodecContext *c, Dav1dSequenceHeader *seq) +{ + Libdav1dContext *dav1d = c->priv_data; + int res; + + if (dav1d->inited) + return 0; + + c->profile = seq->profile; + c->level = ((seq->operating_points[0].major_level - 2) << 2) + | seq->operating_points[0].minor_level; + + res = ff_set_dimensions(c, seq->max_width, seq->max_height); + if (res < 0) + return res; + + 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; + } + + dav1d->inited = 1; + + return 0; +} + 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; @@ -153,6 +205,16 @@ static av_cold int libdav1d_init(AVCodecContext *c) if (res < 0) return AVERROR(ENOMEM); + if (c->extradata && c->extradata_size) { + res = dav1d_parse_sequence_header(&seq, c->extradata, c->extradata_size); + if (res < 0) + return AVERROR_INVALIDDATA; + + res = libdav1d_init_params(c, &seq); + if (res < 0) + return res; + } + return 0; } @@ -162,6 +224,7 @@ static void libdav1d_flush(AVCodecContext *c) dav1d_data_unref(&dav1d->data); dav1d_flush(dav1d->c); + dav1d->inited = 0; } static void libdav1d_data_free(const uint8_t *data, void *opaque) { @@ -256,9 +319,14 @@ 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; + res = libdav1d_init_params(c, p->seq_hdr); + if (res < 0) + return res; + + res = ff_decode_frame_props(c, frame); + if (res < 0) + return res; + frame->width = p->p.w; frame->height = p->p.h; if (c->width != p->p.w || c->height != p->p.h) { @@ -267,39 +335,11 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) goto fail; } - 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 From patchwork Mon May 11 14:27:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 19625 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 5A78E449401 for ; Mon, 11 May 2020 17:28:24 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 488EE680947; Mon, 11 May 2020 17:28:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 05B9F6808E9 for ; Mon, 11 May 2020 17:28:16 +0300 (EEST) Received: by mail-qt1-f193.google.com with SMTP id v4so7115418qte.3 for ; Mon, 11 May 2020 07:28:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=ROFk57sCsnPi+MF2BdOLXdd9erRkB8ZrJkhSS3qeRtE=; b=b5rfcgob4j0EtFLsU0B6/BXF1z18tC22Vdh2Uqkm/qo/2qOQXup9IQILsfvi4cL4Rw JmNZFu+Ckv584RWMMlgp5FtGhg6DNAP2DJMWhEzI7h7en8+9wKogjdiC/kaG8pCWpCc7 5J+7Uf1Adon2uvk1xDn4QfZNzU6BaaDJ6Jb5LxgaOK/nyKpXcEY/6hmwiETmVkFulxxQ AXbuSyaWkxEEz5KVBUntaeB3OaxewKGQfYhWoftU/bTiTiL0Q/NQ5VB9o2MD5fmaxCkr LW7vUYE2U7u/lnv76nqru+9IG1SQRBHyVz0TRSgItE3E+uwSU4G9l1TgWDSsxWAktF/A wMMg== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=ROFk57sCsnPi+MF2BdOLXdd9erRkB8ZrJkhSS3qeRtE=; b=e56XaoGH911mUCx41cApKqtXlxFJJd2IHrNfrvIxYjCa77dYZ9RoOMKUbuJYWF4ghF NxXT/CL9lgePGfBvnJXZESaBOO83IcwZfzG1X0450zkmMhgdMEkmyfEogEXOXQ1iXVVv iL759hsDvcsQn4esUcyEe3lZ08jx6oknWnk7YD8GonNk2itvXQXHUXdVV/V+tQVGei52 zV/lyJE9+PBICCki1UhGv571+5iJ8nsRC61nZTkcq2AjCCEwWtFppRYxzOlod8MiqJ3V 8UHZ2DxAOXDVDSt1jHurInDIRxyrg6EmAKbkMiUvUVh49lsPlcsnz6WY+tKcigh9LP0b 1mRg== X-Gm-Message-State: AGi0PubEPJXSvHTBPgnm4XqYi/092u1HjbR1bcXgQwm6pMCVDhCdhOR5 eSKTJAVQqT2iFolvAS7gkSyk00ZH X-Google-Smtp-Source: APiQypLHaXClcR0bERrjmnLuO0hamFdRm/Y+3bCzw4cTGXqWOoM1kF5omlcgBUWd8bcJMX5ecboHaA== X-Received: by 2002:ac8:fee:: with SMTP id f43mr17264354qtk.376.1589207294465; Mon, 11 May 2020 07:28:14 -0700 (PDT) Received: from localhost.localdomain ([181.23.75.91]) by smtp.gmail.com with ESMTPSA id i24sm3528478qtm.85.2020.05.11.07.28.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2020 07:28:13 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 11 May 2020 11:27:56 -0300 Message-Id: <20200511142756.1868-2-jamrial@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200511142756.1868-1-jamrial@gmail.com> References: <20200511142756.1868-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/libdav1d: export frame sample aspect ratio 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" Signed-off-by: James Almer --- libavcodec/libdav1d.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 72f06c550e..a265a487d8 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -335,6 +335,12 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) goto fail; } + av_reduce(&frame->sample_aspect_ratio.num, + &frame->sample_aspect_ratio.den, + frame->height * (int64_t)p->frame_hdr->render_width, + frame->width * (int64_t)p->frame_hdr->render_height, + INT_MAX); + if (p->m.user_data.data) memcpy(&frame->reordered_opaque, p->m.user_data.data, sizeof(frame->reordered_opaque)); else