From patchwork Mon Oct 3 23:36:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 851 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.66 with SMTP id o63csp1858989vsd; Mon, 3 Oct 2016 16:39:51 -0700 (PDT) X-Received: by 10.194.200.6 with SMTP id jo6mr503192wjc.77.1475537991785; Mon, 03 Oct 2016 16:39:51 -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 ud2si895549wjc.0.2016.10.03.16.39.51; Mon, 03 Oct 2016 16:39:51 -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 B572C689C0C; Tue, 4 Oct 2016 02:39:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi0-f66.google.com (mail-oi0-f66.google.com [209.85.218.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 134436897D6 for ; Tue, 4 Oct 2016 02:39:10 +0300 (EEST) Received: by mail-oi0-f66.google.com with SMTP id h186so8359124oia.3 for ; Mon, 03 Oct 2016 16:39:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=yw1j55zwyO3gIAgZjGLzNUMTRsmLdbO9rvTQivd+K+0=; b=weF+x+j0nvEgNYLVp8Pe9ZXhJRMf9qKGYvNi1COResuf0wKqw3aKwQ0NTePc4JDxYg hUsLFRM4GwnI5z1pZroP0QmbBtNHHjgL58BdVD8VFnbqoVVo6RUw0xdNcapJrB9ykAUP JmtBBwK5KGD+70ER1WZ1RmAZf2tM7ziwrxiCIGOPwfqS0vZ2V4CFeUDPI9WMdWCYkfdZ viDLP+/tr5JY2Khll8GRlLDnLrVgXTlS+iUcCaF2a9L4DZlAdva3/UQg9k5J/BlRagMj Dtq4iNmi5tpy2MwR1U2TROso+Za63l9KVJG3rTlaZ0GJKMb8Zr7/uSmibBN+htWcsSgz dYQA== 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:in-reply-to :references; bh=yw1j55zwyO3gIAgZjGLzNUMTRsmLdbO9rvTQivd+K+0=; b=KQ8YHkbQ1RO45g2+P5E/Y1tlYNU8WGsx8eFj52Tw6vyw3oHDioc4GQinbNA1VoEFJA 0Uu9nog7oy9Y/2eU8+8s71nEJqpIFmKkuYU14R+bclMl1VDpI0NEv5QaWLLAmcpuLfEy VHNJQM3AqVlqAUFjSdjSteSrlUMhe2Nc6/vB4Zw+9wjLgt6Vk6SbXADVsnsYVeZXXQoj cZhuBgG5o/gVyrjkrzyve3fF515bPFKFI3elwlTlkW50ryJclTq+K3gKDGbECrIznrBS aXNkSbpBec5OP+PTGYO4UafX78wcCkxNk/BTPzOBu2lzJa5ymkIUx42CWbgIV+rn8xdk oHAw== X-Gm-Message-State: AA6/9Rl4znQcdUioSO2R+tvRfuZmgW87yfHjEogDrG8d8LnzYnJ5J6W5Ab7iFI9WmTvwug== X-Received: by 10.157.40.23 with SMTP id m23mr430989otb.48.1475537963201; Mon, 03 Oct 2016 16:39:23 -0700 (PDT) Received: from localhost.localdomain ([181.22.58.118]) by smtp.gmail.com with ESMTPSA id m66sm183582oia.25.2016.10.03.16.39.21 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Oct 2016 16:39:22 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 3 Oct 2016 20:36:59 -0300 Message-Id: <20161003233707.3624-4-jamrial@gmail.com> X-Mailer: git-send-email 2.9.1 In-Reply-To: <20161003233707.3624-1-jamrial@gmail.com> References: <20161003233707.3624-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 03/11] avformat/matroskaenc: always use a dynamic buffer when writting clusters 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" Signed-off-by: James Almer --- libavformat/matroskaenc.c | 55 ++++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 501bab2..2f56d61 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1914,9 +1914,6 @@ static void mkv_flush_dynbuf(AVFormatContext *s) int bufsize; uint8_t *dyn_buf; - if (!mkv->dyn_bc) - return; - bufsize = avio_close_dyn_buf(mkv->dyn_bc, &dyn_buf); avio_write(s->pb, dyn_buf, bufsize); av_free(dyn_buf); @@ -1926,14 +1923,11 @@ static void mkv_flush_dynbuf(AVFormatContext *s) static void mkv_start_new_cluster(AVFormatContext *s, AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *pb; - - if (s->pb->seekable) { - pb = s->pb; - } else { - pb = mkv->dyn_bc; - } + AVIOContext *pb = mkv->dyn_bc; + end_ebml_master(pb, mkv->cluster); + mkv->cluster_pos = -1; + mkv_flush_dynbuf(s); if (s->pb->seekable) av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 " bytes, " @@ -1943,10 +1937,6 @@ static void mkv_start_new_cluster(AVFormatContext *s, AVPacket *pkt) av_log(s, AV_LOG_DEBUG, "Starting new cluster, " "pts %" PRIu64 "dts %" PRIu64 "\n", pkt->pts, pkt->dts); - end_ebml_master(pb, mkv->cluster); - mkv->cluster_pos = -1; - if (mkv->dyn_bc) - mkv_flush_dynbuf(s); avio_flush(s->pb); } @@ -1976,16 +1966,14 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ } } - if (!s->pb->seekable) { - if (!mkv->dyn_bc) { - ret = avio_open_dyn_buf(&mkv->dyn_bc); - if (ret < 0) { - av_log(s, AV_LOG_ERROR, "Failed to open dynamic buffer\n"); - return ret; - } + if (!mkv->dyn_bc) { + ret = avio_open_dyn_buf(&mkv->dyn_bc); + if (ret < 0) { + av_log(s, AV_LOG_ERROR, "Failed to open dynamic buffer\n"); + return ret; } - pb = mkv->dyn_bc; } + pb = mkv->dyn_bc; if (mkv->cluster_pos == -1) { mkv->cluster_pos = avio_tell(s->pb); @@ -1994,7 +1982,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ mkv->cluster_pts = FFMAX(0, ts); } - relative_packet_pos = avio_tell(s->pb) - mkv->cluster.pos; + relative_packet_pos = avio_tell(pb) - mkv->cluster.pos; if (par->codec_type != AVMEDIA_TYPE_SUBTITLE) { mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); @@ -2058,11 +2046,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or // after 4k and on a keyframe - if (s->pb->seekable) { - cluster_size = avio_tell(s->pb) - mkv->cluster_pos; - } else { - cluster_size = avio_tell(mkv->dyn_bc); - } + cluster_size = avio_tell(mkv->dyn_bc); if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) { // WebM DASH specification states that the first block of every cluster @@ -2118,23 +2102,18 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt) { MatroskaMuxContext *mkv = s->priv_data; - AVIOContext *pb; - if (s->pb->seekable) - pb = s->pb; - else - pb = mkv->dyn_bc; + AVIOContext *pb = mkv->dyn_bc; if (!pkt) { if (mkv->cluster_pos != -1) { + end_ebml_master(pb, mkv->cluster); + mkv->cluster_pos = -1; + mkv_flush_dynbuf(s); if (s->pb->seekable) av_log(s, AV_LOG_DEBUG, "Flushing cluster at offset %" PRIu64 " bytes\n", avio_tell(s->pb)); else av_log(s, AV_LOG_DEBUG, "Flushing cluster\n"); - end_ebml_master(pb, mkv->cluster); - mkv->cluster_pos = -1; - if (mkv->dyn_bc) - mkv_flush_dynbuf(s); avio_flush(s->pb); } return 1; @@ -2163,8 +2142,6 @@ static int mkv_write_trailer(AVFormatContext *s) if (mkv->dyn_bc) { end_ebml_master(mkv->dyn_bc, mkv->cluster); mkv_flush_dynbuf(s); - } else if (mkv->cluster_pos != -1) { - end_ebml_master(pb, mkv->cluster); } if (mkv->mode != MODE_WEBM) {