Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
fb066639
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
fb066639
编写于
12月 12, 2003
作者:
M
Michael Niedermayer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
CBR improvements
Originally committed as revision 2601 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
7a0f9d7e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
25 addition
and
18 deletion
+25
-18
ffmpeg.c
ffmpeg.c
+4
-1
libavcodec/mpegvideo.h
libavcodec/mpegvideo.h
+1
-1
libavcodec/ratecontrol.c
libavcodec/ratecontrol.c
+20
-16
未找到文件。
ffmpeg.c
浏览文件 @
fb066639
...
...
@@ -1567,7 +1567,7 @@ static void opt_video_bitrate_min(const char *arg)
static
void
opt_video_buffer_size
(
const
char
*
arg
)
{
video_rc_buffer_size
=
atoi
(
arg
)
*
10
00
;
video_rc_buffer_size
=
atoi
(
arg
)
*
10
24
;
}
static
void
opt_video_rc_eq
(
char
*
arg
)
...
...
@@ -2767,6 +2767,7 @@ static void opt_target(const char *arg)
video_bit_rate
=
1150000
;
video_rc_max_rate
=
1150000
;
video_rc_min_rate
=
1150000
;
video_rc_buffer_size
=
40
*
1024
*
8
;
audio_bit_rate
=
224000
;
audio_sample_rate
=
44100
;
...
...
@@ -2783,6 +2784,7 @@ static void opt_target(const char *arg)
video_bit_rate
=
2040000
;
video_rc_max_rate
=
2516000
;
video_rc_min_rate
=
1145000
;
video_rc_buffer_size
=
224
*
1024
*
8
;
audio_bit_rate
=
224000
;
audio_sample_rate
=
44100
;
...
...
@@ -2799,6 +2801,7 @@ static void opt_target(const char *arg)
video_bit_rate
=
6000000
;
video_rc_max_rate
=
9000000
;
video_rc_min_rate
=
1500000
;
video_rc_buffer_size
=
224
*
1024
*
8
;
audio_bit_rate
=
448000
;
audio_sample_rate
=
48000
;
...
...
libavcodec/mpegvideo.h
浏览文件 @
fb066639
...
...
@@ -93,7 +93,7 @@ typedef struct RateControlContext{
FILE
*
stats_file
;
int
num_entries
;
///< number of RateControlEntries
RateControlEntry
*
entry
;
int
buffer_index
;
///< amount of bits in the video/audio buffer
double
buffer_index
;
///< amount of bits in the video/audio buffer
Predictor
pred
[
5
];
double
short_term_qsum
;
///< sum of recent qscales
double
short_term_qcount
;
///< count of recent qscales
...
...
libavcodec/ratecontrol.c
浏览文件 @
fb066639
/*
* Rate control for video encoders
*
* Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
* Copyright (c) 2002
-2003
Michael Niedermayer <michaelni@gmx.at>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
...
...
@@ -62,7 +62,7 @@ int ff_rate_control_init(MpegEncContext *s)
rcc
->
frame_count
[
i
]
=
1
;
// 1 is better cuz of 1/0 and such
rcc
->
last_qscale_for
[
i
]
=
FF_QP2LAMBDA
*
5
;
}
rcc
->
buffer_index
=
s
->
avctx
->
rc_
buffer_size
/
2
;
rcc
->
buffer_index
=
s
->
avctx
->
rc_
initial_buffer_occupancy
;
if
(
s
->
flags
&
CODEC_FLAG_PASS2
){
int
i
;
...
...
@@ -202,20 +202,23 @@ static void update_rc_buffer(MpegEncContext *s, int frame_size){
const
double
min_rate
=
s
->
avctx
->
rc_min_rate
/
fps
;
const
double
max_rate
=
s
->
avctx
->
rc_max_rate
/
fps
;
//printf("%f %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate);
if
(
buffer_size
){
int
left
;
rcc
->
buffer_index
-=
frame_size
;
if
(
rcc
->
buffer_index
<
buffer_size
/
2
/*FIXME /2 */
||
min_rate
==
0
){
rcc
->
buffer_index
+=
max_rate
;
if
(
rcc
->
buffer_index
>=
buffer_size
)
rcc
->
buffer_index
=
buffer_size
-
1
;
}
else
{
rcc
->
buffer_index
+=
min_rate
;
}
if
(
rcc
->
buffer_index
<
0
)
if
(
rcc
->
buffer_index
<
0
){
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"rc buffer underflow
\n
"
);
if
(
rcc
->
buffer_index
>=
s
->
avctx
->
rc_buffer_size
)
rcc
->
buffer_index
=
0
;
}
left
=
buffer_size
-
rcc
->
buffer_index
-
1
;
rcc
->
buffer_index
+=
clip
(
left
,
min_rate
,
max_rate
);
if
(
rcc
->
buffer_index
>
s
->
avctx
->
rc_buffer_size
){
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"rc buffer overflow
\n
"
);
rcc
->
buffer_index
=
s
->
avctx
->
rc_buffer_size
;
}
}
}
...
...
@@ -385,8 +388,9 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q,
double
bits
;
const
int
pict_type
=
rce
->
new_pict_type
;
const
double
buffer_size
=
s
->
avctx
->
rc_buffer_size
;
const
double
min_rate
=
s
->
avctx
->
rc_min_rate
;
const
double
max_rate
=
s
->
avctx
->
rc_max_rate
;
const
double
fps
=
(
double
)
s
->
avctx
->
frame_rate
/
(
double
)
s
->
avctx
->
frame_rate_base
;
const
double
min_rate
=
s
->
avctx
->
rc_min_rate
/
fps
;
const
double
max_rate
=
s
->
avctx
->
rc_max_rate
/
fps
;
get_qminmax
(
&
qmin
,
&
qmax
,
s
,
pict_type
);
...
...
@@ -406,7 +410,7 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q,
else
if
(
d
<
0
.
0001
)
d
=
0
.
0001
;
q
*=
pow
(
d
,
1
.
0
/
s
->
avctx
->
rc_buffer_aggressivity
);
q
=
FFMIN
(
q
,
bits2qp
(
rce
,
FFMAX
((
min_rate
-
buffer_size
+
rcc
->
buffer_index
)
*
2
,
1
)));
q
=
FFMIN
(
q
,
bits2qp
(
rce
,
FFMAX
((
min_rate
-
buffer_size
+
rcc
->
buffer_index
)
*
3
,
1
)));
}
if
(
max_rate
){
...
...
@@ -415,7 +419,7 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q,
else
if
(
d
<
0
.
0001
)
d
=
0
.
0001
;
q
/=
pow
(
d
,
1
.
0
/
s
->
avctx
->
rc_buffer_aggressivity
);
q
=
FFMAX
(
q
,
bits2qp
(
rce
,
FFMAX
(
rcc
->
buffer_index
/
2
,
1
)));
q
=
FFMAX
(
q
,
bits2qp
(
rce
,
FFMAX
(
rcc
->
buffer_index
/
3
,
1
)));
}
}
//printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录