From patchwork Sat Mar 16 00:21:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Li X-Patchwork-Id: 12318 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 ACD5A447D08 for ; Sat, 16 Mar 2019 02:21:36 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8960A689CFE; Sat, 16 Mar 2019 02:21:36 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2E337689C3E for ; Sat, 16 Mar 2019 02:21:30 +0200 (EET) Received: by mail-pg1-f194.google.com with SMTP id l11so7504840pgq.10 for ; Fri, 15 Mar 2019 17:21:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=d+VWom4KUW6hAkmS6glmRQo5oiF+8W6i54Fw1QDMi9o=; b=FcgZKq8TCFESxH3n9rVBZ2xosBuepQP3B3sybGWfo2n1/Jx39wBSxRZLW3Vz666iQ4 s6AGZ3vP8sixbnY/Ok51Ju6xGrP0xKc2iVi8pt7Kz4Jv7Z8GJv6XvgOSVq9Bip88xEIE VGL+TqbafOQ3He/A76leAyQg4wDqTghu7/IaUPUYdu7NZ2GGdpEUzIzJSrHnnmYoJ6CS QNuoaCYr1DVvGWnmCiSGZm6R+xJW8Hilh7AWf3uFwJ2bur01mwh9Jlu+M1yUBU1MXorz D2ibxfabmm7azjXQEPHFs07dCxGKJl4jgYEUwYRVMKUPaD3vHJXBOeM3xgVTTaY9I41v Rk1A== 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; bh=d+VWom4KUW6hAkmS6glmRQo5oiF+8W6i54Fw1QDMi9o=; b=s5ehUVWpsbNgr0WS3TZPmh3IxBkEifHW2AVI9/NVVpTF6huH6pOPW0qk/qyOpMzLnh Ge4u4dIzA9Us2B4J/6MczGbD0RihF271XC+my9tLzkbJO/X0qIexG6+Im8ZrQqrcZFuK RxfZs5vWJvPmX+XU1o2W5st5aTQEsa+3gqo4neETHWAtDT5WC9vgLIFW8NggJIYvhXfq jcYidiz77ZCzCRSjCVZ0+9M5nAqETTdXDGhgVqjEwm5CcdPUAl91AJrmqOV850CMgKrw 77+93I6as4HvgpToOtAW+ly9v+RIuKgu00mKUFi3oHkXalDLZN3Zvjwi76TEd1LoS+H5 iN0A== X-Gm-Message-State: APjAAAWbtrTgyQS0Rx65ZU2XCgdT7ZQm+IPkYIRtyc/7mu5+Y76cR3wb 5QWaeuHzF3dnx/wy1RN1xOq/zcOp X-Google-Smtp-Source: APXvYqw34K+D7k2KJfrM7d5URceZ0B8Mo/tXnh0OJWwuAiohNpDo4mVi9F0zTHNygUnUw+qo8etGlQ== X-Received: by 2002:a65:518b:: with SMTP id h11mr6030453pgq.41.1552695687470; Fri, 15 Mar 2019 17:21:27 -0700 (PDT) Received: from jun-ubuntu.corp.microsoft.com ([2001:4898:80e8:b:2437:7fe7:9adf:4955]) by smtp.googlemail.com with ESMTPSA id a4sm4265173pga.52.2019.03.15.17.21.26 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Mar 2019 17:21:26 -0700 (PDT) From: Jun Li To: ffmpeg-devel@ffmpeg.org Date: Fri, 15 Mar 2019 17:21:19 -0700 Message-Id: <20190316002119.21872-1-junli1026@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v4] avformat/smoothstreamingenc:add bitrate calculate 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" Calculate bitrate based on fragment size, only applied when bitrate is not set, for example rtsp source. Signed-off-by: Jun Li --- libavformat/smoothstreamingenc.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/libavformat/smoothstreamingenc.c b/libavformat/smoothstreamingenc.c index 094712af27..245ed33723 100644 --- a/libavformat/smoothstreamingenc.c +++ b/libavformat/smoothstreamingenc.c @@ -320,11 +320,13 @@ static int ism_write_header(AVFormatContext *s) AVDictionary *opts = NULL; if (!s->streams[i]->codecpar->bit_rate) { - av_log(s, AV_LOG_ERROR, "No bit rate set for stream %d\n", i); - ret = AVERROR(EINVAL); - goto fail; + av_log(s, AV_LOG_WARNING, "No bit rate set for stream %"PRId32"\n", i); + // create a tmp name for the directory of fragments + snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(Tmp_%"PRId32")", s->url, i); + } else { + snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(%"PRId64")", s->url, s->streams[i]->codecpar->bit_rate); } - snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(%"PRId64")", s->url, s->streams[i]->codecpar->bit_rate); + if (mkdir(os->dirname, 0777) == -1 && errno != EEXIST) { ret = AVERROR(errno); av_log(s, AV_LOG_ERROR, "mkdir failed\n"); @@ -519,7 +521,7 @@ static int ism_flush(AVFormatContext *s, int final) for (i = 0; i < s->nb_streams; i++) { OutputStream *os = &c->streams[i]; - char filename[1024], target_filename[1024], header_filename[1024]; + char filename[1024], target_filename[1024], header_filename[1024], curr_dirname[1024]; int64_t size; int64_t start_ts, duration, moof_size; if (!os->packets_written) @@ -541,6 +543,26 @@ static int ism_flush(AVFormatContext *s, int final) size = os->tail_pos - os->cur_start_pos; if ((ret = parse_fragment(s, filename, &start_ts, &duration, &moof_size, size)) < 0) break; + + if (!s->streams[i]->codecpar->bit_rate) { + int64_t bitrate = (int64_t) size * 8 * AV_TIME_BASE / av_rescale_q(duration, s->streams[i]->time_base, AV_TIME_BASE_Q); + if (!bitrate) { + av_log(s, AV_LOG_ERROR, "calculating bitrate get zero."); + ret = AVERROR(EINVAL); + return ret; + } + + av_log(s, AV_LOG_WARNING, "calculated bitrate: %"PRId64"\n", bitrate); + s->streams[i]->codecpar->bit_rate = bitrate; + memcpy(curr_dirname, os->dirname, sizeof(os->dirname)); + snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(%"PRId64")", s->url, s->streams[i]->codecpar->bit_rate); + snprintf(filename, sizeof(filename), "%s/temp", os->dirname); + + // rename the tmp folder back to the correct name since we now have the bitrate + if ((ret = ff_rename((const char*)curr_dirname, os->dirname, s)) < 0) + return ret; + } + snprintf(header_filename, sizeof(header_filename), "%s/FragmentInfo(%s=%"PRIu64")", os->dirname, os->stream_type_tag, start_ts); snprintf(target_filename, sizeof(target_filename), "%s/Fragments(%s=%"PRIu64")", os->dirname, os->stream_type_tag, start_ts); copy_moof(s, filename, header_filename, moof_size);