From patchwork Wed Apr 22 04:35:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 19143 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 CB63F44921E for ; Wed, 22 Apr 2020 07:36:30 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A8E8868BAEC; Wed, 22 Apr 2020 07:36:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C1E8C68B76C for ; Wed, 22 Apr 2020 07:36:23 +0300 (EEST) Received: by mail-pj1-f52.google.com with SMTP id t9so357589pjw.0 for ; Tue, 21 Apr 2020 21:36:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=myh9acsAfZZIP/N7MoXOALoDAN6LqlAQdRgTQ+iLFLQ=; b=I+aJGLP2v2EP2nzprijf5RTHdfS7n6026rbxF0Xpms2SYE1yRJZ8h80poDJkKbOpap 1eHf1iATdIv762b3el1qd1nw80mFTcY9MZeTgSGt6aY7FrOP4bCNkugy1Ta9u5e8S/eC nXaZllMWim6LpcQFZOoauZ113P7+u/yoLlMyN5sspXM379eFTkf9a4dpMR4vYvanmxow 2Nd1rBd9P7dV9PdxtBZ8HaWYtp6tPrU8OQjHLD7SjOXCdqiGwjTdNCGkScatI/pwYtJg SJ9uhihZ2ydaXiWpGyQyphpAvrSOCKMwLw/S/A7oHHP7739Jfc8JRLo/Z9JE8u/UwRnW Q14w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=myh9acsAfZZIP/N7MoXOALoDAN6LqlAQdRgTQ+iLFLQ=; b=dAC/+L73L2c3Nyu2ReyXiMpMb4+xs3hY2HtEyaK1thr9MGCEEdHUnkysRcUzcU749y u/QyNMYVhpwfJFblbit3+BReU1w/xvmsW/ZQJLLFnSlBjDhHeEgxCa4EdZcYvUdljFS9 EsvePzhFFiRgd7XQdl3UI+0QZdO05XHrxk4n6r4c7RiNCOa4PlEqjN0t414WhYsCgDI5 Q6VqK5VlhwPfo4P3+sA+NH/+yE1CyG089YfYn4Qm67Yll1CRHKHZ/l7tdlm/ShF86RB1 wmGs36xiavyHd621KrhdOL7kPUgHzg/E4TIwuRoD3NfhcU+Zxn/YDgasjUVRWLnLjRxi tr3w== X-Gm-Message-State: AGi0PuYAy7vP8t/20yNUxd7MDpdYr4lAIciL8z32wk3lODpImpHlMzjm UCVtOnvHfj5j+ZaYM0ZJHjWIv3ygNnBY8g== X-Google-Smtp-Source: APiQypJeCzeCVrQ9HT+M3U+ZgfKABca/5BzMus3SOcqpPfdTc0vE479T5+FKlTrShgMqeYWTI7HM8Q== X-Received: by 2002:a17:902:d70f:: with SMTP id w15mr24858575ply.138.1587530181780; Tue, 21 Apr 2020 21:36:21 -0700 (PDT) Received: from localhost.localdomain ([49.51.162.193]) by smtp.gmail.com with ESMTPSA id z6sm3714261pgg.39.2020.04.21.21.36.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Apr 2020 21:36:21 -0700 (PDT) From: Jun Zhao To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Apr 2020 12:35:45 +0800 Message-Id: <1587530154-27795-5-git-send-email-mypopydev@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1587530154-27795-1-git-send-email-mypopydev@gmail.com> References: <1587530154-27795-1-git-send-email-mypopydev@gmail.com> Subject: [FFmpeg-devel] [PATCH v5 4/7] lavf/mov: support dvcC/dvvC box for DOVI 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 Cc: vacingfang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: vacingfang support dvcC/dvcC box from spec Dolby Vision Streams Within the ISO Base MediaFile Format Version 2.1.2 (https://www.dolby.com/in/en/technologies/dolby-vision/dolby-vision\ -bitstreams-within-the-iso-base-media-file-format-v2.1.2.pdf) export the DOVI information to sidedata. Signed-off-by: vacingfang --- libavformat/mov.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/libavformat/mov.c b/libavformat/mov.c index 8e8aba7..3d6fef6 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -46,6 +46,7 @@ #include "libavutil/spherical.h" #include "libavutil/stereo3d.h" #include "libavutil/timecode.h" +#include "libavutil/dovi_meta.h" #include "libavcodec/ac3tab.h" #include "libavcodec/flac.h" #include "libavcodec/mpegaudiodecheader.h" @@ -6786,6 +6787,63 @@ static int mov_read_dmlp(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + uint32_t buf; + AVDOVIDecoderConfigurationRecord *dovi; + size_t dovi_size; + int ret; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams-1]; + + if ((uint64_t)atom.size > (1<<30) || atom.size < 4) + return AVERROR_INVALIDDATA; + + dovi = av_dovi_alloc(&dovi_size); + if (!dovi) + return AVERROR(ENOMEM); + + dovi->dv_version_major = avio_r8(pb); + dovi->dv_version_minor = avio_r8(pb); + + buf = avio_rb16(pb); + dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits + dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits + dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit + dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit + dovi->bl_present_flag = buf & 0x01; // 1 bit + if (atom.size >= 24) { // 4 + 4 + 4 * 4 + buf = avio_r8(pb); + dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits + } else { + // 0 stands for None + // Dolby Vision V1.2.93 profiles and levels + dovi->dv_bl_signal_compatibility_id = 0; + } + + ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, + (uint8_t *)dovi, dovi_size); + if (ret < 0) { + av_freep(dovi); + return ret; + } + + av_log(c, AV_LOG_TRACE, "DOVI in dvcC/dvvC box, version: %d.%d, profile: %d, level: %d, " + "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", + dovi->dv_version_major, dovi->dv_version_minor, + dovi->dv_profile, dovi->dv_level, + dovi->rpu_present_flag, + dovi->el_present_flag, + dovi->bl_present_flag, + dovi->dv_bl_signal_compatibility_id + ); + + return 0; +} + static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('A','C','L','R'), mov_read_aclr }, { MKTAG('A','P','R','G'), mov_read_avid }, @@ -6881,6 +6939,8 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('v','p','c','C'), mov_read_vpcc }, { MKTAG('m','d','c','v'), mov_read_mdcv }, { MKTAG('c','l','l','i'), mov_read_clli }, +{ MKTAG('d','v','c','C'), mov_read_dvcc_dvvc }, +{ MKTAG('d','v','v','C'), mov_read_dvcc_dvvc }, { 0, NULL } };