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
07a227b4
Commit
07a227b4
authored
Apr 16, 2011
by
Baptiste Coudurier
Committed by
Anton Khirnov
Aug 08, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libx264: add preset, tune, profile and fastfirstpass private options
Signed-off-by:
Anton Khirnov
<
anton@khirnov.net
>
parent
b2700a5c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
79 additions
and
33 deletions
+79
-33
libx264.c
libavcodec/libx264.c
+79
-33
No files found.
libavcodec/libx264.c
View file @
07a227b4
...
...
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/opt.h"
#include "avcodec.h"
#include <x264.h>
#include <math.h>
...
...
@@ -27,12 +28,17 @@
#include <string.h>
typedef
struct
X264Context
{
AVClass
*
class
;
x264_param_t
params
;
x264_t
*
enc
;
x264_picture_t
pic
;
uint8_t
*
sei
;
int
sei_size
;
AVFrame
out_pic
;
char
*
preset
;
char
*
tune
;
char
*
profile
;
int
fastfirstpass
;
}
X264Context
;
static
void
X264_log
(
void
*
p
,
int
level
,
const
char
*
fmt
,
va_list
args
)
...
...
@@ -163,32 +169,7 @@ static av_cold int X264_init(AVCodecContext *avctx)
x4
->
sei_size
=
0
;
x264_param_default
(
&
x4
->
params
);
x4
->
params
.
pf_log
=
X264_log
;
x4
->
params
.
p_log_private
=
avctx
;
x4
->
params
.
i_keyint_max
=
avctx
->
gop_size
;
x4
->
params
.
b_intra_refresh
=
avctx
->
flags2
&
CODEC_FLAG2_INTRA_REFRESH
;
x4
->
params
.
rc
.
i_bitrate
=
avctx
->
bit_rate
/
1000
;
x4
->
params
.
rc
.
i_vbv_buffer_size
=
avctx
->
rc_buffer_size
/
1000
;
x4
->
params
.
rc
.
i_vbv_max_bitrate
=
avctx
->
rc_max_rate
/
1000
;
x4
->
params
.
rc
.
b_stat_write
=
avctx
->
flags
&
CODEC_FLAG_PASS1
;
if
(
avctx
->
flags
&
CODEC_FLAG_PASS2
)
{
x4
->
params
.
rc
.
b_stat_read
=
1
;
}
else
{
if
(
avctx
->
crf
)
{
x4
->
params
.
rc
.
i_rc_method
=
X264_RC_CRF
;
x4
->
params
.
rc
.
f_rf_constant
=
avctx
->
crf
;
x4
->
params
.
rc
.
f_rf_constant_max
=
avctx
->
crf_max
;
}
else
if
(
avctx
->
cqp
>
-
1
)
{
x4
->
params
.
rc
.
i_rc_method
=
X264_RC_CQP
;
x4
->
params
.
rc
.
i_qp_constant
=
avctx
->
cqp
;
}
}
// if neither crf nor cqp modes are selected we have to enable the RC
// we do it this way because we cannot check if the bitrate has been set
if
(
!
(
avctx
->
crf
||
(
avctx
->
cqp
>
-
1
)))
x4
->
params
.
rc
.
i_rc_method
=
X264_RC_ABR
;
x4
->
params
.
i_bframe
=
avctx
->
max_b_frames
;
x4
->
params
.
b_cabac
=
avctx
->
coder_type
==
FF_CODER_TYPE_AC
;
...
...
@@ -217,13 +198,6 @@ static av_cold int X264_init(AVCodecContext *avctx)
x4
->
params
.
i_frame_reference
=
avctx
->
refs
;
x4
->
params
.
i_width
=
avctx
->
width
;
x4
->
params
.
i_height
=
avctx
->
height
;
x4
->
params
.
vui
.
i_sar_width
=
avctx
->
sample_aspect_ratio
.
num
;
x4
->
params
.
vui
.
i_sar_height
=
avctx
->
sample_aspect_ratio
.
den
;
x4
->
params
.
i_fps_num
=
x4
->
params
.
i_timebase_den
=
avctx
->
time_base
.
den
;
x4
->
params
.
i_fps_den
=
x4
->
params
.
i_timebase_num
=
avctx
->
time_base
.
num
;
x4
->
params
.
analyse
.
inter
=
0
;
if
(
avctx
->
partitions
)
{
if
(
avctx
->
partitions
&
X264_PART_I4X4
)
...
...
@@ -277,6 +251,39 @@ static av_cold int X264_init(AVCodecContext *avctx)
if
(
avctx
->
level
>
0
)
x4
->
params
.
i_level_idc
=
avctx
->
level
;
if
(
x4
->
preset
||
x4
->
tune
)
if
(
x264_param_default_preset
(
&
x4
->
params
,
x4
->
preset
,
x4
->
tune
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error setting preset/tune %s/%s.
\n
"
,
x4
->
preset
,
x4
->
tune
);
return
AVERROR
(
EINVAL
);
}
x4
->
params
.
pf_log
=
X264_log
;
x4
->
params
.
p_log_private
=
avctx
;
x4
->
params
.
i_log_level
=
X264_LOG_DEBUG
;
x4
->
params
.
b_intra_refresh
=
avctx
->
flags2
&
CODEC_FLAG2_INTRA_REFRESH
;
x4
->
params
.
rc
.
i_bitrate
=
avctx
->
bit_rate
/
1000
;
x4
->
params
.
rc
.
i_vbv_buffer_size
=
avctx
->
rc_buffer_size
/
1000
;
x4
->
params
.
rc
.
i_vbv_max_bitrate
=
avctx
->
rc_max_rate
/
1000
;
x4
->
params
.
rc
.
b_stat_write
=
avctx
->
flags
&
CODEC_FLAG_PASS1
;
if
(
avctx
->
flags
&
CODEC_FLAG_PASS2
)
{
x4
->
params
.
rc
.
b_stat_read
=
1
;
}
else
{
if
(
avctx
->
crf
)
{
x4
->
params
.
rc
.
i_rc_method
=
X264_RC_CRF
;
x4
->
params
.
rc
.
f_rf_constant
=
avctx
->
crf
;
x4
->
params
.
rc
.
f_rf_constant_max
=
avctx
->
crf_max
;
}
else
if
(
avctx
->
cqp
>
-
1
)
{
x4
->
params
.
rc
.
i_rc_method
=
X264_RC_CQP
;
x4
->
params
.
rc
.
i_qp_constant
=
avctx
->
cqp
;
}
}
// if neither crf nor cqp modes are selected we have to enable the RC
// we do it this way because we cannot check if the bitrate has been set
if
(
!
(
avctx
->
crf
||
(
avctx
->
cqp
>
-
1
)))
x4
->
params
.
rc
.
i_rc_method
=
X264_RC_ABR
;
if
(
avctx
->
rc_buffer_size
&&
avctx
->
rc_initial_buffer_occupancy
&&
(
avctx
->
rc_initial_buffer_occupancy
<=
avctx
->
rc_buffer_size
))
{
x4
->
params
.
rc
.
f_vbv_buffer_init
=
...
...
@@ -288,9 +295,24 @@ static av_cold int X264_init(AVCodecContext *avctx)
x4
->
params
.
rc
.
f_pb_factor
=
avctx
->
b_quant_factor
;
x4
->
params
.
analyse
.
i_chroma_qp_offset
=
avctx
->
chromaoffset
;
if
(
x4
->
fastfirstpass
)
x264_param_apply_fastfirstpass
(
&
x4
->
params
);
if
(
x4
->
profile
)
if
(
x264_param_apply_profile
(
&
x4
->
params
,
x4
->
profile
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error setting profile %s.
\n
"
,
x4
->
profile
);
return
AVERROR
(
EINVAL
);
}
x4
->
params
.
i_width
=
avctx
->
width
;
x4
->
params
.
i_height
=
avctx
->
height
;
x4
->
params
.
vui
.
i_sar_width
=
avctx
->
sample_aspect_ratio
.
num
;
x4
->
params
.
vui
.
i_sar_height
=
avctx
->
sample_aspect_ratio
.
den
;
x4
->
params
.
i_fps_num
=
x4
->
params
.
i_timebase_den
=
avctx
->
time_base
.
den
;
x4
->
params
.
i_fps_den
=
x4
->
params
.
i_timebase_num
=
avctx
->
time_base
.
num
;
x4
->
params
.
analyse
.
b_psnr
=
avctx
->
flags
&
CODEC_FLAG_PSNR
;
x4
->
params
.
analyse
.
b_ssim
=
avctx
->
flags2
&
CODEC_FLAG2_SSIM
;
x4
->
params
.
i_log_level
=
X264_LOG_DEBUG
;
x4
->
params
.
b_aud
=
avctx
->
flags2
&
CODEC_FLAG2_AUD
;
...
...
@@ -307,6 +329,12 @@ static av_cold int X264_init(AVCodecContext *avctx)
if
(
avctx
->
flags
&
CODEC_FLAG_GLOBAL_HEADER
)
x4
->
params
.
b_repeat_headers
=
0
;
// update AVCodecContext with x264 parameters
avctx
->
has_b_frames
=
x4
->
params
.
i_bframe
?
x4
->
params
.
i_bframe_pyramid
?
2
:
1
:
0
;
avctx
->
bit_rate
=
x4
->
params
.
rc
.
i_bitrate
*
1000
;
avctx
->
crf
=
x4
->
params
.
rc
.
f_rf_constant
;
x4
->
enc
=
x264_encoder_open
(
&
x4
->
params
);
if
(
!
x4
->
enc
)
return
-
1
;
...
...
@@ -330,6 +358,23 @@ static av_cold int X264_init(AVCodecContext *avctx)
return
0
;
}
#define OFFSET(x) offsetof(X264Context, x)
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static
const
AVOption
options
[]
=
{
{
"preset"
,
"Set the encoding preset"
,
OFFSET
(
preset
),
FF_OPT_TYPE_STRING
,
{
0
},
0
,
0
,
VE
},
{
"tune"
,
"Tune the encoding params"
,
OFFSET
(
tune
),
FF_OPT_TYPE_STRING
,
{
0
},
0
,
0
,
VE
},
{
"profile"
,
"Set profile restrictions"
,
OFFSET
(
profile
),
FF_OPT_TYPE_STRING
,
{
0
},
0
,
0
,
VE
},
{
"fastfirstpass"
,
"Use fast settings when encoding first pass"
,
OFFSET
(
fastfirstpass
),
FF_OPT_TYPE_INT
,
{
1
},
0
,
1
,
VE
},
{
NULL
},
};
static
const
AVClass
class
=
{
.
class_name
=
"libx264"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
AVCodec
ff_libx264_encoder
=
{
.
name
=
"libx264"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
...
...
@@ -341,4 +386,5 @@ AVCodec ff_libx264_encoder = {
.
capabilities
=
CODEC_CAP_DELAY
,
.
pix_fmts
=
(
const
enum
PixelFormat
[])
{
PIX_FMT_YUV420P
,
PIX_FMT_YUVJ420P
,
PIX_FMT_NONE
},
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"
),
.
priv_class
=
&
class
,
};
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