Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
ec6e035b
Commit
ec6e035b
authored
Nov 16, 2014
by
Lukasz Marek
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ffserver: export recommented encoder configuration
Signed-off-by:
Lukasz Marek
<
lukasz.m.luki2@gmail.com
>
parent
aaf6cc92
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
63 additions
and
20 deletions
+63
-20
ffserver.c
ffserver.c
+4
-2
ffserver_config.c
ffserver_config.c
+59
-18
No files found.
ffserver.c
View file @
ec6e035b
...
...
@@ -3326,8 +3326,7 @@ static int add_av_stream(FFServerStream *feed, AVStream *st)
av
=
st
->
codec
;
for
(
i
=
0
;
i
<
feed
->
nb_streams
;
i
++
)
{
st
=
feed
->
streams
[
i
];
av1
=
st
->
codec
;
av1
=
feed
->
streams
[
i
]
->
codec
;
if
(
av1
->
codec_id
==
av
->
codec_id
&&
av1
->
codec_type
==
av
->
codec_type
&&
av1
->
bit_rate
==
av
->
bit_rate
)
{
...
...
@@ -3355,6 +3354,9 @@ static int add_av_stream(FFServerStream *feed, AVStream *st)
fst
=
add_av_stream1
(
feed
,
av
,
0
);
if
(
!
fst
)
return
-
1
;
if
(
av_stream_get_recommended_encoder_configuration
(
st
))
av_stream_set_recommended_encoder_configuration
(
fst
,
av_strdup
(
av_stream_get_recommended_encoder_configuration
(
st
)));
return
feed
->
nb_streams
-
1
;
}
...
...
ffserver_config.c
View file @
ec6e035b
...
...
@@ -178,13 +178,15 @@ static void add_codec(FFServerStream *stream, AVCodecContext *av,
FFServerConfig
*
config
)
{
AVStream
*
st
;
AVDictionary
**
opts
;
AVDictionary
**
opts
,
*
recommended
=
NULL
;
char
*
enc_config
;
if
(
stream
->
nb_streams
>=
FF_ARRAY_ELEMS
(
stream
->
streams
))
return
;
opts
=
av
->
codec_type
==
AVMEDIA_TYPE_AUDIO
?
&
config
->
audio_opts
:
&
config
->
video_opts
;
av_dict_copy
(
&
recommended
,
*
opts
,
0
);
av_opt_set_dict2
(
av
->
priv_data
,
opts
,
AV_OPT_SEARCH_CHILDREN
);
av_opt_set_dict2
(
av
,
opts
,
AV_OPT_SEARCH_CHILDREN
);
if
(
av_dict_count
(
*
opts
))
...
...
@@ -196,63 +198,99 @@ static void add_codec(FFServerStream *stream, AVCodecContext *av,
/* compute default parameters */
switch
(
av
->
codec_type
)
{
case
AVMEDIA_TYPE_AUDIO
:
if
(
av
->
bit_rate
==
0
)
if
(
av
->
bit_rate
==
0
)
{
av
->
bit_rate
=
64000
;
if
(
av
->
sample_rate
==
0
)
av_dict_set_int
(
&
recommended
,
"ab"
,
av
->
bit_rate
,
0
);
}
if
(
av
->
sample_rate
==
0
)
{
av
->
sample_rate
=
22050
;
if
(
av
->
channels
==
0
)
av_dict_set_int
(
&
recommended
,
"ar"
,
av
->
sample_rate
,
0
);
}
if
(
av
->
channels
==
0
)
{
av
->
channels
=
1
;
av_dict_set_int
(
&
recommended
,
"ac"
,
av
->
channels
,
0
);
}
break
;
case
AVMEDIA_TYPE_VIDEO
:
if
(
av
->
bit_rate
==
0
)
if
(
av
->
bit_rate
==
0
)
{
av
->
bit_rate
=
64000
;
av_dict_set_int
(
&
recommended
,
"b"
,
av
->
bit_rate
,
0
);
}
if
(
av
->
time_base
.
num
==
0
){
av
->
time_base
.
den
=
5
;
av
->
time_base
.
num
=
1
;
av_dict_set
(
&
recommended
,
"time_base"
,
"1/5"
,
0
);
}
if
(
av
->
width
==
0
||
av
->
height
==
0
)
{
av
->
width
=
160
;
av
->
height
=
128
;
av_dict_set
(
&
recommended
,
"video_size"
,
"160x128"
,
0
);
}
/* Bitrate tolerance is less for streaming */
if
(
av
->
bit_rate_tolerance
==
0
)
if
(
av
->
bit_rate_tolerance
==
0
)
{
av
->
bit_rate_tolerance
=
FFMAX
(
av
->
bit_rate
/
4
,
(
int64_t
)
av
->
bit_rate
*
av
->
time_base
.
num
/
av
->
time_base
.
den
);
if
(
av
->
qmin
==
0
)
av_dict_set_int
(
&
recommended
,
"bt"
,
av
->
bit_rate_tolerance
,
0
);
}
if
(
av
->
qmin
==
0
)
{
av
->
qmin
=
3
;
if
(
av
->
qmax
==
0
)
av_dict_set_int
(
&
recommended
,
"qmin"
,
av
->
qmin
,
0
);
}
if
(
av
->
qmax
==
0
)
{
av
->
qmax
=
31
;
if
(
av
->
max_qdiff
==
0
)
av_dict_set_int
(
&
recommended
,
"qmax"
,
av
->
qmax
,
0
);
}
if
(
av
->
max_qdiff
==
0
)
{
av
->
max_qdiff
=
3
;
av_dict_set_int
(
&
recommended
,
"qdiff"
,
av
->
max_qdiff
,
0
);
}
/*FIXME: 0.5 is a default for these two, it is a dead code */
av
->
qcompress
=
0
.
5
;
av_dict_set
(
&
recommended
,
"qcomp"
,
"0.5"
,
0
);
av
->
qblur
=
0
.
5
;
av_dict_set
(
&
recommended
,
"qblur"
,
"0.5"
,
0
);
if
(
!
av
->
nsse_weight
)
if
(
!
av
->
nsse_weight
)
{
av
->
nsse_weight
=
8
;
av_dict_set_int
(
&
recommended
,
"nssew"
,
av
->
nsse_weight
,
0
);
}
av
->
frame_skip_cmp
=
FF_CMP_DCTMAX
;
if
(
!
av
->
me_method
)
av_dict_set_int
(
&
recommended
,
"skipcmp"
,
FF_CMP_DCTMAX
,
0
);
if
(
!
av
->
me_method
)
{
av
->
me_method
=
ME_EPZS
;
av_dict_set_int
(
&
recommended
,
"me_method"
,
ME_EPZS
,
0
);
}
/* FIXME: rc_buffer_aggressivity and rc_eq are deprecated */
av
->
rc_buffer_aggressivity
=
1
.
0
;
av_dict_set
(
&
recommended
,
"rc_buf_aggressivity"
,
"1.0"
,
0
);
if
(
!
av
->
rc_eq
)
if
(
!
av
->
rc_eq
)
{
av
->
rc_eq
=
av_strdup
(
"tex^qComp"
);
if
(
!
av
->
i_quant_factor
)
av_dict_set
(
&
recommended
,
"rc_eq"
,
"tex^qComp"
,
0
);
}
if
(
!
av
->
i_quant_factor
)
{
av
->
i_quant_factor
=
-
0
.
8
;
if
(
!
av
->
b_quant_factor
)
av_dict_set
(
&
recommended
,
"i_qfactor"
,
"-0.8"
,
0
);
}
if
(
!
av
->
b_quant_factor
)
{
av
->
b_quant_factor
=
1
.
25
;
if
(
!
av
->
b_quant_offset
)
av_dict_set
(
&
recommended
,
"b_qfactor"
,
"1.25"
,
0
);
}
if
(
!
av
->
b_quant_offset
)
{
av
->
b_quant_offset
=
1
.
25
;
if
(
!
av
->
rc_max_rate
)
av_dict_set
(
&
recommended
,
"b_qoffset"
,
"1.25"
,
0
);
}
if
(
!
av
->
rc_max_rate
)
{
av
->
rc_max_rate
=
av
->
bit_rate
*
2
;
av_dict_set_int
(
&
recommended
,
"maxrate"
,
av
->
rc_max_rate
,
0
);
}
if
(
av
->
rc_max_rate
&&
!
av
->
rc_buffer_size
)
{
av
->
rc_buffer_size
=
av
->
rc_max_rate
;
av_dict_set_int
(
&
recommended
,
"bufsize"
,
av
->
rc_buffer_size
,
0
);
}
break
;
default:
abort
();
...
...
@@ -280,6 +318,9 @@ static void add_codec(FFServerStream *stream, AVCodecContext *av,
st
=
av_mallocz
(
sizeof
(
AVStream
));
if
(
!
st
)
return
;
av_dict_get_string
(
recommended
,
&
enc_config
,
'='
,
','
);
av_dict_free
(
&
recommended
);
av_stream_set_recommended_encoder_configuration
(
st
,
enc_config
);
st
->
codec
=
av
;
stream
->
streams
[
stream
->
nb_streams
++
]
=
st
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment