From patchwork Wed Nov 6 02:49:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 16133 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 2F27B44908D for ; Wed, 6 Nov 2019 04:57:21 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 16F2F68B0C5; Wed, 6 Nov 2019 04:57:21 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 55D6468ADB4 for ; Wed, 6 Nov 2019 04:57:15 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id w18so23946936wrt.3 for ; Tue, 05 Nov 2019 18:57:15 -0800 (PST) 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=lZ1AdC0fVHsKWbsjxitLsM5WzNXyN7YDDCZhKzDoByU=; b=KF23j3bI9W/RyyCc0maAjTQ+oMq3AbqmoUjVudOliQwvVHE2rK7unNiguq1a6zfUy+ VoqHR+uKOgx3wEGkZX5N4kcALmGDp1bi6OWxfOycDysHHHgRwx28jDGFO2VRAO/mWQUN uc2rONi9FCdUJByzcqgxKQBsiyr3ccC9rubmaQifiJuTCwIPGdLbqx5kv7HOmlOf6El0 vK1lLwm6zMkqFKoQm/nKqq/9Cw7cv4bUHVlVkNLIH2YmPEIm+oY29jmMTfkpfne4qlBD Len2Qb+wozXO0++tUDsvgH6OH8iKkw/vFmYIK7effpzLTY9H+UtabQ9vlSdtxiCjN+m4 Gdow== 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=lZ1AdC0fVHsKWbsjxitLsM5WzNXyN7YDDCZhKzDoByU=; b=omnImRbrxBfJ+oc50f2OYzF6YGc6toChzdA4q1JvMeFrRjwNaTfsIWUPfw+Bz9Y7ek D2ksOyD7JQGNeUo5rGBjXnP06z7kq17zm7AgkvNWaYlh7oZonU8CEgaJNOUE35/vDVZC R5pgSVb37VzhAMC24Dy4v2qNaopG18CGnaLfOP2kL4mB7PDTqMSYkmidCTpsmFpeyUBj /z/pATDvGrX+r7I8EfDiZbFr0/j6ncpai75V82/90FWt6IQp2eXjVpsPOEm0SGfGwTE5 huvNm1USekxZqqFh8OO2EwFwxL4KOM3+s3g7dGeJxgKk28ZSI/OwgbuTupbEp/ToAGJL voqQ== X-Gm-Message-State: APjAAAVIT0FY1k7s9vH2QIbS9Tx3EiVg1NsepiNY3Uk0WlE/H5BBXsyn 2CL6RYj9wONXyR0qgbZCcxuSQcu1 X-Google-Smtp-Source: APXvYqzSDXOU68gT8NSbpZZDPENaJhk9msnUMsspzbLWCTQkPhHopLzkacZxkaR58MGNwNzaF7MnJA== X-Received: by 2002:a05:6000:1605:: with SMTP id u5mr385256wrb.252.1573008642783; Tue, 05 Nov 2019 18:50:42 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08937.dynamic.kabel-deutschland.de. [188.192.137.55]) by smtp.gmail.com with ESMTPSA id l13sm1281710wmh.12.2019.11.05.18.50.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Nov 2019 18:50:42 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Nov 2019 03:49:03 +0100 Message-Id: <20191106024922.19228-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191106024922.19228-1-andreas.rheinhardt@gmail.com> References: <20191106024922.19228-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/23] avformat/matroskaenc: Remove allocations for attachments 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If there are attachments to write, the Matroska muxer currently allocates two objects: An array that contains an entry for each attachment containing just the stream index of the corresponding stream and the uid used for this attachment; and a structure with a pointer to said array and a counter for said array. These uids are generated via code special to attachments: It uses an AVLFG in the normal and a sha of the attachment data in the bitexact case. (Said sha requires an allocation, too.) But now that an uid is generated for each stream in mkv_init(), there is no need any more to use special code for generating the uids of attachments: One can simply use the uid already generated for the attachment stream. And this makes the whole allocations of the structures for attachments as well as the structures itself superfluous. They have been removed. In case AVFMT_FLAG_BITEXACT is set, the uids will be different from the old ones which is the reason why the FATE-test lavf-mkv_attachment needed to be updated. The old method had the drawback that muxing the same attachment twice in the same file would create a file where two attachments have the same uid. The new one doesn't. Also notice that the dynamic buffer used to write the attachments leaks if an error happens when writing the buffer. By removing the allocations potential sources of errors have been removed. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 63 +++++------------------------------ tests/ref/lavf/mkv_attachment | 4 +-- 2 files changed, 11 insertions(+), 56 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b87d15b7ff..179349690d 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -50,7 +50,6 @@ #include "libavutil/random_seed.h" #include "libavutil/rational.h" #include "libavutil/samplefmt.h" -#include "libavutil/sha.h" #include "libavutil/stereo3d.h" #include "libavcodec/xiph.h" @@ -104,16 +103,6 @@ typedef struct mkv_track { int64_t ts_offset; } mkv_track; -typedef struct mkv_attachment { - int stream_idx; - uint32_t fileuid; -} mkv_attachment; - -typedef struct mkv_attachments { - mkv_attachment *entries; - int num_entries; -} mkv_attachments; - #define MODE_MATROSKAv2 0x01 #define MODE_WEBM 0x02 @@ -140,7 +129,6 @@ typedef struct MatroskaMuxContext { mkv_seekhead *seekhead; mkv_cues *cues; mkv_track *tracks; - mkv_attachments *attachments; AVPacket cur_audio_pkt; @@ -406,10 +394,6 @@ static void mkv_deinit(AVFormatContext *s) av_freep(&mkv->cues->entries); av_freep(&mkv->cues); } - if (mkv->attachments) { - av_freep(&mkv->attachments->entries); - av_freep(&mkv->attachments); - } av_freep(&mkv->tracks); } @@ -1696,14 +1680,17 @@ static int mkv_write_tags(AVFormatContext *s) } if (mkv->have_attachments && mkv->mode != MODE_WEBM) { - for (i = 0; i < mkv->attachments->num_entries; i++) { - mkv_attachment *attachment = &mkv->attachments->entries[i]; - AVStream *st = s->streams[attachment->stream_idx]; + for (i = 0; i < s->nb_streams; i++) { + mkv_track *track = &mkv->tracks[i]; + AVStream *st = s->streams[i]; + + if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT) + continue; if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID)) continue; - ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, attachment->fileuid); + ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, track->uid); if (ret < 0) return ret; } @@ -1722,18 +1709,11 @@ static int mkv_write_attachments(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *dyn_cp, *pb = s->pb; - AVLFG c; int i, ret; if (!mkv->have_attachments) return 0; - mkv->attachments = av_mallocz(sizeof(*mkv->attachments)); - if (!mkv->attachments) - return AVERROR(ENOMEM); - - av_lfg_init(&c, av_get_random_seed()); - ret = mkv_add_seekhead_entry(mkv->seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb)); if (ret < 0) return ret; @@ -1742,20 +1722,14 @@ static int mkv_write_attachments(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; + mkv_track *track = &mkv->tracks[i]; ebml_master attached_file; - mkv_attachment *attachment = mkv->attachments->entries; AVDictionaryEntry *t; const char *mimetype = NULL; - uint32_t fileuid; if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT) continue; - attachment = av_realloc_array(attachment, mkv->attachments->num_entries + 1, sizeof(mkv_attachment)); - if (!attachment) - return AVERROR(ENOMEM); - mkv->attachments->entries = attachment; - attached_file = start_ebml_master(dyn_cp, MATROSKA_ID_ATTACHEDFILE, 0); if (t = av_dict_get(st->metadata, "title", NULL, 0)) @@ -1786,29 +1760,10 @@ static int mkv_write_attachments(AVFormatContext *s) return AVERROR(EINVAL); } - if (s->flags & AVFMT_FLAG_BITEXACT) { - struct AVSHA *sha = av_sha_alloc(); - uint8_t digest[20]; - if (!sha) - return AVERROR(ENOMEM); - av_sha_init(sha, 160); - av_sha_update(sha, st->codecpar->extradata, st->codecpar->extradata_size); - av_sha_final(sha, digest); - av_free(sha); - fileuid = AV_RL32(digest); - } else { - fileuid = av_lfg_get(&c); - } - av_log(s, AV_LOG_VERBOSE, "Using %.8"PRIx32" for attachment %d\n", - fileuid, mkv->attachments->num_entries); - put_ebml_string(dyn_cp, MATROSKA_ID_FILEMIMETYPE, mimetype); put_ebml_binary(dyn_cp, MATROSKA_ID_FILEDATA, st->codecpar->extradata, st->codecpar->extradata_size); - put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, fileuid); + put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, track->uid); end_ebml_master(dyn_cp, attached_file); - - mkv->attachments->entries[mkv->attachments->num_entries].stream_idx = i; - mkv->attachments->entries[mkv->attachments->num_entries++].fileuid = fileuid; } end_ebml_master_crc32(pb, &dyn_cp, mkv); diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index 230dff369a..790c0f693b 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -4a25c53150c09537cd4fcbff8f8f14ff *tests/data/lavf/lavf.mkv_attachment -472706 tests/data/lavf/lavf.mkv_attachment +f54cf193e1925eff8a44554116a5e149 *tests/data/lavf/lavf.mkv_attachment +472703 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68