From patchwork Tue Aug 13 19:16:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Ionascu X-Patchwork-Id: 14488 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 B72D1448401 for ; Tue, 13 Aug 2019 22:25:23 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 830326805C7; Tue, 13 Aug 2019 22:25:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 566C668AAEB for ; Tue, 13 Aug 2019 22:25:17 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id g67so2422484wme.1 for ; Tue, 13 Aug 2019 12:25:17 -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 :mime-version:content-transfer-encoding; bh=5PYSTLLnxNYksJw+lU7VF5SKmQpk8ziybHnxFDyW9xc=; b=RaoXWQCF166UjH8WlcBmJJnaFU5OJEv2ZdaH12S40krEk/uFYN7wKHJzhZO/OgCj4L GxgTRQq+j3rbu67zu3IjRk92WAMJwe33wAvudQP5xSciVYvsfAjZzSV8QwSg2i0bOU8i qi06TFByywIdCq3i5EJcWiXddHNuseJhUKTTEyhQqkrOmmIlzKDLJAnBOJW0kjlGTE/z YaSL096jNy6JG/lODAYpR3Hdu/If8m3OwCUS9yRUABNQ+rvDnjYST2YOuVTo9pY9ZP24 obp50D8Hz3KeFxX7OpazwuIavLCkAVYjrT3erShKILVvOSpvh6MgPTHUFLC5ztXgolQ5 UrsA== 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:mime-version:content-transfer-encoding; bh=5PYSTLLnxNYksJw+lU7VF5SKmQpk8ziybHnxFDyW9xc=; b=Yo/8mg4qkSkfwyCXChT8XCOAaP4O2LQ75kiUVuZycWVMljG/T8/QEJzpkQcjEuamzp 3nrf+29K3aAgaT1riLDULtRYckffxH7pHWgubtsRx1dps1+mnzE+hqt0XiR2WqDm6hFi 3CsV9NE1Pt4virP21pkcBxvy2Wg0bjW5WTv+qjjKdpiXwxBVHue+ACRuyG0CfmC4mkaw koqBBxrTHyh2XiPJ1Q+dIbBMNiLCVpIxDEGDNjwnTMTX5ZFeQONl4XY31gnMobEzIaMf eN4G3Cxz+WWzQDpE6AN1fxUze4TL2LnebQ8Karl2P/q+CnkA2cp/L3262WjLcWti5GdX W3lw== X-Gm-Message-State: APjAAAWY9Vkb6sRDFAEB8dkh8d31zY3dveYmk2W67rrtlw0MbPuHL2AM m4tCxtRyxez29OlOe17Egq2F1aeW X-Google-Smtp-Source: APXvYqwfu5WmTWxApn2a1lk4VvkRTUDGz7Rkj029CP4s/60j1MDX26lw5CJXgKGUEZ6wfa6DkzfiAg== X-Received: by 2002:a7b:c30f:: with SMTP id k15mr4568200wmj.11.1565723914289; Tue, 13 Aug 2019 12:18:34 -0700 (PDT) Received: from LAPTOP.fritz.box (2a0a-a541-facc-0-14b1-f560-107d-37ed.ipv6dyn.netcologne.de. [2a0a:a541:facc:0:14b1:f560:107d:37ed]) by smtp.gmail.com with ESMTPSA id g7sm4390611wmg.8.2019.08.13.12.18.33 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 13 Aug 2019 12:18:33 -0700 (PDT) From: Stanislav Ionascu To: ffmpeg-devel@ffmpeg.org Date: Tue, 13 Aug 2019 21:16:20 +0200 Message-Id: <20190813191620.14480-2-stanislav.ionascu@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190813191620.14480-1-stanislav.ionascu@gmail.com> References: <20190813191620.14480-1-stanislav.ionascu@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/1] avformat/matroska: fully parse stsd atom in v_quicktime tracks 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: Stanislav Ionascu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Per matroska spec, v_quicktime contains the complete stsd atom, after the mandatory size + fourcc. By properly parsing the hvcc sub-atoms of the track, it becomes possible to demux/decode mp4/mov tracks stored as is in matroska containers. Also dvh1 in stsd in matroska is more likely hevc codec than dv. Signed-off-by: Stanislav Ionascu --- libavformat/matroskadec.c | 51 +++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 4e20f15792..88bc89c545 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2473,25 +2473,46 @@ static int matroska_parse_tracks(AVFormatContext *s) } else if (!strcmp(track->codec_id, "V_QUICKTIME") && (track->codec_priv.size >= 21) && (track->codec_priv.data)) { + MOVStreamContext *msc; + MOVContext *mc = NULL; + AVIOContext *stsd_ctx = NULL; + void *priv_data; + int nb_streams; int ret = get_qt_codec(track, &fourcc, &codec_id); if (ret < 0) return ret; - if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) { - fourcc = MKTAG('S','V','Q','3'); - codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc); + av_log(matroska->ctx, AV_LOG_TRACE, + "FourCC found %s.\n", av_fourcc2str(fourcc)); + priv_data = st->priv_data; + nb_streams = s->nb_streams; + mc = av_mallocz(sizeof(*mc)); + if (!mc) + return AVERROR(ENOMEM); + stsd_ctx = avio_alloc_context(track->codec_priv.data, + track->codec_priv.size, + 0, NULL, NULL, NULL, NULL); + if (!stsd_ctx) + return AVERROR(ENOMEM); + mc->fc = s; + st->priv_data = msc = av_mallocz(sizeof(MOVStreamContext)); + if (!msc) { + av_free(mc); + st->priv_data = priv_data; + return AVERROR(ENOMEM); } - if (codec_id == AV_CODEC_ID_NONE) - av_log(matroska->ctx, AV_LOG_ERROR, - "mov FourCC not found %s.\n", av_fourcc2str(fourcc)); - if (track->codec_priv.size >= 86) { - bit_depth = AV_RB16(track->codec_priv.data + 82); - ffio_init_context(&b, track->codec_priv.data, - track->codec_priv.size, - 0, NULL, NULL, NULL, NULL); - if (ff_get_qtpalette(codec_id, &b, track->palette)) { - bit_depth &= 0x1F; - track->has_palette = 1; - } + /* ff_mov_read_stsd_entries updates stream s->nb_streams-1, + * so set it temporarily to indicate which stream to update. */ + s->nb_streams = st->index + 1; + ff_mov_read_stsd_entries(mc, stsd_ctx, 1); + av_free(msc); + av_free(mc); + avio_context_free(&stsd_ctx); + st->priv_data = priv_data; + s->nb_streams = nb_streams; + + // dvh1 in mkv is likely HEVC + if (st->codecpar->codec_tag == MKTAG('d','v','h','1')) { + codec_id = AV_CODEC_ID_HEVC; } } else if (codec_id == AV_CODEC_ID_PCM_S16BE) { switch (track->audio.bitdepth) {