2 * H.264 encoding using the x264 library
3 * Copyright (C) 2005 Mans Rullgard <mans@mansr.com>
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/opt.h"
32 typedef struct X264Context
{
53 static void X264_log(void *p
, int level
, const char *fmt
, va_list args
)
55 static const int level_map
[] = {
56 [X264_LOG_ERROR
] = AV_LOG_ERROR
,
57 [X264_LOG_WARNING
] = AV_LOG_WARNING
,
58 [X264_LOG_INFO
] = AV_LOG_INFO
,
59 [X264_LOG_DEBUG
] = AV_LOG_DEBUG
62 if (level
< 0 || level
> X264_LOG_DEBUG
)
65 av_vlog(p
, level_map
[level
], fmt
, args
);
69 static int encode_nals(AVCodecContext
*ctx
, uint8_t *buf
, int size
,
70 x264_nal_t
*nals
, int nnal
, int skip_sei
)
72 X264Context
*x4
= ctx
->priv_data
;
76 /* Write the SEI as part of the first frame. */
77 if (x4
->sei_size
> 0 && nnal
> 0) {
78 memcpy(p
, x4
->sei
, x4
->sei_size
);
83 for (i
= 0; i
< nnal
; i
++){
84 /* Don't put the SEI in extradata. */
85 if (skip_sei
&& nals
[i
].i_type
== NAL_SEI
) {
86 x4
->sei_size
= nals
[i
].i_payload
;
87 x4
->sei
= av_malloc(x4
->sei_size
);
88 memcpy(x4
->sei
, nals
[i
].p_payload
, nals
[i
].i_payload
);
91 memcpy(p
, nals
[i
].p_payload
, nals
[i
].i_payload
);
92 p
+= nals
[i
].i_payload
;
98 static int X264_frame(AVCodecContext
*ctx
, uint8_t *buf
,
99 int bufsize
, void *data
)
101 X264Context
*x4
= ctx
->priv_data
;
102 AVFrame
*frame
= data
;
105 x264_picture_t pic_out
;
107 x264_picture_init( &x4
->pic
);
108 x4
->pic
.img
.i_csp
= X264_CSP_I420
;
109 x4
->pic
.img
.i_plane
= 3;
112 for (i
= 0; i
< 3; i
++) {
113 x4
->pic
.img
.plane
[i
] = frame
->data
[i
];
114 x4
->pic
.img
.i_stride
[i
] = frame
->linesize
[i
];
117 x4
->pic
.i_pts
= frame
->pts
;
119 frame
->pict_type
== AV_PICTURE_TYPE_I ? X264_TYPE_KEYFRAME
:
120 frame
->pict_type
== AV_PICTURE_TYPE_P ? X264_TYPE_P
:
121 frame
->pict_type
== AV_PICTURE_TYPE_B ? X264_TYPE_B
:
123 if (x4
->params
.b_tff
!= frame
->top_field_first
) {
124 x4
->params
.b_tff
= frame
->top_field_first
;
125 x264_encoder_reconfig(x4
->enc
, &x4
->params
);
130 if (x264_encoder_encode(x4
->enc
, &nal
, &nnal
, frame?
&x4
->pic
: NULL
, &pic_out
) < 0)
133 bufsize
= encode_nals(ctx
, buf
, bufsize
, nal
, nnal
, 0);
136 } while (!bufsize
&& !frame
&& x264_encoder_delayed_frames(x4
->enc
));
138 /* FIXME: libx264 now provides DTS, but AVFrame doesn't have a field for it. */
139 x4
->out_pic
.pts
= pic_out
.i_pts
;
141 switch (pic_out
.i_type
) {
144 x4
->out_pic
.pict_type
= AV_PICTURE_TYPE_I
;
147 x4
->out_pic
.pict_type
= AV_PICTURE_TYPE_P
;
151 x4
->out_pic
.pict_type
= AV_PICTURE_TYPE_B
;
155 x4
->out_pic
.key_frame
= pic_out
.b_keyframe
;
157 x4
->out_pic
.quality
= (pic_out
.i_qpplus1
- 1) * FF_QP2LAMBDA
;
162 static av_cold
int X264_close(AVCodecContext
*avctx
)
164 X264Context
*x4
= avctx
->priv_data
;
166 av_freep(&avctx
->extradata
);
170 x264_encoder_close(x4
->enc
);
175 static av_cold
int X264_init(AVCodecContext
*avctx
)
177 X264Context
*x4
= avctx
->priv_data
;
180 x264_param_default(&x4
->params
);
182 x4
->params
.i_keyint_max
= avctx
->gop_size
;
184 x4
->params
.i_bframe
= avctx
->max_b_frames
;
185 x4
->params
.b_cabac
= avctx
->coder_type
== FF_CODER_TYPE_AC
;
186 x4
->params
.i_bframe_adaptive
= avctx
->b_frame_strategy
;
187 x4
->params
.i_bframe_bias
= avctx
->bframebias
;
188 x4
->params
.i_bframe_pyramid
= avctx
->flags2
& CODEC_FLAG2_BPYRAMID ? X264_B_PYRAMID_NORMAL
: X264_B_PYRAMID_NONE
;
189 avctx
->has_b_frames
= avctx
->flags2
& CODEC_FLAG2_BPYRAMID ?
2 : !!avctx
->max_b_frames
;
191 x4
->params
.i_keyint_min
= avctx
->keyint_min
;
192 if (x4
->params
.i_keyint_min
> x4
->params
.i_keyint_max
)
193 x4
->params
.i_keyint_min
= x4
->params
.i_keyint_max
;
195 x4
->params
.i_scenecut_threshold
= avctx
->scenechange_threshold
;
197 x4
->params
.b_deblocking_filter
= avctx
->flags
& CODEC_FLAG_LOOP_FILTER
;
198 x4
->params
.i_deblocking_filter_alphac0
= avctx
->deblockalpha
;
199 x4
->params
.i_deblocking_filter_beta
= avctx
->deblockbeta
;
201 x4
->params
.rc
.i_qp_min
= avctx
->qmin
;
202 x4
->params
.rc
.i_qp_max
= avctx
->qmax
;
203 x4
->params
.rc
.i_qp_step
= avctx
->max_qdiff
;
205 x4
->params
.rc
.f_qcompress
= avctx
->qcompress
; /* 0.0 => cbr, 1.0 => constant qp */
206 x4
->params
.rc
.f_qblur
= avctx
->qblur
; /* temporally blur quants */
207 x4
->params
.rc
.f_complexity_blur
= avctx
->complexityblur
;
209 x4
->params
.i_frame_reference
= avctx
->refs
;
211 x4
->params
.analyse
.inter
= 0;
212 if (avctx
->partitions
) {
213 if (avctx
->partitions
& X264_PART_I4X4
)
214 x4
->params
.analyse
.inter
|= X264_ANALYSE_I4x4
;
215 if (avctx
->partitions
& X264_PART_I8X8
)
216 x4
->params
.analyse
.inter
|= X264_ANALYSE_I8x8
;
217 if (avctx
->partitions
& X264_PART_P8X8
)
218 x4
->params
.analyse
.inter
|= X264_ANALYSE_PSUB16x16
;
219 if (avctx
->partitions
& X264_PART_P4X4
)
220 x4
->params
.analyse
.inter
|= X264_ANALYSE_PSUB8x8
;
221 if (avctx
->partitions
& X264_PART_B8X8
)
222 x4
->params
.analyse
.inter
|= X264_ANALYSE_BSUB16x16
;
225 x4
->params
.analyse
.i_direct_mv_pred
= avctx
->directpred
;
227 x4
->params
.analyse
.b_weighted_bipred
= avctx
->flags2
& CODEC_FLAG2_WPRED
;
228 x4
->params
.analyse
.i_weighted_pred
= avctx
->weighted_p_pred
;
230 if (avctx
->me_method
== ME_EPZS
)
231 x4
->params
.analyse
.i_me_method
= X264_ME_DIA
;
232 else if (avctx
->me_method
== ME_HEX
)
233 x4
->params
.analyse
.i_me_method
= X264_ME_HEX
;
234 else if (avctx
->me_method
== ME_UMH
)
235 x4
->params
.analyse
.i_me_method
= X264_ME_UMH
;
236 else if (avctx
->me_method
== ME_FULL
)
237 x4
->params
.analyse
.i_me_method
= X264_ME_ESA
;
238 else if (avctx
->me_method
== ME_TESA
)
239 x4
->params
.analyse
.i_me_method
= X264_ME_TESA
;
240 else x4
->params
.analyse
.i_me_method
= X264_ME_HEX
;
242 x4
->params
.analyse
.b_psy
= avctx
->flags2
& CODEC_FLAG2_PSY
;
244 x4
->params
.analyse
.i_me_range
= avctx
->me_range
;
245 x4
->params
.analyse
.i_subpel_refine
= avctx
->me_subpel_quality
;
247 x4
->params
.analyse
.b_mixed_references
= avctx
->flags2
& CODEC_FLAG2_MIXED_REFS
;
248 x4
->params
.analyse
.b_chroma_me
= avctx
->me_cmp
& FF_CMP_CHROMA
;
249 x4
->params
.analyse
.b_transform_8x8
= avctx
->flags2
& CODEC_FLAG2_8X8DCT
;
250 x4
->params
.analyse
.b_fast_pskip
= avctx
->flags2
& CODEC_FLAG2_FASTPSKIP
;
252 x4
->params
.analyse
.i_trellis
= avctx
->trellis
;
253 x4
->params
.analyse
.i_noise_reduction
= avctx
->noise_reduction
;
255 if (avctx
->level
> 0)
256 x4
->params
.i_level_idc
= avctx
->level
;
258 if (x4
->preset
|| x4
->tune
)
259 if (x264_param_default_preset(&x4
->params
, x4
->preset
, x4
->tune
) < 0) {
260 av_log(avctx
, AV_LOG_ERROR
, "Error setting preset/tune %s/%s.\n", x4
->preset
, x4
->tune
);
261 return AVERROR(EINVAL
);
264 x4
->params
.pf_log
= X264_log
;
265 x4
->params
.p_log_private
= avctx
;
266 x4
->params
.i_log_level
= X264_LOG_DEBUG
;
268 x4
->params
.b_intra_refresh
= avctx
->flags2
& CODEC_FLAG2_INTRA_REFRESH
;
269 if (avctx
->bit_rate
) {
270 x4
->params
.rc
.i_bitrate
= avctx
->bit_rate
/ 1000;
271 x4
->params
.rc
.i_rc_method
= X264_RC_ABR
;
273 x4
->params
.rc
.i_vbv_buffer_size
= avctx
->rc_buffer_size
/ 1000;
274 x4
->params
.rc
.i_vbv_max_bitrate
= avctx
->rc_max_rate
/ 1000;
275 x4
->params
.rc
.b_stat_write
= avctx
->flags
& CODEC_FLAG_PASS1
;
276 if (avctx
->flags
& CODEC_FLAG_PASS2
) {
277 x4
->params
.rc
.b_stat_read
= 1;
279 #if FF_API_X264_GLOBAL_OPTS
281 x4
->params
.rc
.i_rc_method
= X264_RC_CRF
;
282 x4
->params
.rc
.f_rf_constant
= avctx
->crf
;
283 x4
->params
.rc
.f_rf_constant_max
= avctx
->crf_max
;
284 } else if (avctx
->cqp
> -1) {
285 x4
->params
.rc
.i_rc_method
= X264_RC_CQP
;
286 x4
->params
.rc
.i_qp_constant
= avctx
->cqp
;
291 x4
->params
.rc
.i_rc_method
= X264_RC_CRF
;
292 x4
->params
.rc
.f_rf_constant
= x4
->crf
;
293 } else if (x4
->cqp
>= 0) {
294 x4
->params
.rc
.i_rc_method
= X264_RC_CQP
;
295 x4
->params
.rc
.i_qp_constant
= x4
->cqp
;
299 if (avctx
->rc_buffer_size
&& avctx
->rc_initial_buffer_occupancy
&&
300 (avctx
->rc_initial_buffer_occupancy
<= avctx
->rc_buffer_size
)) {
301 x4
->params
.rc
.f_vbv_buffer_init
=
302 (float)avctx
->rc_initial_buffer_occupancy
/ avctx
->rc_buffer_size
;
305 x4
->params
.rc
.b_mb_tree
= !!(avctx
->flags2
& CODEC_FLAG2_MBTREE
);
306 x4
->params
.rc
.f_ip_factor
= 1 / fabs(avctx
->i_quant_factor
);
307 x4
->params
.rc
.f_pb_factor
= avctx
->b_quant_factor
;
308 x4
->params
.analyse
.i_chroma_qp_offset
= avctx
->chromaoffset
;
310 #if FF_API_X264_GLOBAL_OPTS
311 if (avctx
->aq_mode
>= 0)
312 x4
->params
.rc
.i_aq_mode
= avctx
->aq_mode
;
313 if (avctx
->aq_strength
>= 0)
314 x4
->params
.rc
.f_aq_strength
= avctx
->aq_strength
;
315 if (avctx
->psy_rd
>= 0)
316 x4
->params
.analyse
.f_psy_rd
= avctx
->psy_rd
;
317 if (avctx
->psy_trellis
>= 0)
318 x4
->params
.analyse
.f_psy_trellis
= avctx
->psy_trellis
;
319 if (avctx
->rc_lookahead
>= 0)
320 x4
->params
.rc
.i_lookahead
= avctx
->rc_lookahead
;
323 if (x4
->aq_mode
>= 0)
324 x4
->params
.rc
.i_aq_mode
= x4
->aq_mode
;
325 if (x4
->aq_strength
>= 0)
326 x4
->params
.rc
.f_aq_strength
= x4
->aq_strength
;
328 x4
->params
.analyse
.f_psy_rd
= x4
->psy_rd
;
329 if (x4
->psy_trellis
>= 0)
330 x4
->params
.analyse
.f_psy_trellis
= x4
->psy_trellis
;
331 if (x4
->rc_lookahead
>= 0)
332 x4
->params
.rc
.i_lookahead
= x4
->rc_lookahead
;
335 if (x4
->fastfirstpass
)
336 x264_param_apply_fastfirstpass(&x4
->params
);
339 if (x264_param_apply_profile(&x4
->params
, x4
->profile
) < 0) {
340 av_log(avctx
, AV_LOG_ERROR
, "Error setting profile %s.\n", x4
->profile
);
341 return AVERROR(EINVAL
);
344 x4
->params
.i_width
= avctx
->width
;
345 x4
->params
.i_height
= avctx
->height
;
346 x4
->params
.vui
.i_sar_width
= avctx
->sample_aspect_ratio
.num
;
347 x4
->params
.vui
.i_sar_height
= avctx
->sample_aspect_ratio
.den
;
348 x4
->params
.i_fps_num
= x4
->params
.i_timebase_den
= avctx
->time_base
.den
;
349 x4
->params
.i_fps_den
= x4
->params
.i_timebase_num
= avctx
->time_base
.num
;
351 x4
->params
.analyse
.b_psnr
= avctx
->flags
& CODEC_FLAG_PSNR
;
352 x4
->params
.analyse
.b_ssim
= avctx
->flags2
& CODEC_FLAG2_SSIM
;
354 x4
->params
.b_aud
= avctx
->flags2
& CODEC_FLAG2_AUD
;
356 x4
->params
.i_threads
= avctx
->thread_count
;
358 x4
->params
.b_interlaced
= avctx
->flags
& CODEC_FLAG_INTERLACED_DCT
;
360 x4
->params
.b_open_gop
= !(avctx
->flags
& CODEC_FLAG_CLOSED_GOP
);
362 x4
->params
.i_slice_count
= avctx
->slices
;
364 x4
->params
.vui
.b_fullrange
= avctx
->pix_fmt
== PIX_FMT_YUVJ420P
;
366 if (avctx
->flags
& CODEC_FLAG_GLOBAL_HEADER
)
367 x4
->params
.b_repeat_headers
= 0;
369 // update AVCodecContext with x264 parameters
370 avctx
->has_b_frames
= x4
->params
.i_bframe ?
371 x4
->params
.i_bframe_pyramid ?
2 : 1 : 0;
372 avctx
->bit_rate
= x4
->params
.rc
.i_bitrate
*1000;
373 #if FF_API_X264_GLOBAL_OPTS
374 avctx
->crf
= x4
->params
.rc
.f_rf_constant
;
377 x4
->enc
= x264_encoder_open(&x4
->params
);
381 avctx
->coded_frame
= &x4
->out_pic
;
383 if (avctx
->flags
& CODEC_FLAG_GLOBAL_HEADER
) {
387 s
= x264_encoder_headers(x4
->enc
, &nal
, &nnal
);
389 for (i
= 0; i
< nnal
; i
++)
390 if (nal
[i
].i_type
== NAL_SEI
)
391 av_log(avctx
, AV_LOG_INFO
, "%s\n", nal
[i
].p_payload
+25);
393 avctx
->extradata
= av_malloc(s
);
394 avctx
->extradata_size
= encode_nals(avctx
, avctx
->extradata
, s
, nal
, nnal
, 1);
400 #define OFFSET(x) offsetof(X264Context, x)
401 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
402 static const AVOption options
[] = {
403 { "preset", "Set the encoding preset (cf. x264 --fullhelp)", OFFSET(preset
), FF_OPT_TYPE_STRING
, { .str
= "medium" }, 0, 0, VE
},
404 { "tune", "Tune the encoding params (cf. x264 --fullhelp)", OFFSET(tune
), FF_OPT_TYPE_STRING
, { 0 }, 0, 0, VE
},
405 { "profile", "Set profile restrictions (cf. x264 --fullhelp) ", OFFSET(profile
), FF_OPT_TYPE_STRING
, { 0 }, 0, 0, VE
},
406 { "fastfirstpass", "Use fast settings when encoding first pass", OFFSET(fastfirstpass
), FF_OPT_TYPE_INT
, { 1 }, 0, 1, VE
},
407 { "crf", "Select the quality for constant quality mode", OFFSET(crf
), FF_OPT_TYPE_FLOAT
, {-1 }, -1, FLT_MAX
, VE
},
408 { "cqp", "Constant quantization parameter rate control method",OFFSET(cqp
), FF_OPT_TYPE_INT
, {-1 }, -1, INT_MAX
, VE
},
409 { "aq_mode", "AQ method", OFFSET(aq_mode
), FF_OPT_TYPE_INT
, {-1 }, -1, INT_MAX
, VE
, "aq_mode"},
410 { "none", NULL
, 0, FF_OPT_TYPE_CONST
, {X264_AQ_NONE
}, INT_MIN
, INT_MAX
, VE
, "aq_mode" },
411 { "variance", "Variance AQ (complexity mask)", 0, FF_OPT_TYPE_CONST
, {X264_AQ_VARIANCE
}, INT_MIN
, INT_MAX
, VE
, "aq_mode" },
412 { "autovariance", "Auto-variance AQ (experimental)", 0, FF_OPT_TYPE_CONST
, {X264_AQ_AUTOVARIANCE
}, INT_MIN
, INT_MAX
, VE
, "aq_mode" },
413 { "aq_strength", "AQ strength. Reduces blocking and blurring in flat and textured areas.", OFFSET(aq_strength
), FF_OPT_TYPE_FLOAT
, {-1}, -1, FLT_MAX
, VE
},
414 { "pdy_rd", "Psy RD strength.", OFFSET(psy_rd
), FF_OPT_TYPE_FLOAT
, {-1 }, -1, FLT_MAX
, VE
},
415 { "psy_trellis", "Psy trellis strength", OFFSET(psy_trellis
), FF_OPT_TYPE_FLOAT
, {-1 }, -1, FLT_MAX
, VE
},
416 { "rc_lookahead", "Number of frames to look ahead for frametype and ratecontrol", OFFSET(rc_lookahead
), FF_OPT_TYPE_INT
, {-1 }, -1, INT_MAX
, VE
},
420 static const AVClass
class = {
421 .class_name
= "libx264",
422 .item_name
= av_default_item_name
,
424 .version
= LIBAVUTIL_VERSION_INT
,
427 static const AVCodecDefault x264_defaults
[] = {
432 AVCodec ff_libx264_encoder
= {
434 .type
= AVMEDIA_TYPE_VIDEO
,
436 .priv_data_size
= sizeof(X264Context
),
438 .encode
= X264_frame
,
440 .capabilities
= CODEC_CAP_DELAY
,
441 .pix_fmts
= (const enum PixelFormat
[]) { PIX_FMT_YUV420P
, PIX_FMT_YUVJ420P
, PIX_FMT_NONE
},
442 .long_name
= NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
443 .priv_class
= &class,
444 .defaults
= x264_defaults
,