From patchwork Wed Oct 16 02:00:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 15783 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 9C9F544A260 for ; Wed, 16 Oct 2019 05:01:10 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7CE7E68A3ED; Wed, 16 Oct 2019 05:01:10 +0300 (EEST) 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 1435D68A3D3 for ; Wed, 16 Oct 2019 05:01:04 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id o18so25951560wrv.13 for ; Tue, 15 Oct 2019 19:01:04 -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=X+OSJ9cqsyHJHPMA/h/ciXqGPJKIdzYLKFJVBynP9x8=; b=Ey8Yd3vpfhHrp1mMLVg/sc5py7P2bd/tuVV1daNIWC0qBlhR2OnV2vGdF74usl4Ppm FJeYNJhPa9fDxRxDRXco+EQ8vQZTMG9T7HtaNU/yHTeo2LPWVXs2vxz6P59jgjOt/BGQ AbBqkdvE/4rX46/Na7Ey+u6nwcvjvfKB0aunSk+oRi77RPs7sqeTKq6cVyNU6iIX5nU7 x6/DbEqtMYawzVJZ6vJ6s2hMwRvCK4DcJrb+XPgr5F0SN8GWuRpcXSLqj+/sozsucugg lxeQd/ZEyDft/66pwt80cFpPbhPAKFvELvSQrpuG9l0KZZVMzjAPtL6Q+02KvJhb/+0Z zZtQ== 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=X+OSJ9cqsyHJHPMA/h/ciXqGPJKIdzYLKFJVBynP9x8=; b=Xmmzhx7gkdSpIARa5EyW2obkizXjHhzx5q7kIm+k0Ij42y3xKPBh2jcy/obA+A2h6F Iv+Hk/D8bjXV9eJDlp7Jd5yppI1pt995CEBC8Ek80I0RemEuHYgL4ZyxpthLK6oJhg7X B36OfcMengu332ZipSV3r+N4OClq0MNNW96gwqKuZtNTT2EWHDTANMDFdJ42pCoH5jb3 w0s+lLiMRVRLA1Jnmn4B5En29OPczCNuiYerTRxxDfpAwgaLfKOwPlIUuA92HpQL9Kjh xIfmWf86apJJi/KKKlQzyWiF1WvDbUzD+T37oFpGExm/BactwxpylRtSoZyNmyI4Sb1E SeUQ== X-Gm-Message-State: APjAAAWZFPeAffUbs53XFIF+M5LueZOR944mfz8XRxWA51XQHK5/41B1 dhVYswYaTBOdRRYYj4tScErNtepL X-Google-Smtp-Source: APXvYqz7Fdaelv9FdqG3aM8kqSk+El4Ufa6sBooKRvE3B0ghv3dBNGX+BRa0Iic2KovcKaEuxXECoA== X-Received: by 2002:a05:6000:12cd:: with SMTP id l13mr310516wrx.181.1571191263336; Tue, 15 Oct 2019 19:01:03 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc08937.dynamic.kabel-deutschland.de. [188.192.137.55]) by smtp.gmail.com with ESMTPSA id q15sm45730827wrg.65.2019.10.15.19.01.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 19:01:02 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 16 Oct 2019 04:00:56 +0200 Message-Id: <20191016020056.19301-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015111737.14246-2-andreas.rheinhardt@gmail.com> References: <20191015111737.14246-2-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avformat/matroskaenc: Move track-related fields to mkv_track 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" Signed-off-by: Andreas Rheinhardt --- Resending because of a merge conflict with version 2 of the memleak patch I just sent. libavformat/matroskaenc.c | 41 ++++++++++++++------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b924a64b03..39c4171c05 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -96,6 +96,9 @@ typedef struct mkv_track { int has_cue; int sample_rate; int64_t sample_rate_offset; + int64_t last_timestamp; + int64_t duration; + int64_t duration_offset; int64_t codecpriv_offset; int64_t ts_offset; } mkv_track; @@ -155,11 +158,6 @@ typedef struct MatroskaMuxContext { uint32_t chapter_id_offset; int wrote_chapters; - int64_t last_track_timestamp[MAX_TRACKS]; - - int64_t *stream_durations; - int64_t *stream_duration_offsets; - int allow_raw_vfw; } MatroskaMuxContext; @@ -410,8 +408,6 @@ static void mkv_deinit(AVFormatContext *s) av_freep(&mkv->attachments); } av_freep(&mkv->tracks); - av_freep(&mkv->stream_durations); - av_freep(&mkv->stream_duration_offsets); } /** @@ -1670,7 +1666,7 @@ static int mkv_write_tags(AVFormatContext *s) tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0); put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION"); - mkv->stream_duration_offsets[i] = avio_tell(pb); + mkv->tracks[i].duration_offset = avio_tell(pb); // Reserve space to write duration as a 20-byte string. // 2 (ebml id) + 1 (data size) + 20 (data) @@ -1957,13 +1953,6 @@ static int mkv_write_header(AVFormatContext *s) end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv); pb = s->pb; - // initialize stream_duration fields - mkv->stream_durations = av_mallocz(s->nb_streams * sizeof(int64_t)); - mkv->stream_duration_offsets = av_mallocz(s->nb_streams * sizeof(int64_t)); - if (!mkv->stream_durations || !mkv->stream_duration_offsets) { - return AVERROR(ENOMEM); - } - ret = mkv_write_tracks(s); if (ret < 0) return ret; @@ -2096,6 +2085,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, { MatroskaMuxContext *mkv = s->priv_data; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; + mkv_track *track = &mkv->tracks[pkt->stream_index]; uint8_t *data = NULL, *side_data = NULL; int offset = 0, size = pkt->size, side_data_size = 0; int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; @@ -2174,10 +2164,9 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, av_free(data); if (blockid == MATROSKA_ID_BLOCK && !keyframe) { - put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, - mkv->last_track_timestamp[track_number - 1]); + put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp); } - mkv->last_track_timestamp[track_number - 1] = ts - mkv->cluster_pts; + track->last_timestamp = ts - mkv->cluster_pts; if (discard_padding) { put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding); @@ -2367,6 +2356,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb = s->pb; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; + mkv_track *track = &mkv->tracks[pkt->stream_index]; int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); int duration = pkt->duration; int ret; @@ -2437,9 +2427,7 @@ FF_ENABLE_DEPRECATION_WARNINGS mkv->duration = FFMAX(mkv->duration, ts + duration); - if (mkv->stream_durations) - mkv->stream_durations[pkt->stream_index] = - FFMAX(mkv->stream_durations[pkt->stream_index], ts + duration); + track->duration = FFMAX(track->duration, ts + duration); return 0; } @@ -2613,20 +2601,21 @@ static int mkv_write_trailer(AVFormatContext *s) end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv); // update stream durations - if (!mkv->is_live && mkv->stream_durations) { + if (!mkv->is_live) { int i; int64_t curr = avio_tell(mkv->tags_bc); for (i = 0; i < s->nb_streams; ++i) { AVStream *st = s->streams[i]; + mkv_track *track = &mkv->tracks[i]; - if (mkv->stream_duration_offsets[i] > 0) { - double duration_sec = mkv->stream_durations[i] * av_q2d(st->time_base); + if (track->duration_offset > 0) { + double duration_sec = track->duration * av_q2d(st->time_base); char duration_string[20] = ""; av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i, - mkv->stream_durations[i]); + track->duration); - avio_seek(mkv->tags_bc, mkv->stream_duration_offsets[i], SEEK_SET); + avio_seek(mkv->tags_bc, track->duration_offset, SEEK_SET); snprintf(duration_string, 20, "%02d:%02d:%012.9f", (int) duration_sec / 3600, ((int) duration_sec / 60) % 60,