From patchwork Thu Apr 30 19:57:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 19407 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 3848D44A6AC for ; Thu, 30 Apr 2020 22:57:53 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 16A3468C4E9; Thu, 30 Apr 2020 22:57:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f67.google.com (mail-qv1-f67.google.com [209.85.219.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B291F68C3D0 for ; Thu, 30 Apr 2020 22:57:46 +0300 (EEST) Received: by mail-qv1-f67.google.com with SMTP id y19so3698340qvv.4 for ; Thu, 30 Apr 2020 12:57:46 -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:mime-version :content-transfer-encoding; bh=OwRMyZpIBhOk8Y/TdCuhxLcj93SvBWbSoZQyJ5AG9L4=; b=Eg4H+fdbEWu/icy/UMiUSfomFJeFE6O9e6sxwtQ0rGfAtYL/k4w5GUwqwX3/4ZI04a BIvumadXexQVAm8G60bcAN3farPrPmTVqNae8mfOq1N3Ih7eFyZ+j90eSXGmJjM+msLR ZEnlDSPVXBlCmeixe0dw5bx4dBBZ2tNRevQJVdyVFJhilNnjj9qWLSDBHm/rRuhWXq6h wp2U6wvHxt6iN6L8/WfBmP2I7I5DmmTodBuVtH2oCDFBqpcjLIqpPopsfuiP1mMmuVtC KxXIbp4QZodVUtF+0G+XRh+csCsAdz2uALA2Hmg3gltCJlgG1Gc5mMsvVj6sn2hjO2/6 PKpg== 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:mime-version :content-transfer-encoding; bh=OwRMyZpIBhOk8Y/TdCuhxLcj93SvBWbSoZQyJ5AG9L4=; b=EWPen8rK//DYC9+D2/bqD+RQXzVbDSKtFLteML9upZl19PFqaBZyCOSd61QP62Z2og QFnEHuk9xumFJTdn/5qVfrl2QgKb2xcBIa/knw0ZDB4kBIbZADyCt77hTVXGkcU1vXMX 9zRFCEao5WiERBZgRtwfN55f3BOjYCneXa0NSqzu4dNyD4Zl8PUd6AX7BTWuZNRdV4FI jWNofbscO3eEy8s2Zby8fpif3lGmcFtCelRKv6nPbGcsJydLiz6ayW0RmPVLsCxYINi9 qCof+RILOLeRYd2bcA2z0XPjE60xvQrIsryKWuTlbWvWGanPF2vgkJDHBgDW75VRANeL 5vDg== X-Gm-Message-State: AGi0PuYWUx/1h+SuBe9nkspDQA49h9MA/NYH+sbo4wR7GWqjXKEOeZG1 DgIb8WVIcQwAn3vJESfww9+4sJUe X-Google-Smtp-Source: APiQypI48AySdolRGkyX9fjSb2SVBMaFyiZucS2NH/dLjwWv9i2SfwnQRvq3jGr5XkalMc1L0lgj5g== X-Received: by 2002:a0c:e752:: with SMTP id g18mr583893qvn.111.1588276664782; Thu, 30 Apr 2020 12:57:44 -0700 (PDT) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id g14sm676537qtb.24.2020.04.30.12.57.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Apr 2020 12:57:44 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Thu, 30 Apr 2020 15:57:27 -0400 Message-Id: <20200430195728.32671-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/mpegtsenc: Don't use heap allocated array to store pids 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: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman A temporary heap array currently stores pids from all streams. It is used to make sure there are no duplicated pids. However, this array is not needed because the pids from past streams are stored in the MpegTSWriteStream structs. Signed-off-by: Andriy Gelman --- libavformat/mpegtsenc.c | 51 +++++++++++------------------------------ 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index f2be6c6632..8ca1ddf003 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -931,7 +931,6 @@ static int mpegts_init(AVFormatContext *s) { MpegTSWrite *ts = s->priv_data; int i, j; - int *pids; int ret; if (ts->m2ts_mode == -1) { @@ -989,12 +988,6 @@ static int mpegts_init(AVFormatContext *s) ts->sdt.write_packet = section_write_packet; ts->sdt.opaque = s; - pids = av_malloc_array(s->nb_streams, sizeof(*pids)); - if (!pids) { - ret = AVERROR(ENOMEM); - goto fail; - } - /* assign pids to each stream */ for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; @@ -1002,8 +995,7 @@ static int mpegts_init(AVFormatContext *s) ts_st = av_mallocz(sizeof(MpegTSWriteStream)); if (!ts_st) { - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } st->priv_data = ts_st; @@ -1011,8 +1003,7 @@ static int mpegts_init(AVFormatContext *s) ts_st->payload = av_mallocz(ts->pes_payload_size); if (!ts_st->payload) { - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } /* MPEG pid values < 16 are reserved. Applications which set st->id in @@ -1043,8 +1034,7 @@ static int mpegts_init(AVFormatContext *s) ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1 || ts_st->pid < 16) { av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index); - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } } else { ts_st->pid = ts->start_pid + i; @@ -1055,30 +1045,26 @@ static int mpegts_init(AVFormatContext *s) if (ts_st->pid >= 0x1FFF) { av_log(s, AV_LOG_ERROR, "Invalid stream id %d, must be less than 8191\n", st->id); - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } for (j = 0; j < ts->nb_services; j++) { if (ts->services[j]->pmt.pid > LAST_OTHER_PID) { av_log(s, AV_LOG_ERROR, "Invalid PMT PID %d, must be less than %d\n", ts->services[j]->pmt.pid, LAST_OTHER_PID + 1); - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } if (ts_st->pid == ts->services[j]->pmt.pid) { av_log(s, AV_LOG_ERROR, "PID %d cannot be both elementary and PMT PID\n", ts_st->pid); - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } } for (j = 0; j < i; j++) { - if (pids[j] == ts_st->pid) { + MpegTSWriteStream *ts_st_prev = s->streams[j]->priv_data; + if (ts_st_prev->pid == ts_st->pid) { av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid); - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } } - pids[i] = ts_st->pid; ts_st->payload_pts = AV_NOPTS_VALUE; ts_st->payload_dts = AV_NOPTS_VALUE; ts_st->first_pts_check = 1; @@ -1089,35 +1075,30 @@ static int mpegts_init(AVFormatContext *s) AVStream *ast; ts_st->amux = avformat_alloc_context(); if (!ts_st->amux) { - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } ts_st->amux->oformat = av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts", NULL, NULL); if (!ts_st->amux->oformat) { - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } if (!(ast = avformat_new_stream(ts_st->amux, NULL))) { - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } ret = avcodec_parameters_copy(ast->codecpar, st->codecpar); if (ret != 0) - goto fail; + return ret; ast->time_base = st->time_base; ret = avformat_write_header(ts_st->amux, NULL); if (ret < 0) - goto fail; + return ret; } if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) { ts_st->opus_pending_trim_start = st->codecpar->initial_padding * 48000 / st->codecpar->sample_rate; } } - av_freep(&pids); - if (ts->copyts < 1) ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE); @@ -1138,10 +1119,6 @@ static int mpegts_init(AVFormatContext *s) av_rescale(ts->pat_period, 1000, PCR_TIME_BASE)); return 0; - -fail: - av_freep(&pids); - return ret; } /* send SDT, PAT and PMT tables regularly */