2 * H.264 encoding using the x264 library
3 * Copyright (C) 2005 Mans Rullgard <mans@mansr.com>
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 typedef struct X264Context
{
39 X264_log(void *p
, int level
, const char *fmt
, va_list args
)
41 static const int level_map
[] = {
42 [X264_LOG_ERROR
] = AV_LOG_ERROR
,
43 [X264_LOG_WARNING
] = AV_LOG_WARNING
,
44 [X264_LOG_INFO
] = AV_LOG_INFO
,
45 [X264_LOG_DEBUG
] = AV_LOG_DEBUG
48 if(level
< 0 || level
> X264_LOG_DEBUG
)
51 av_vlog(p
, level_map
[level
], fmt
, args
);
56 encode_nals(AVCodecContext
*ctx
, uint8_t *buf
, int size
, x264_nal_t
*nals
, int nnal
, int skip_sei
)
58 X264Context
*x4
= ctx
->priv_data
;
62 /* Write the SEI as part of the first frame. */
63 if(x4
->sei_size
> 0 && nnal
> 0)
65 memcpy(p
, x4
->sei
, x4
->sei_size
);
70 for(i
= 0; i
< nnal
; i
++){
71 /* Don't put the SEI in extradata. */
72 if(skip_sei
&& nals
[i
].i_type
== NAL_SEI
)
74 x4
->sei
= av_malloc( 5 + nals
[i
].i_payload
* 4 / 3 );
75 if(x264_nal_encode(x4
->sei
, &x4
->sei_size
, 1, nals
+ i
) < 0)
79 s
= x264_nal_encode(p
, &size
, 1, nals
+ i
);
89 X264_frame(AVCodecContext
*ctx
, uint8_t *buf
, int bufsize
, void *data
)
91 X264Context
*x4
= ctx
->priv_data
;
92 AVFrame
*frame
= data
;
95 x264_picture_t pic_out
;
97 x4
->pic
.img
.i_csp
= X264_CSP_I420
;
98 x4
->pic
.img
.i_plane
= 3;
101 for(i
= 0; i
< 3; i
++){
102 x4
->pic
.img
.plane
[i
] = frame
->data
[i
];
103 x4
->pic
.img
.i_stride
[i
] = frame
->linesize
[i
];
106 x4
->pic
.i_pts
= frame
->pts
;
107 x4
->pic
.i_type
= X264_TYPE_AUTO
;
110 if(x264_encoder_encode(x4
->enc
, &nal
, &nnal
, frame
? &x4
->pic
: NULL
,
114 bufsize
= encode_nals(ctx
, buf
, bufsize
, nal
, nnal
, 0);
119 x4
->out_pic
.pts
= pic_out
.i_pts
;
121 switch(pic_out
.i_type
){
124 x4
->out_pic
.pict_type
= FF_I_TYPE
;
127 x4
->out_pic
.pict_type
= FF_P_TYPE
;
131 x4
->out_pic
.pict_type
= FF_B_TYPE
;
135 x4
->out_pic
.key_frame
= pic_out
.i_type
== X264_TYPE_IDR
;
136 x4
->out_pic
.quality
= (pic_out
.i_qpplus1
- 1) * FF_QP2LAMBDA
;
142 X264_close(AVCodecContext
*avctx
)
144 X264Context
*x4
= avctx
->priv_data
;
146 av_freep(&avctx
->extradata
);
150 x264_encoder_close(x4
->enc
);
156 X264_init(AVCodecContext
*avctx
)
158 X264Context
*x4
= avctx
->priv_data
;
161 x264_param_default(&x4
->params
);
163 x4
->params
.pf_log
= X264_log
;
164 x4
->params
.p_log_private
= avctx
;
166 x4
->params
.i_keyint_max
= avctx
->gop_size
;
167 x4
->params
.rc
.i_bitrate
= avctx
->bit_rate
/ 1000;
168 x4
->params
.rc
.i_vbv_buffer_size
= avctx
->rc_buffer_size
/ 1000;
169 x4
->params
.rc
.i_vbv_max_bitrate
= avctx
->rc_max_rate
/ 1000;
170 x4
->params
.rc
.b_stat_write
= avctx
->flags
& CODEC_FLAG_PASS1
;
171 if(avctx
->flags
& CODEC_FLAG_PASS2
) x4
->params
.rc
.b_stat_read
= 1;
174 x4
->params
.rc
.i_rc_method
= X264_RC_CRF
;
175 x4
->params
.rc
.f_rf_constant
= avctx
->crf
;
176 }else if(avctx
->cqp
> -1){
177 x4
->params
.rc
.i_rc_method
= X264_RC_CQP
;
178 x4
->params
.rc
.i_qp_constant
= avctx
->cqp
;
182 // if neither crf nor cqp modes are selected we have to enable the RC
183 // we do it this way because we cannot check if the bitrate has been set
184 if(!(avctx
->crf
|| (avctx
->cqp
> -1))) x4
->params
.rc
.i_rc_method
= X264_RC_ABR
;
186 x4
->params
.i_bframe
= avctx
->max_b_frames
;
187 x4
->params
.b_cabac
= avctx
->coder_type
== FF_CODER_TYPE_AC
;
188 x4
->params
.i_bframe_adaptive
= avctx
->b_frame_strategy
;
189 x4
->params
.i_bframe_bias
= avctx
->bframebias
;
190 x4
->params
.b_bframe_pyramid
= avctx
->flags2
& CODEC_FLAG2_BPYRAMID
;
191 avctx
->has_b_frames
= avctx
->flags2
& CODEC_FLAG2_BPYRAMID
? 2 : !!avctx
->max_b_frames
;
193 x4
->params
.i_keyint_min
= avctx
->keyint_min
;
194 if(x4
->params
.i_keyint_min
> x4
->params
.i_keyint_max
)
195 x4
->params
.i_keyint_min
= x4
->params
.i_keyint_max
;
197 x4
->params
.i_scenecut_threshold
= avctx
->scenechange_threshold
;
199 x4
->params
.b_deblocking_filter
= avctx
->flags
& CODEC_FLAG_LOOP_FILTER
;
200 x4
->params
.i_deblocking_filter_alphac0
= avctx
->deblockalpha
;
201 x4
->params
.i_deblocking_filter_beta
= avctx
->deblockbeta
;
203 x4
->params
.rc
.i_qp_min
= avctx
->qmin
;
204 x4
->params
.rc
.i_qp_max
= avctx
->qmax
;
205 x4
->params
.rc
.i_qp_step
= avctx
->max_qdiff
;
207 x4
->params
.rc
.f_qcompress
= avctx
->qcompress
; /* 0.0 => cbr, 1.0 => constant qp */
208 x4
->params
.rc
.f_qblur
= avctx
->qblur
; /* temporally blur quants */
209 x4
->params
.rc
.f_complexity_blur
= avctx
->complexityblur
;
211 x4
->params
.i_frame_reference
= avctx
->refs
;
213 x4
->params
.i_width
= avctx
->width
;
214 x4
->params
.i_height
= avctx
->height
;
215 x4
->params
.vui
.i_sar_width
= avctx
->sample_aspect_ratio
.num
;
216 x4
->params
.vui
.i_sar_height
= avctx
->sample_aspect_ratio
.den
;
217 x4
->params
.i_fps_num
= avctx
->time_base
.den
;
218 x4
->params
.i_fps_den
= avctx
->time_base
.num
;
220 x4
->params
.analyse
.inter
= 0;
221 if(avctx
->partitions
){
222 if(avctx
->partitions
& X264_PART_I4X4
)
223 x4
->params
.analyse
.inter
|= X264_ANALYSE_I4x4
;
224 if(avctx
->partitions
& X264_PART_I8X8
)
225 x4
->params
.analyse
.inter
|= X264_ANALYSE_I8x8
;
226 if(avctx
->partitions
& X264_PART_P8X8
)
227 x4
->params
.analyse
.inter
|= X264_ANALYSE_PSUB16x16
;
228 if(avctx
->partitions
& X264_PART_P4X4
)
229 x4
->params
.analyse
.inter
|= X264_ANALYSE_PSUB8x8
;
230 if(avctx
->partitions
& X264_PART_B8X8
)
231 x4
->params
.analyse
.inter
|= X264_ANALYSE_BSUB16x16
;
234 x4
->params
.analyse
.i_direct_mv_pred
= avctx
->directpred
;
236 x4
->params
.analyse
.b_weighted_bipred
= avctx
->flags2
& CODEC_FLAG2_WPRED
;
238 if(avctx
->me_method
== ME_EPZS
)
239 x4
->params
.analyse
.i_me_method
= X264_ME_DIA
;
240 else if(avctx
->me_method
== ME_HEX
)
241 x4
->params
.analyse
.i_me_method
= X264_ME_HEX
;
242 else if(avctx
->me_method
== ME_UMH
)
243 x4
->params
.analyse
.i_me_method
= X264_ME_UMH
;
244 else if(avctx
->me_method
== ME_FULL
)
245 x4
->params
.analyse
.i_me_method
= X264_ME_ESA
;
246 else if(avctx
->me_method
== ME_TESA
)
247 x4
->params
.analyse
.i_me_method
= X264_ME_TESA
;
248 else x4
->params
.analyse
.i_me_method
= X264_ME_HEX
;
250 x4
->params
.analyse
.i_me_range
= avctx
->me_range
;
251 x4
->params
.analyse
.i_subpel_refine
= avctx
->me_subpel_quality
;
253 x4
->params
.analyse
.b_mixed_references
=
254 avctx
->flags2
& CODEC_FLAG2_MIXED_REFS
;
255 x4
->params
.analyse
.b_chroma_me
= avctx
->me_cmp
& FF_CMP_CHROMA
;
256 x4
->params
.analyse
.b_transform_8x8
= avctx
->flags2
& CODEC_FLAG2_8X8DCT
;
257 x4
->params
.analyse
.b_fast_pskip
= avctx
->flags2
& CODEC_FLAG2_FASTPSKIP
;
259 x4
->params
.analyse
.i_trellis
= avctx
->trellis
;
260 x4
->params
.analyse
.i_noise_reduction
= avctx
->noise_reduction
;
262 if(avctx
->level
> 0) x4
->params
.i_level_idc
= avctx
->level
;
264 x4
->params
.rc
.f_rate_tolerance
=
265 (float)avctx
->bit_rate_tolerance
/avctx
->bit_rate
;
267 if((avctx
->rc_buffer_size
!= 0) &&
268 (avctx
->rc_initial_buffer_occupancy
<= avctx
->rc_buffer_size
)){
269 x4
->params
.rc
.f_vbv_buffer_init
=
270 (float)avctx
->rc_initial_buffer_occupancy
/avctx
->rc_buffer_size
;
272 else x4
->params
.rc
.f_vbv_buffer_init
= 0.9;
274 x4
->params
.rc
.f_ip_factor
= 1/fabs(avctx
->i_quant_factor
);
275 x4
->params
.rc
.f_pb_factor
= avctx
->b_quant_factor
;
276 x4
->params
.analyse
.i_chroma_qp_offset
= avctx
->chromaoffset
;
278 x4
->params
.analyse
.b_psnr
= avctx
->flags
& CODEC_FLAG_PSNR
;
279 x4
->params
.i_log_level
= X264_LOG_DEBUG
;
281 x4
->params
.b_aud
= avctx
->flags2
& CODEC_FLAG2_AUD
;
283 x4
->params
.i_threads
= avctx
->thread_count
;
285 x4
->params
.b_interlaced
= avctx
->flags
& CODEC_FLAG_INTERLACED_DCT
;
287 if(avctx
->flags
& CODEC_FLAG_GLOBAL_HEADER
){
288 x4
->params
.b_repeat_headers
= 0;
291 x4
->enc
= x264_encoder_open(&x4
->params
);
295 avctx
->coded_frame
= &x4
->out_pic
;
297 if(avctx
->flags
& CODEC_FLAG_GLOBAL_HEADER
){
301 x264_encoder_headers(x4
->enc
, &nal
, &nnal
);
303 /* 5 bytes NAL header + worst case escaping */
304 for(i
= 0; i
< nnal
; i
++)
305 s
+= 5 + nal
[i
].i_payload
* 4 / 3;
307 avctx
->extradata
= av_malloc(s
);
308 avctx
->extradata_size
= encode_nals(avctx
, avctx
->extradata
, s
, nal
, nnal
, 1);
314 AVCodec libx264_encoder
= {
316 .type
= CODEC_TYPE_VIDEO
,
318 .priv_data_size
= sizeof(X264Context
),
320 .encode
= X264_frame
,
322 .capabilities
= CODEC_CAP_DELAY
,
323 .pix_fmts
= (const enum PixelFormat
[]) { PIX_FMT_YUV420P
, PIX_FMT_NONE
},
324 .long_name
= NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),