From patchwork Fri Apr 7 14:56:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 41007 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp160548pzb; Thu, 6 Apr 2023 23:57:05 -0700 (PDT) X-Google-Smtp-Source: AKy350a20oyFrJRRJG+yyqzfVEezr+C0q9sVo6cEz1bPwDMGN1JHCgumKwuMi41NGsCzwb2R4g31 X-Received: by 2002:a17:906:a44e:b0:932:c56a:c19b with SMTP id cb14-20020a170906a44e00b00932c56ac19bmr1718404ejb.22.1680850625129; Thu, 06 Apr 2023 23:57:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680850625; cv=none; d=google.com; s=arc-20160816; b=o6N1dLhbDQybojeWTpDqduBz+qIkCldk/mXx2s5VRLkaz0avZylDlBxGzZedBTjd66 H6yteiqYyvX5VKJCMsaJVzHmYkADoDfXNqlkCqQee6JyOqf6UV57wL0hxO4+eRvMh8ee /9fzINMYI/d2SixoYVzunm1GHRBnYEhZhyA/Awqc1AYZ0KoViE2OhoydiRd0aTE/2cF5 djw6x99E3XYnxKO4zs+ZKN0csdB/Vtl3WbyzD543JTE7M/Kwgm5P0Qtt9o31/kwU0CM7 hf156OQOWmilrdF048tPh3fIzGB3gebuvN6WoCaLa7KmZytORB+XYbCbM3FT0s5MYINU WVkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=aWaWD/DcVEpTjWnVYnG+ARSdm7UXafKlv6HO+k723qk=; b=GaJByoevqfxo6q2VkIt5bV7Xwcy5l+lIvl2H7Vq3s0pfKTuUC3PC1wggTE5mL/VUfZ e5+/xKxyo6OW5JbyqQKvTD8bl1aDoJPSEvbzJwvUhrJV8iHCybTsbGBII0Y/laDhVphK kDqftW+JRpZQH3sMJ0qBrkQqJ5Lnr+ug91ZPG0DZbLc1MIPwcjQyXaMZZ83whKDKAR82 TaQLyNK37fjIdP1vwAcjWe02lvm1qJv/27AzSk60LUXyVk1/ZqZavAimRzjuTepefQYq cOiuLCJYmZ7Tdg9hblLc3peHHO/mCqH37ydjC6ob3PVBkXriGDGh5Ro7ST3VFd81aCcF kiFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=xuQdRdks; 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 sp=NONE dis=NONE) header.from=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h6-20020a1709060f4600b009475bf88f7dsi2814492ejj.910.2023.04.06.23.57.04; Thu, 06 Apr 2023 23:57:05 -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=@foxmail.com header.s=s201512 header.b=xuQdRdks; 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 sp=NONE dis=NONE) header.from=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E33BC68AB4D; Fri, 7 Apr 2023 09:56:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-137.mail.qq.com (out162-62-57-137.mail.qq.com [162.62.57.137]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 682C86809C7 for ; Fri, 7 Apr 2023 09:56:51 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1680850595; bh=qZUwQVsz/In3nl2KlAbvUAI/aBAmx2vxNDvJA1FBpY0=; h=From:To:Cc:Subject:Date; b=xuQdRdksa5Wq+B9YRj6ydZaWL92EVfo9PuvsJt20KF2ovq/oKCy812x584KW5bUR1 ix5rUES3Y5uJG5OjcbEk5bz+1rqVdipb/q/4TRgLV7a1C8NTjMmfK8oAkO3VJp/Oo7 hhM5I99icFQWCyqR4ibA37855v6vFfTpJ8BUbrL8= Received: from localhost.localdomain ([59.37.125.102]) by newxmesmtplogicsvrszc5-0.qq.com (NewEsmtp) with SMTP id E2219216; Fri, 07 Apr 2023 14:56:34 +0800 X-QQ-mid: xmsmtpt1680850594tojnnm951 Message-ID: X-QQ-XMAILINFO: MW5hkHoBpWXySETBCfShLJJY6cERidhpu/DJt8GxKWnyYktsy8ptN1KqiVi+w1 P5AHrg+I7A+kaM8T4WbdYFqg3YGxQG4YPA9x4QPu4yDsrSfNroBE4TTR5TzdToCP+W9eXpPV74kI 8cBCqCKveVAxGeBMRLfJ67Q0LhVPjKeCRnoZk8a2/lYeaF9s/7TgpUCfuoGzMnJHdHgvR1aBO2ul 0xh8xfd15HCvYPVMk0V1vqIK9zi2gSJqX9dUVEf7kPtRfPE0D/4rkkFqXgnn53r+6wKC05HJfRFF YRTMs0wgyLDYuCXFRD00NhebwiJj5eSgrTguYuy/6bBHqDe0xe89mWzFEUPTSrtkK7jkxjuncvJF OaZ0sCTNEjw1F8lNqm08Kn8xFH3gHaQasY3JlmQ9Vi3xbIHnCcor8yq0RqNO3h6+Tg7ddKK7L+Bj /Jy3EiEb0OfUtzBU/w4SADdDyePn3tIKAOTkH/UoSmC7OS61XgyvGGYzMc0b2aFVfzs9pcQcUiqc 4aXpSW3AU7dtFte+5r6Aoi4cWi61+PdBqj2Rd/pjDrParEsFZi5ooCp+y0/Yzt0pxJHCyWlobql2 T9z3E/dtljlGy0lcALZmwQhtNUCgdafVVCz0Y2Dg1AgGMEdWXAsjnkO931mVG3W6S4+czVqvTInm wGbflP/Id5GyS/ItuuZZM1K2MrIIFdFhT6UHWkn6Hxoc04UvOplmY7Rth217OZ3bTYjYgW9rkq8b 1ryao063fds4EVan5C5sr/4x627pd2qRddis9VXtU5W1aKMjlImseeQLUXWIrvB43sIv8CaI9QTV lN5l5WVSGgZwgQc6JYSczeerIN0GGpciwP/Wy0GOnrn00L5Q8s/8uQzTEMgDhQeo4gSssKLRQr8h xhPfl6z+OTJwW0JAJO1E8WVWhzG/wz3335JJFJrsOpCG9YLFaTMH1Mv58OAH+wd3dUAU3+neZRk7 TB8gzrZ0dp7F3E4Oe6CvBt1fqrMyWFhG7Oe6HE2Ac= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Apr 2023 22:56:38 +0800 X-OQ-MSGID: <20230407145638.1140813-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avformat/flvenc: avoid an extra allocate X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: y4ScN6o6tove From: Zhao Zhili --- 1. Change variable type from uint32_t to int64_t. 2. Check the number of streams. I'm not sure the maximum number of streams should be 3 or 4. And the code allowed multiple subtitle/data tracks, I think it's a bug. libavformat/flvenc.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index a7b5efde4b..bcc95ee5c1 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -117,12 +117,9 @@ typedef struct FLVContext { AVCodecParameters *data_par; int flags; + int64_t last_ts[FLV_STREAM_TYPE_NB]; } FLVContext; -typedef struct FLVStreamContext { - int64_t last_ts; ///< last timestamp for each stream -} FLVStreamContext; - static int get_audio_flags(AVFormatContext *s, AVCodecParameters *par) { int flags = (par->bits_per_coded_sample == 16) ? FLV_SAMPLESSIZE_16BIT @@ -609,9 +606,15 @@ static int flv_init(struct AVFormatContext *s) int i; FLVContext *flv = s->priv_data; + if (s->nb_streams > FLV_STREAM_TYPE_NB) { + av_log(s, AV_LOG_ERROR, "invalid number of streams %d\n", + s->nb_streams); + return AVERROR(EINVAL); + } + for (i = 0; i < s->nb_streams; i++) { AVCodecParameters *par = s->streams[i]->codecpar; - FLVStreamContext *sc; + switch (par->codec_type) { case AVMEDIA_TYPE_VIDEO: if (s->streams[i]->avg_frame_rate.den && @@ -675,12 +678,7 @@ static int flv_init(struct AVFormatContext *s) return AVERROR(EINVAL); } avpriv_set_pts_info(s->streams[i], 32, 1, 1000); /* 32 bit pts in ms */ - - sc = av_mallocz(sizeof(FLVStreamContext)); - if (!sc) - return AVERROR(ENOMEM); - s->streams[i]->priv_data = sc; - sc->last_ts = -1; + flv->last_ts[i] = -1; } flv->delay = AV_NOPTS_VALUE; @@ -783,10 +781,9 @@ end: /* Add EOS tag */ for (i = 0; i < s->nb_streams; i++) { AVCodecParameters *par = s->streams[i]->codecpar; - FLVStreamContext *sc = s->streams[i]->priv_data; if (par->codec_type == AVMEDIA_TYPE_VIDEO && (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4)) - put_eos_tag(pb, sc->last_ts, par->codec_id); + put_eos_tag(pb, flv->last_ts[i], par->codec_id); } } @@ -821,7 +818,6 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) AVIOContext *pb = s->pb; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; FLVContext *flv = s->priv_data; - FLVStreamContext *sc = s->streams[pkt->stream_index]->priv_data; unsigned ts; int size = pkt->size; uint8_t *data = NULL; @@ -919,13 +915,13 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) } /* check Speex packet duration */ - if (par->codec_id == AV_CODEC_ID_SPEEX && ts - sc->last_ts > 160) + if (par->codec_id == AV_CODEC_ID_SPEEX && ts - flv->last_ts[pkt->stream_index] > 160) av_log(s, AV_LOG_WARNING, "Warning: Speex stream has more than " "8 frames per packet. Adobe Flash " "Player cannot handle this!\n"); - if (sc->last_ts < ts) - sc->last_ts = ts; + if (flv->last_ts[pkt->stream_index] < ts) + flv->last_ts[pkt->stream_index] = ts; if (size + flags_size >= 1<<24) { av_log(s, AV_LOG_ERROR, "Too large packet with size %u >= %u\n",