From patchwork Wed Nov 2 19:58:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 1262 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp443909vsb; Wed, 2 Nov 2016 12:59:39 -0700 (PDT) X-Received: by 10.194.115.135 with SMTP id jo7mr4340951wjb.21.1478116779200; Wed, 02 Nov 2016 12:59:39 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a78si39512118wme.106.2016.11.02.12.59.38; Wed, 02 Nov 2016 12:59:39 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8FBA6689ACB; Wed, 2 Nov 2016 21:59:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vk0-f68.google.com (mail-vk0-f68.google.com [209.85.213.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5DE4E689259 for ; Wed, 2 Nov 2016 21:59:25 +0200 (EET) Received: by mail-vk0-f68.google.com with SMTP id d65so1063496vkg.0 for ; Wed, 02 Nov 2016 12:59:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=+CuoVFY15IaYQc0bNUhTFZvge674hbIGRLx9bfm2H80=; b=ZS4XJmohcvCsiesvKw1yoz8VhpXqqXQtGNOqskchXnKi7oTg6+mEIfJAK8bt1N+xmJ 07sFO1im6Sjeylzt6OXDLYoxou6yW483xtUzAgeg5f+ujvU5ZWbfWDtmoF5OpKUy0EYg azCdwbBVFx7KV9fm71Q7HsHNxr5ttyDcHfD5sN9zstZ6ArA74Y4yu0gFi4AWtkb1csLA 48KIiQc7CMPdEbi59F972VEZ2ziJwnj7qdcKmcejadVBN1Ywe3+nWKxSPsHweW6PMQeV wvQFXKv1MK2brdITb5W/6g2ciXXqC0hcAMLCm0YKqkkBdIJiHPFOaobESoOiZBe8IjG2 JrbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=+CuoVFY15IaYQc0bNUhTFZvge674hbIGRLx9bfm2H80=; b=eOwVlLGCz2xKv1VR27rRUCsyqKB9tU9/VtsEIuO5LR12UbUDzfDJayIwolKflcsPWc j5Gvj8zT+7J1zdQYMu/PXnWj1iKrnrnCLeAVbDHrbW66y7nusbEnNA7spWVSBdIQ65ny j+33hr2qGAH5MJ9G+VDMdhW1e6MhAjzEGgQ7s88iceWqlnhvw1JDWhRRATM5VYt8PzMz GFKPO6hGJv4Wtoe6QN0NohIkDrcnMvOe7LC1EBxMIkfZ9O3EB6/1UqGqyzbjOeDPy4vi 1+2dEcGZaWptAxY4o7wMNouBTu/I+zzRG0kjvV2Wd2XYNwBJCxrXiRrZ5HYFgHnJ5qUB 1sjQ== X-Gm-Message-State: ABUngvcUUKLmsymvs6biY+MWRMpXc/TUexjuTZAyfDeATUGeM7+U4UW8vMgnjpnI6cg6RA== X-Received: by 10.31.115.198 with SMTP id o189mr4429567vkc.2.1478116767128; Wed, 02 Nov 2016 12:59:27 -0700 (PDT) Received: from localhost.localdomain ([181.22.28.129]) by smtp.gmail.com with ESMTPSA id 23sm839705uav.9.2016.11.02.12.59.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Nov 2016 12:59:26 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Nov 2016 16:58:56 -0300 Message-Id: <20161102195857.1664-1-jamrial@gmail.com> X-Mailer: git-send-email 2.10.1 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/matroskaenc: postpone writing the Tracks master 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" This will allow us to write updated stream information not available during write_header(). Signed-off-by: James Almer --- libavformat/matroskaenc.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 78540fb..f41aabe 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -121,6 +121,8 @@ typedef struct MatroskaMuxContext { ebml_master tags; AVIOContext *info_bc; ebml_master info; + AVIOContext *tracks_bc; + ebml_master tracks_master; ebml_master segment; int64_t segment_offset; ebml_master cluster; @@ -1264,15 +1266,14 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, static int mkv_write_tracks(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *dyn_cp, *pb = s->pb; - ebml_master tracks; + AVIOContext *pb = s->pb; int i, ret, default_stream_exists = 0; ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb)); if (ret < 0) return ret; - ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &tracks, MATROSKA_ID_TRACKS, 0); + ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, &mkv->tracks_master, MATROSKA_ID_TRACKS, 0); if (ret < 0) return ret; @@ -1281,11 +1282,16 @@ static int mkv_write_tracks(AVFormatContext *s) default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT; } for (i = 0; i < s->nb_streams; i++) { - ret = mkv_write_track(s, mkv, i, dyn_cp, default_stream_exists); + ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, default_stream_exists); if (ret < 0) return ret; } - end_ebml_master_crc32(pb, &dyn_cp, mkv, tracks); + + if (pb->seekable && !mkv->is_live) + put_ebml_void(pb, avio_tell(mkv->tracks_bc)); + else + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master); + return 0; } @@ -2317,6 +2323,10 @@ static int mkv_write_trailer(AVFormatContext *s) avio_seek(pb, mkv->info.pos, SEEK_SET); end_ebml_master_crc32(pb, &mkv->info_bc, mkv, mkv->info); + // dump tracks master + avio_seek(pb, mkv->tracks_master.pos, SEEK_SET); + end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master); + // update stream durations if (!mkv->is_live && mkv->stream_durations) { int i;