From patchwork Wed Dec 28 06:05:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Bradshaw X-Patchwork-Id: 1961 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp1812362vsb; Tue, 27 Dec 2016 22:30:21 -0800 (PST) X-Received: by 10.28.91.141 with SMTP id p135mr29786806wmb.128.1482906621116; Tue, 27 Dec 2016 22:30:21 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 140si49070126wmk.98.2016.12.27.22.30.20; Tue, 27 Dec 2016 22:30:21 -0800 (PST) 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 1C8AD689E03; Wed, 28 Dec 2016 08:30:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8AA7B689DA9 for ; Wed, 28 Dec 2016 08:30:09 +0200 (EET) Received: by mail-pf0-f195.google.com with SMTP id i88so18998566pfk.2 for ; Tue, 27 Dec 2016 22:30:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=12uUODxqcETAJt4Dm1l6Bj4rK+IvhTsHMUjV9SRc1sk=; b=Djwmutsm6awEQg2oh9vcuF3d7pnMYejWCyKp+4SZG/mLHoAgG2lImhuwKY3QfVYUfs 2fIVvYbaFNFmub9ASXrREFYx/uKmSBtBpj/lJ7mPl+LiQESlAhpZkkfWaoJTZynHnOnZ 9yebgtgAUXZT4LJ2vD2Eu4/Ekqo+NKlBE4TRmp8gT+/cv8oJebYUPZmlXy9h6DEPH7Dp J8D/0NKo3dShQ7mXxn8O6X7G/t2ASbhkMAH1VtqXtjQx6xtjx5RF846yDCIwm0T3sRiS YXw1T7EBQ1ezSBYNOzcTIFTEB+tJsXul6R24hSwVKMP0ihqwBSb+fvSOTRiGknOid5LS YWdQ== 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:in-reply-to :references; bh=12uUODxqcETAJt4Dm1l6Bj4rK+IvhTsHMUjV9SRc1sk=; b=Fori9WujklQrdHO+LKdZQcCqG2T9LcZyM3GJxusXnZnQd65FzkjfwdJfCdSsuq2sRf iAlsdShzgWZDAlRb+xfkPLwUNQzAsz5ZFVnVEAs25aFViBatfViiNxeKBmc9rmTpmPyW am5E99iBfh3D46oRhbBtEz9RYWts7eVLuBeun5AJfhePTIZo/qaLbo1IW54tksNfh1Gu vZd/UEpKPu5F+/lfnQlap/95gXZJJZRLd6f9LBB9cGzUDPn0XyJTQ9JJHQe4DaYLA3Gu +m13uKXOaKYig/YNvUBZd479C8tQktkrJHCr2gu3s0vJMnoSbiz+UpPFD1YqyVN1ADvn 9ugw== X-Gm-Message-State: AIkVDXKDWooE9ktR4k51NEa9H0Gayo5i0rAgbp48gH3NjdqHU0eKcTxwSiigG9t36YyRsw== X-Received: by 10.98.83.193 with SMTP id h184mr32579526pfb.175.1482905139073; Tue, 27 Dec 2016 22:05:39 -0800 (PST) Received: from localhost.localdomain (c-73-189-103-209.hsd1.ca.comcast.net. [73.189.103.209]) by smtp.gmail.com with ESMTPSA id s4sm93447966pfb.55.2016.12.27.22.05.37 (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 27 Dec 2016 22:05:38 -0800 (PST) From: Michael Bradshaw To: ffmpeg-devel@ffmpeg.org Date: Tue, 27 Dec 2016 22:05:35 -0800 Message-Id: <20161228060535.41669-2-mjbshaw@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20161228060535.41669-1-mjbshaw@gmail.com> References: <20161228060535.41669-1-mjbshaw@gmail.com> Subject: [FFmpeg-devel] [PATCH] ffmpeg: Add -time_base option to hint the time base 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: Michael Bradshaw MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Michael Bradshaw Signed-off-by: Michael Bradshaw --- ffmpeg.c | 6 ++++-- ffmpeg.h | 2 ++ ffmpeg_opt.c | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index ec9da3e..9ad9535 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -2910,7 +2910,8 @@ static int init_output_stream_streamcopy(OutputStream *ost) return ret; // copy timebase while removing common factors - ost->st->time_base = av_add_q(av_stream_get_codec_timebase(ost->st), (AVRational){0, 1}); + if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0) + ost->st->time_base = av_add_q(av_stream_get_codec_timebase(ost->st), (AVRational){0, 1}); // copy disposition ost->st->disposition = ist->st->disposition; @@ -3335,7 +3336,8 @@ static int init_output_stream(OutputStream *ost, char *error, int error_len) } // copy timebase while removing common factors - ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1}); + if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0) + ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1}); ost->st->codec->codec= ost->enc_ctx->codec; } else if (ost->stream_copy) { ret = init_output_stream_streamcopy(ost); diff --git a/ffmpeg.h b/ffmpeg.h index ebe5bf0..f32d22a 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -224,6 +224,8 @@ typedef struct OptionsContext { int nb_disposition; SpecifierOpt *program; int nb_program; + SpecifierOpt *time_bases; + int nb_time_bases; } OptionsContext; typedef struct InputFilter { diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 6862456..8f5d3a1 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -1231,7 +1231,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e OutputStream *ost; AVStream *st = avformat_new_stream(oc, NULL); int idx = oc->nb_streams - 1, ret = 0; - const char *bsfs = NULL; + const char *bsfs = NULL, *time_base = NULL; char *next, *codec_tag = NULL; double qscale = -1; int i; @@ -1308,6 +1308,17 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL); } + MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st); + if (time_base) { + AVRational q; + if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 || + q.num <= 0 || q.den <= 0) { + av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base); + exit_program(1); + } + st->time_base = q; + } + ost->max_frames = INT64_MAX; MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st); for (i = 0; inb_max_frames; i++) { @@ -3649,6 +3660,9 @@ const OptionDef options[] = { { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file }, "specify a file in which to print sdp information", "file" }, + { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) }, + "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" }, + { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) }, "A comma-separated list of bitstream filters", "bitstream_filters" }, { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },