From patchwork Tue Jun 23 15:38:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 20566 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 E2EDD44A929 for ; Tue, 23 Jun 2020 18:45:00 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BF8C368B0BE; Tue, 23 Jun 2020 18:45:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5DA7F68A295 for ; Tue, 23 Jun 2020 18:44:54 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id g18so12004628wrm.2 for ; Tue, 23 Jun 2020 08:44:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=Pg7zg4BftEuaNcSYSUoMR+5PLutECAq6qiEyjbBzTEk=; b=E+8DiW9qVZAN2s5fS0b7Zgan91e15MeEApSla478VFkfNEoU+ZpxTJRrQLZl73sgSG WMZ/nISatMUV4ioV3jFG9iD8yHa2PtW9qAwaVi88wTgQ8EDvfqg9nCHdb/4T0oLichWp cbbeeoI4lyUa5l7YE0OCe9IeqpuQ/YLuibZQXU7l9lcIUMWJkll4gu5hG8NTcXBb+lZy 4WMAyy2LTIj/42+MVTxpi8Vh3aiM17CPao1ePvLuTH8dyDtm9Q8l3yT9WbHdoV4QhSAy Zl3bJoJPVc1Sma6v830y1iNloZaUAEf5l9HFDb5YIwRoTlpy3MKuiZnUcBC8P6sn56k4 AxNA== 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:mime-version :content-transfer-encoding; bh=Pg7zg4BftEuaNcSYSUoMR+5PLutECAq6qiEyjbBzTEk=; b=cBPk9VG+qiKfNkZkeXZ1N3RGRpZ1Z0kbHcFKBjBt8kAjr2WDavPmew53xuw9lrxWHI oKz05Ztb4qR8l0o67oV3vDTgWU3QZNgYjiEL/x2Y+f7UnFrO+jkd+jZtC17aSliXwgF8 BYTrzCTB3oih65+FHQciI1ZgoQ9q6Jzwszr1HsOuEpBRkXbj9LM3L4k8N/xj4Vyk5yC4 69t8w/r/yawo7jAeoxURWBL8L1zzF4lQW7SpUZCqGtf5lzJDOYpaa1a4Tcl5ggSBZJ5Q j6A3lUFJm6oCiOU98sO0DN5hHsns+n/w8/V5r1W+cvfwWIeo7o8VZCO6ojKkORlg4ojK 5b/w== X-Gm-Message-State: AOAM5329r/iWlAXrVaX871rhdEiptT4FKTFC0wl4MQm59vrhfhalvWnw z7mJhY432NO7o4ic0OVWA3sJPOBp X-Google-Smtp-Source: ABdhPJxV2JTW9zFWFJkl1V211rb9/j969suvVwAEtXk2rPOOWG0DDWH01gwg07SV0Y1YXQUgSTLbWg== X-Received: by 2002:adf:c6c5:: with SMTP id c5mr24872509wrh.13.1592926738879; Tue, 23 Jun 2020 08:38:58 -0700 (PDT) Received: from localhost.localdomain ([82.129.83.65]) by smtp.gmail.com with ESMTPSA id j5sm23002766wrm.57.2020.06.23.08.38.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Jun 2020 08:38:58 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jun 2020 16:38:48 +0100 Message-Id: <20200623153848.409575-1-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.27.0.rc2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavf/movenc: Use a dynamic buffer when writing the mfra box 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" When doing streamed output, with e.g. +dash, if the mfra box ended up being larger than the AVIOContext write buffer, the (unchecked) seeking back to update the box size would silently fail and produce an invalid mfra box. This is similar to how other boxes are written in fragmented mode. Signed-off-by: Derek Buitenhuis --- libavformat/movenc.c | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index b8e45760ee..2927865cb4 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4798,28 +4798,42 @@ static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track) static int mov_write_mfra_tag(AVIOContext *pb, MOVMuxContext *mov) { - int64_t pos = avio_tell(pb); - int i; + AVIOContext *mfra_pb; + int i, ret, sz; + uint8_t *buf; - avio_wb32(pb, 0); /* size placeholder */ - ffio_wfourcc(pb, "mfra"); + ret = avio_open_dyn_buf(&mfra_pb); + if (ret < 0) + return ret; + + avio_wb32(mfra_pb, 0); /* size placeholder */ + ffio_wfourcc(mfra_pb, "mfra"); /* An empty mfra atom is enough to indicate to the publishing point that * the stream has ended. */ if (mov->flags & FF_MOV_FLAG_ISML) - return update_size(pb, pos); + goto done_mfra; for (i = 0; i < mov->nb_streams; i++) { MOVTrack *track = &mov->tracks[i]; if (track->nb_frag_info) - mov_write_tfra_tag(pb, track); + mov_write_tfra_tag(mfra_pb, track); } - avio_wb32(pb, 16); - ffio_wfourcc(pb, "mfro"); - avio_wb32(pb, 0); /* version + flags */ - avio_wb32(pb, avio_tell(pb) + 4 - pos); + avio_wb32(mfra_pb, 16); + ffio_wfourcc(mfra_pb, "mfro"); + avio_wb32(mfra_pb, 0); /* version + flags */ + avio_wb32(mfra_pb, avio_tell(mfra_pb) + 4); - return update_size(pb, pos); +done_mfra: + + sz = update_size(mfra_pb, 0); + ret = avio_close_dyn_buf(mfra_pb, &buf); + if (ret < 0) + return ret; + avio_write(pb, buf, ret); + av_free(buf); + + return sz; } static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov) @@ -6987,7 +7001,9 @@ static int mov_write_trailer(AVFormatContext *s) } if (!(mov->flags & FF_MOV_FLAG_SKIP_TRAILER)) { avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER); - mov_write_mfra_tag(pb, mov); + res = mov_write_mfra_tag(pb, mov); + if (res < 0) + return res; } }