3f3aba68eff601303500a6affa48b23e8dfff5b5
2 * H.264 encoding using the x264 library
3 * Copyright (C) 2005 Måns Rullgård <mru@inprovide.com>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 typedef struct X264Context
{
31 X264_log(void *p
, int level
, const char *fmt
, va_list args
)
33 static const int level_map
[] = {
34 [X264_LOG_ERROR
] = AV_LOG_ERROR
,
35 [X264_LOG_WARNING
] = AV_LOG_ERROR
,
36 [X264_LOG_INFO
] = AV_LOG_INFO
,
37 [X264_LOG_DEBUG
] = AV_LOG_DEBUG
40 if(level
< 0 || level
> X264_LOG_DEBUG
)
43 av_vlog(p
, level_map
[level
], fmt
, args
);
48 encode_nals(u_char
*buf
, int size
, x264_nal_t
*nals
, int nnal
)
53 for(i
= 0; i
< nnal
; i
++){
54 int s
= x264_nal_encode(p
, &size
, 1, nals
+ i
);
64 X264_frame(AVCodecContext
*ctx
, uint8_t *buf
, int bufsize
, void *data
)
66 X264Context
*x4
= ctx
->priv_data
;
67 AVFrame
*frame
= data
;
70 x264_picture_t pic_out
;
72 x4
->pic
.img
.i_csp
= X264_CSP_I420
;
73 x4
->pic
.img
.i_plane
= 3;
75 for(i
= 0; i
< 3; i
++){
76 x4
->pic
.img
.plane
[i
] = frame
->data
[i
];
77 x4
->pic
.img
.i_stride
[i
] = frame
->linesize
[i
];
80 x4
->pic
.i_pts
= frame
->pts
;
81 x4
->pic
.i_type
= X264_TYPE_AUTO
;
83 if(x264_encoder_encode(x4
->enc
, &nal
, &nnal
, &x4
->pic
, &pic_out
))
86 bufsize
= encode_nals(buf
, bufsize
, nal
, nnal
);
91 x4
->out_pic
.pts
= pic_out
.i_pts
;
93 switch(pic_out
.i_type
){
96 x4
->out_pic
.pict_type
= FF_I_TYPE
;
99 x4
->out_pic
.pict_type
= FF_P_TYPE
;
103 x4
->out_pic
.pict_type
= FF_B_TYPE
;
107 x4
->out_pic
.key_frame
= x4
->out_pic
.key_frame
== FF_I_TYPE
;
113 X264_close(AVCodecContext
*avctx
)
115 X264Context
*x4
= avctx
->priv_data
;
118 x264_encoder_close(x4
->enc
);
124 X264_init(AVCodecContext
*avctx
)
126 X264Context
*x4
= avctx
->priv_data
;
128 x264_param_default(&x4
->params
);
130 x4
->params
.pf_log
= X264_log
;
131 x4
->params
.p_log_private
= avctx
;
133 x4
->params
.i_keyint_max
= avctx
->gop_size
;
134 x4
->params
.rc
.i_bitrate
= avctx
->bit_rate
/ 1000;
135 x4
->params
.rc
.i_rc_buffer_size
= avctx
->rc_buffer_size
/ 1000;
136 if(avctx
->rc_buffer_size
)
137 x4
->params
.rc
.b_cbr
= 1;
138 x4
->params
.rc
.i_qp_min
= avctx
->qmin
;
139 x4
->params
.rc
.i_qp_max
= avctx
->qmax
;
140 x4
->params
.rc
.i_qp_step
= avctx
->max_qdiff
;
142 x4
->params
.i_width
= avctx
->width
;
143 x4
->params
.i_height
= avctx
->height
;
144 x4
->params
.vui
.i_sar_width
= avctx
->sample_aspect_ratio
.num
;
145 x4
->params
.vui
.i_sar_height
= avctx
->sample_aspect_ratio
.den
;
146 x4
->params
.i_fps_num
= avctx
->frame_rate
;
147 x4
->params
.i_fps_den
= avctx
->frame_rate_base
;
149 x4
->enc
= x264_encoder_open(&x4
->params
);
153 avctx
->coded_frame
= &x4
->out_pic
;
158 AVCodec x264_encoder
= {
160 .type
= CODEC_TYPE_VIDEO
,
162 .priv_data_size
= sizeof(X264Context
),
164 .encode
= X264_frame
,
166 .pix_fmts
= (enum PixelFormat
[]) { PIX_FMT_YUV420P
, -1 }