Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
5b23c533
Commit
5b23c533
authored
Oct 10, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/codec/x264.c: added a bunch of new config options.
parent
62d1b7d2
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
161 additions
and
41 deletions
+161
-41
modules/codec/x264.c
modules/codec/x264.c
+161
-41
No files found.
modules/codec/x264.c
View file @
5b23c533
...
...
@@ -31,40 +31,123 @@
#include <x264.h>
#define SOUT_CFG_PREFIX "sout-x264-"
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
#define SOUT_CFG_PREFIX "sout-x264-"
static
char
*
enc_analyse_list
[]
=
{
"all"
,
"normal"
,
"fast"
,
"none"
};
static
char
*
enc_analyse_list_text
[]
=
{
N_
(
"all"
),
N_
(
"normal"
),
N_
(
"fast"
),
N_
(
"none"
)
};
#define QP_TEXT N_("Quantizer parameter")
#define QP_LONGTEXT N_( \
"This selects the quantizer to use (1 to 51). Lower values result in " \
"better fidelity, but higher bitrates. 26 is a good default value." )
#define QPMIN_TEXT N_("Minimum quantizer parameter")
#define QPMIN_LONGTEXT N_( "Minimum quantizer, 15/35 seems to be a useful " \
"range." )
#define QPMAX_TEXT N_("Maximum quantizer parameter")
#define QPMAX_LONGTEXT N_( "Maximum quantizer parameter." )
#define CABAC_TEXT N_("Enable CABAC")
#define CABAC_LONGTEXT N_( "Enable CABAC (Context-Adaptive Binary Arithmetic "\
"Coding). Slightly slows down encoding and decoding, but should save " \
"10-15% bitrate." )
#define LOOPF_TEXT N_("Enable loop filter")
#define LOOPF_LONGTEXT N_( "Use deblocking loop filter (increases quality).")
#define ANALYSE_TEXT N_("Analyse mode")
#define ANALYSE_LONGTEXT N_( "This selects the analysing mode.")
#define KEYINT_TEXT N_("Sets maximum interval between I frames")
#define KEYINT_LONGTEXT N_( "Larger values save bits, thus improve quality, " \
"at the cost of seeking precision." )
#define IDRINT_TEXT N_("IDR frames")
#define IDRINT_LONGTEXT N_("In H.264, I-Frames do not necessarily bound a " \
"closed GOP because it is allowable for a P-frame to be predicted from " \
"more frames than just the one frame before it (also see frameref). " \
"Therefore, I-frames are not necessarily seekable. " \
"IDR-Frames restrict subsequent P-frames from referring to any frame " \
"prior to the IDR-Frame." )
#define BFRAMES_TEXT N_("B frames")
#define BFRAMES_LONGTEXT N_( "Number of consecutive B-Frames between I and " \
"P-frames." )
#define FRAMEREF_TEXT N_("Number of previous frames used as predictors.")
#define FRAMEREF_LONGTEXT N_( "This is effective in Anime, but seems to " \
"make little difference in live-action source material. Some decoders " \
"are unable to deal with large frameref values." )
#define SCENE_TEXT N_("Scene-cut detection.")
#define SCENE_LONGTEXT N_( "Controls how aggressively to insert extra " \
"I-frames. With small values of scenecut, the codec often has to force " \
"an I-frame when it would exceed keyint. " \
"Good values of scenecut may find a better location for the I-frame. " \
"Large values use more I-frames than necessary, thus wasting bits. " \
"-1 disables scene-cut detection, so I-frames are be inserted only every "\
"other keyint frames, which probably leads to ugly encoding artifacts." )
static
char
*
enc_analyse_list
[]
=
{
""
,
"all"
,
"normal"
,
"fast"
,
"none"
};
static
char
*
enc_analyse_list_text
[]
=
{
N_
(
"default"
),
N_
(
"all"
),
N_
(
"normal"
),
N_
(
"fast"
),
N_
(
"none"
)
};
vlc_module_begin
();
set_description
(
_
(
"h264 video encoder using x264 library"
));
set_capability
(
"encoder"
,
200
);
set_callbacks
(
Open
,
Close
);
add_integer
(
SOUT_CFG_PREFIX
"qp"
,
0
,
NULL
,
QP_TEXT
,
QP_LONGTEXT
,
VLC_FALSE
);
change_integer_range
(
0
,
51
);
add_integer
(
SOUT_CFG_PREFIX
"qp-min"
,
10
,
NULL
,
QPMIN_TEXT
,
QPMIN_LONGTEXT
,
VLC_FALSE
);
change_integer_range
(
0
,
51
);
add_integer
(
SOUT_CFG_PREFIX
"qp-max"
,
51
,
NULL
,
QPMAX_TEXT
,
QPMAX_LONGTEXT
,
VLC_FALSE
);
change_integer_range
(
0
,
51
);
add_integer
(
SOUT_CFG_PREFIX
"qp"
,
0
,
NULL
,
"Set fixed QP (1-51)"
,
""
,
VLC_FALSE
);
add_bool
(
SOUT_CFG_PREFIX
"cabac"
,
1
,
NULL
,
"Enable CABAC"
,
""
,
VLC_FALSE
);
add_bool
(
SOUT_CFG_PREFIX
"loopfilter"
,
1
,
NULL
,
"Enable loop filter"
,
""
,
VLC_FALSE
);
add_bool
(
SOUT_CFG_PREFIX
"cabac"
,
1
,
NULL
,
CABAC_TEXT
,
CABAC_LONGTEXT
,
VLC_FALSE
);
add_string
(
SOUT_CFG_PREFIX
"analyse"
,
""
,
NULL
,
"Analyse mode"
,
""
,
VLC_FALSE
);
add_bool
(
SOUT_CFG_PREFIX
"loopfilter"
,
1
,
NULL
,
LOOPF_TEXT
,
LOOPF_LONGTEXT
,
VLC_FALSE
);
add_string
(
SOUT_CFG_PREFIX
"analyse"
,
""
,
NULL
,
ANALYSE_TEXT
,
ANALYSE_LONGTEXT
,
VLC_FALSE
);
change_string_list
(
enc_analyse_list
,
enc_analyse_list_text
,
0
);
set_callbacks
(
Open
,
Close
);
vlc_module_end
();
add_integer
(
SOUT_CFG_PREFIX
"keyint"
,
250
,
NULL
,
KEYINT_TEXT
,
KEYINT_LONGTEXT
,
VLC_FALSE
);
add_integer
(
SOUT_CFG_PREFIX
"idrint"
,
2
,
NULL
,
IDRINT_TEXT
,
IDRINT_LONGTEXT
,
VLC_FALSE
);
add_integer
(
SOUT_CFG_PREFIX
"bframes"
,
0
,
NULL
,
BFRAMES_TEXT
,
BFRAMES_LONGTEXT
,
VLC_FALSE
);
change_integer_range
(
0
,
16
);
add_integer
(
SOUT_CFG_PREFIX
"frameref"
,
1
,
NULL
,
FRAMEREF_TEXT
,
FRAMEREF_LONGTEXT
,
VLC_FALSE
);
change_integer_range
(
1
,
15
);
add_integer
(
SOUT_CFG_PREFIX
"scenecut"
,
40
,
NULL
,
SCENE_TEXT
,
SCENE_LONGTEXT
,
VLC_FALSE
);
change_integer_range
(
-
1
,
100
);
vlc_module_end
();
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
const
char
*
ppsz_sout_options
[]
=
{
"qp"
,
"cabac"
,
"loopfilter"
,
"analyse"
,
NULL
"qp"
,
"qp-max"
,
"qp-max"
,
"cabac"
,
"loopfilter"
,
"analyse"
,
"keyint"
,
"idrint"
,
"bframes"
,
"frameref"
,
NULL
};
static
block_t
*
Encode
(
encoder_t
*
,
picture_t
*
);
...
...
@@ -86,11 +169,14 @@ static int Open ( vlc_object_t *p_this )
encoder_t
*
p_enc
=
(
encoder_t
*
)
p_this
;
encoder_sys_t
*
p_sys
;
vlc_value_t
val
;
int
i_qmin
=
0
,
i_qmax
=
0
;
if
(
p_enc
->
fmt_out
.
i_codec
!=
VLC_FOURCC
(
'h'
,
'2'
,
'6'
,
'4'
)
&&
!
p_enc
->
b_force
)
if
(
p_enc
->
fmt_out
.
i_codec
!=
VLC_FOURCC
(
'h'
,
'2'
,
'6'
,
'4'
)
&&
!
p_enc
->
b_force
)
{
return
VLC_EGENERIC
;
}
if
(
p_enc
->
fmt_in
.
video
.
i_width
%
16
!=
0
||
p_enc
->
fmt_in
.
video
.
i_height
%
16
!=
0
)
{
...
...
@@ -112,20 +198,35 @@ static int Open ( vlc_object_t *p_this )
x264_param_default
(
&
p_sys
->
param
);
p_sys
->
param
.
i_width
=
p_enc
->
fmt_in
.
video
.
i_width
;
p_sys
->
param
.
i_height
=
p_enc
->
fmt_in
.
video
.
i_height
;
p_sys
->
param
.
i_idrframe
=
1
;
if
(
p_enc
->
i_iframes
>
0
)
{
p_sys
->
param
.
i_iframe
=
p_enc
->
i_iframes
;
}
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"qp-min"
,
&
val
);
if
(
val
.
i_int
>=
1
&&
val
.
i_int
<=
51
)
i_qmin
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"qp-max"
,
&
val
);
if
(
val
.
i_int
>=
1
&&
val
.
i_int
<=
51
)
i_qmax
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"qp"
,
&
val
);
if
(
val
.
i_int
>=
1
&&
val
.
i_int
<=
51
)
{
if
(
i_qmin
>
val
.
i_int
)
i_qmin
=
val
.
i_int
;
if
(
i_qmax
<
val
.
i_int
)
i_qmax
=
val
.
i_int
;
#if X264_BUILD >= 0x000a
p_sys
->
param
.
rc
.
i_qp_constant
=
val
.
i_int
;
p_sys
->
param
.
rc
.
i_qp_min
=
i_qmin
;
p_sys
->
param
.
rc
.
i_qp_max
=
i_qmax
;
#else
p_sys
->
param
.
i_qp_constant
=
val
.
i_int
;
#endif
}
else
{
/* No QP -> constant bitrate */
#if X264_BUILD >= 0x000a
p_sys
->
param
.
rc
.
i_bitrate
=
p_enc
->
fmt_out
.
i_bitrate
/
1000
;
p_sys
->
param
.
rc
.
i_rc_buffer_size
=
p_sys
->
param
.
rc
.
i_bitrate
;
p_sys
->
param
.
rc
.
i_rc_init_buffer
=
p_sys
->
param
.
rc
.
i_bitrate
/
4
;
#endif
}
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"cabac"
,
&
val
);
p_sys
->
param
.
b_cabac
=
val
.
b_bool
;
...
...
@@ -133,6 +234,43 @@ static int Open ( vlc_object_t *p_this )
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"loopfilter"
,
&
val
);
p_sys
->
param
.
b_deblocking_filter
=
val
.
b_bool
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"keyint"
,
&
val
);
if
(
val
.
i_int
>
0
)
p_sys
->
param
.
i_iframe
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"idrint"
,
&
val
);
if
(
val
.
i_int
>
0
)
p_sys
->
param
.
i_idrframe
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"bframes"
,
&
val
);
if
(
val
.
i_int
>=
0
&&
val
.
i_int
<=
16
)
p_sys
->
param
.
i_bframe
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"frameref"
,
&
val
);
if
(
val
.
i_int
>
0
&&
val
.
i_int
<=
15
)
p_sys
->
param
.
i_frame_reference
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"scenecut"
,
&
val
);
if
(
val
.
i_int
>=
-
1
&&
val
.
i_int
<=
100
)
p_sys
->
param
.
i_scenecut_threshold
=
val
.
i_int
;
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"analyse"
,
&
val
);
if
(
!
strcmp
(
val
.
psz_string
,
"none"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
0
;
}
else
if
(
!
strcmp
(
val
.
psz_string
,
"fast"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
X264_ANALYSE_I4x4
;
}
else
if
(
!
strcmp
(
val
.
psz_string
,
"normal"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
X264_ANALYSE_I4x4
|
X264_ANALYSE_PSUB16x16
;
}
else
if
(
!
strcmp
(
val
.
psz_string
,
"all"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
X264_ANALYSE_I4x4
|
X264_ANALYSE_PSUB16x16
|
X264_ANALYSE_PSUB8x8
;
}
if
(
p_enc
->
fmt_in
.
video
.
i_aspect
>
0
)
{
int64_t
i_num
,
i_den
;
...
...
@@ -164,29 +302,12 @@ static int Open ( vlc_object_t *p_this )
p_sys
->
param
.
cpu
&=
~
(
X264_CPU_SSE
|
X264_CPU_SSE2
);
}
var_Get
(
p_enc
,
SOUT_CFG_PREFIX
"analyse"
,
&
val
);
if
(
!
strcmp
(
val
.
psz_string
,
"none"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
0
;
}
else
if
(
!
strcmp
(
val
.
psz_string
,
"fast"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
X264_ANALYSE_I4x4
;
}
else
if
(
!
strcmp
(
val
.
psz_string
,
"normal"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
X264_ANALYSE_I4x4
|
X264_ANALYSE_PSUB16x16
;
}
else
if
(
!
strcmp
(
val
.
psz_string
,
"all"
)
)
{
p_sys
->
param
.
analyse
.
inter
=
X264_ANALYSE_I4x4
|
X264_ANALYSE_PSUB16x16
|
X264_ANALYSE_PSUB8x8
;
}
/* Open the encoder */
p_sys
->
h
=
x264_encoder_open
(
&
p_sys
->
param
);
/* alloc mem */
p_sys
->
i_buffer
=
4
*
p_enc
->
fmt_in
.
video
.
i_width
*
p_enc
->
fmt_in
.
video
.
i_height
+
1000
;
p_sys
->
i_buffer
=
4
*
p_enc
->
fmt_in
.
video
.
i_width
*
p_enc
->
fmt_in
.
video
.
i_height
+
1000
;
p_sys
->
p_buffer
=
malloc
(
p_sys
->
i_buffer
);
/* get the globals headers */
...
...
@@ -268,7 +389,6 @@ static void Close( vlc_object_t *p_this )
encoder_t
*
p_enc
=
(
encoder_t
*
)
p_this
;
encoder_sys_t
*
p_sys
=
p_enc
->
p_sys
;
x264_encoder_close
(
p_sys
->
h
);
free
(
p_sys
->
p_buffer
);
free
(
p_sys
);
...
...
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