From patchwork Thu May 21 12:15:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 19793 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 7910C449D3D for ; Thu, 21 May 2020 15:15:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5095A689256; Thu, 21 May 2020 15:15:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 20B1D680A7C for ; Thu, 21 May 2020 15:15:16 +0300 (EEST) Received: by mail-lj1-f179.google.com with SMTP id c11so5806485ljn.2 for ; Thu, 21 May 2020 05:15:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id; bh=z8WH+uMh2CDobwV70HzaT9LR2kCj1oy6/pH4iJJ0JkU=; b=gV/dFVRsWlUSwG66dVqlSOz4Izvc4XfJLENx8UJa8uoq6kXhZLzD5tQgHprrUrbHug Waw4Yxc2BMUn0YJlkKl0mqqcK3b5oGJDXEhxQquEIsLJkLrDlRCqUww5k6tflzxHxn2g qzALYL/NWmMLc/0yh0zdtw+bkbuIsmVUPsrU6Mr9cwRwGve23nlMeP3qRoJpqNQUNFpx eXtNFH7DI8PSft5467nNFu/7xcCC1+C+IVkNIzvkLgr+iSLJZEWOxHyPKTba5XYs0nPM 4PfFkcMtSw1ch2LQxAVMdva0NHZjzjz4/A63ShCqNmTC9kwI5P0XXc/nQ82i/P+D+Kx1 ybKQ== 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; bh=z8WH+uMh2CDobwV70HzaT9LR2kCj1oy6/pH4iJJ0JkU=; b=NVCD9GXBdDhZhqevOkNV0mdjwrPkhR1psVpFoMKQQ/EcpGPu2qegCU7L9ULSt8Sr27 B0SepspskN1s0mZBnSgsbWD0tYP6cfVA6SdkjyeGwurpeMEvwrDt9D2k/UTiI07pGimp ZEajIT0tc+Dny5PmwYUgZXWBssV42qPT4yaMjLm+26ttIcRkMnc3uWiV7SMEqwiPoVNH JkjJQRXYJ13fz9bHTqvYWalPnArM52pEMSNp5cQA0UmSed7nqAngg8CV5W5lBpDVDpgo CXufUFZLnYK5XnLSGNmEykuhtwldfVk1F0WNTEG0oaraTvkmS5xhIERALS9FS4mS8JZ7 uLSw== X-Gm-Message-State: AOAM533hKn1FpqpZsvCwRYPRXnsbKgvCrt8r+dPTFbUmm+d4cS2aJeCo kWqwHiuaCDIh7AmJA72W1qdukMSSUAw= X-Google-Smtp-Source: ABdhPJyCpRiFFkA5fZyYi3ejnoUe4sePOmjToeOzRaWlCEgKkao7UyAjAtgr6a0EeNliHO5bJLVMcQ== X-Received: by 2002:a2e:b3cd:: with SMTP id j13mr5046791lje.237.1590063314894; Thu, 21 May 2020 05:15:14 -0700 (PDT) Received: from localhost.localdomain (dsl-tkubng21-58c01c-243.dhcp.inet.fi. [88.192.28.243]) by smtp.gmail.com with ESMTPSA id y28sm1707478ljn.4.2020.05.21.05.15.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 May 2020 05:15:14 -0700 (PDT) From: =?utf-8?q?Martin_Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Thu, 21 May 2020 15:15:13 +0300 Message-Id: <20200521121513.5221-1-martin@martin.st> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v2] movenc: Fix conversion of the first frame for extradata-less H264/HEVC 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Move the copying of the frame to vos_data further up in the function, so that when writing the actual frame data for the first frame, it's clear that the stream really is in annex b format, for the cases where we create extradata from the first frame. Alternatively - we could invert the checks for bitstream format. If extradata is missing, we can't pretend that the bitstream is in mp4 form, because we can't even know the NAL unit length prefix size in that case. Also avoid creating extradata for AVC intra. If the track tag is an AVC intra tag, don't copy the frame into vos_data - this matches other existing cases of how vos_data and TAG_IS_AVCI interact in other places. --- libavformat/movenc.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 4560064add..2e164a106f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -5504,6 +5504,25 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) memset(trk->vos_data + trk->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE); } + if ((par->codec_id == AV_CODEC_ID_DNXHD || + par->codec_id == AV_CODEC_ID_H264 || + par->codec_id == AV_CODEC_ID_HEVC || + par->codec_id == AV_CODEC_ID_TRUEHD || + par->codec_id == AV_CODEC_ID_AC3 || + par->codec_id == AV_CODEC_ID_H264 || + par->codec_id == AV_CODEC_ID_HEVC) && !trk->vos_len && + !TAG_IS_AVCI(trk->tag)) { + /* copy frame to create needed atoms */ + trk->vos_len = size; + trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!trk->vos_data) { + ret = AVERROR(ENOMEM); + goto err; + } + memcpy(trk->vos_data, pkt->data, size); + memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); + } + if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { if (!s->streams[pkt->stream_index]->nb_frames) { @@ -5582,24 +5601,6 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) } } - if ((par->codec_id == AV_CODEC_ID_DNXHD || - par->codec_id == AV_CODEC_ID_H264 || - par->codec_id == AV_CODEC_ID_HEVC || - par->codec_id == AV_CODEC_ID_TRUEHD || - par->codec_id == AV_CODEC_ID_AC3 || - par->codec_id == AV_CODEC_ID_H264 || - par->codec_id == AV_CODEC_ID_HEVC) && !trk->vos_len) { - /* copy frame to create needed atoms */ - trk->vos_len = size; - trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE); - if (!trk->vos_data) { - ret = AVERROR(ENOMEM); - goto err; - } - memcpy(trk->vos_data, pkt->data, size); - memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); - } - if (trk->entry >= trk->cluster_capacity) { unsigned new_capacity = trk->entry + MOV_INDEX_CLUSTER_SIZE; if (av_reallocp_array(&trk->cluster, new_capacity,