Signed-off-by: ErLiu <88486...@qq.com> --- libavcodec/libopenh264enc.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 24bc228..f7f11f9 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -42,6 +42,8 @@ typedef struct SVCContext { int skip_frames; int skipped; int cabac; + int bitrate; + int framerate; } SVCContext; #define OPENH264_VER_AT_LEAST(maj, min) \ @@ -61,6 +63,8 @@ static const AVOption options[] = { { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, { "allow_skip_frames", "allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "cabac", "Enable cabac", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + { "bitrate", "Set bitrate", OFFSET(bitrate), AV_OPT_TYPE_INT, { 0 }, 0, 700000, VE }, + { "framerate", "Set framerate", OFFSET(framerate), AV_OPT_TYPE_INT, { 0 }, 0, 30, VE }, { NULL } }; @@ -244,6 +248,37 @@ fail: return err; } +static void check_is_reconfig_framerate(AVCodecContext *avctx) +{ + SVCContext *s = avctx->priv_data; + + float m_framerate = 0.0; + float n_framerate = (float)s->framerate; + + (*s->encoder)->GetOption(s->encoder, ENCODER_OPTION_FRAME_RATE, &m_framerate); + + if (n_framerate > 0.0 && m_framerate != n_framerate ) { + (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_FRAME_RATE, &n_framerate); + av_log(avctx, AV_LOG_ERROR, "framerate:%f---->%f\n", m_framerate, n_framerate); + } + +} +static void check_is_reconfig_bitrate(AVCodecContext *avctx) +{ + SVCContext *s = avctx->priv_data; + + SBitrateInfo SB; + + SB.iLayer = 0; + (*s->encoder)->GetOption(s->encoder, ENCODER_OPTION_BITRATE, &SB); + + if (s->bitrate > 0 && SB.iBitrate != s->bitrate ) { + av_log(avctx, AV_LOG_ERROR, "bitrate:%d---->%d\n", SB.iBitrate, s->bitrate); + SB.iBitrate = s->bitrate; + (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_BITRATE, &SB); + (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_MAX_BITRATE, &SB); + } +} static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet) { @@ -263,6 +298,9 @@ static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, sp.iPicWidth = avctx->width; sp.iPicHeight = avctx->height; + check_is_reconfig_framerate( avctx ); + check_is_reconfig_bitrate( avctx ); + encoded = (*s->encoder)->EncodeFrame(s->encoder, &sp, &fbi); if (encoded != cmResultSuccess) { av_log(avctx, AV_LOG_ERROR, "EncodeFrame failed\n"); -- 2.7.4 (Apple Git-66)
0001-Add-bitrate-and-framerate-option-for-openH264.patch
Description: Binary data
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel