From patchwork Fri Jun 26 12:58:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 20626 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 11FC344B6B5 for ; Fri, 26 Jun 2020 16:05:10 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E0A2068AA80; Fri, 26 Jun 2020 16:05:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5A98D68A43F for ; Fri, 26 Jun 2020 16:05:04 +0300 (EEST) Received: by mail-wm1-f41.google.com with SMTP id o8so8765204wmh.4 for ; Fri, 26 Jun 2020 06:05:04 -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=OeEx/44jD/6L+6BwKYeOgmOx9ZwLPV7N5sXntEKuwEA=; b=d1u0Sdv/ZTOfonCJSAwyEKGvNB1VeaZu3AlWXHNkX8AzTMy6/zqckIxvfZLZ3k5BKZ NtN5P+R6iA+6savFaiYRNFkxCkd5C5vSC270G7DNpYR+W12PMG4trYyMXkpTh6+Any1x l163mCDpzUK39EMZ+FXARf8a4SD4BvaQkxRO91aJYvN+m/fjcIEKYYhKTdJ0DV7/vFwD 2D69HHyVOUOX4m5j6J72mAS7SoySMTQcPXjr1vWBjqIFCBzWlqgUuKRiwwplU5N8e9+k F7Ydw3P41B1j7e2YrEqwxL2WwHr0n2MpO6RvgIbyUtjPieauOLQ20mL8N3xjZTKTJjR6 xrww== 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=OeEx/44jD/6L+6BwKYeOgmOx9ZwLPV7N5sXntEKuwEA=; b=bsWXuztgwuTcaSDLHPo6kdoiuj4LOd9dI5Dv9v/zkXeLAupR4sI6W+K2SJ2Jtrp3rF o8YAYmyjXJTA8ibQz+qkB1D03HrDYxmZQl7pNs18Heh1avVti+j1tsGXQzXYWSZQe6TV OR+L5JHqzYBGvLxsMcrmYrHwwyCswIvyF5ykYGlayonfyYq4T9b9z1r7uiIjBxb4zPTi qiVAiTtsdqJljJ41vOpKdQHYOKG1dcltvB3rQGg16QMvS3Y4Bupm+At3ffUb6wB2hPP6 gBf84ykRCjrGkXOyoKWNnpJ3vaD/GR8sY15DYAQS1NOvf5OWv+jRfuBTq1lnvM8hVeQ7 QdKg== X-Gm-Message-State: AOAM5330iNPQm9/hGOq7K1zQ2QlL4HTUYxGYinJkjLqWmXSh17NRzNg5 jG1KZbE6X9zPMUvB1w53mcXA0gqX X-Google-Smtp-Source: ABdhPJxu8T3yEbeJgpSgl8JLye9htjNUHRDpOdCAqaq0TFxp9afsC+xcxkXpm9NdpiM8zAnw0NCP0g== X-Received: by 2002:a1c:2157:: with SMTP id h84mr3274052wmh.35.1593176293545; Fri, 26 Jun 2020 05:58:13 -0700 (PDT) Received: from localhost.localdomain ([82.129.83.65]) by smtp.gmail.com with ESMTPSA id r1sm28007730wrt.73.2020.06.26.05.58.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2020 05:58:12 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Fri, 26 Jun 2020 13:58:02 +0100 Message-Id: <20200626125802.526306-1-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.27.0.rc2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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 --- It is still weird to me that we prefer all of our internal code to use ffio_free_dyn_buf but don't allow actual public API users to use this functionality. --- libavformat/movenc.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index b8e45760ee..7db2e28840 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4798,28 +4798,40 @@ 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_get_dyn_buf(mfra_pb, &buf); + avio_write(pb, buf, ret); + ffio_free_dyn_buf(&mfra_pb); + + return sz; } static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov) @@ -6987,7 +6999,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; } }