annotate libx264.c @ 7983:47f50599b368 libavcodec

x264 has removed the b-rdo and bime options, and instead integrated them into the subme number to attempt to reduce the number of unnecessary options. subme now scales up to 9. Patch by Jason Garett-Glaser %darkshikari A gmail P com%
author gpoirier
date Thu, 02 Oct 2008 19:05:35 +0000
parents 850abcd10e19
children 4f555a34e00f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
1 /*
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
2 * H.264 encoding using the x264 library
5220
744e91a36a23 update my email address
mru
parents: 5103
diff changeset
3 * Copyright (C) 2005 Mans Rullgard <mans@mansr.com>
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3653
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3653
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3653
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3653
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3653
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
16 *
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3653
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2996
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
20 */
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
21
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
22 #include "avcodec.h"
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
23 #include <x264.h>
2784
cdf74a048614 patch from http://www.freebsd.org/cgi/cvsweb.cgi/ports/multimedia/ffmpeg-devel/files/patch-libavcodec::x264.c
michael
parents: 2742
diff changeset
24 #include <math.h>
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
25 #include <stdio.h>
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
26 #include <stdlib.h>
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
27 #include <string.h>
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
28
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
29 typedef struct X264Context {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
30 x264_param_t params;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
31 x264_t *enc;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
32 x264_picture_t pic;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
33 AVFrame out_pic;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
34 } X264Context;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
35
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
36 static void
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
37 X264_log(void *p, int level, const char *fmt, va_list args)
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
38 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
39 static const int level_map[] = {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
40 [X264_LOG_ERROR] = AV_LOG_ERROR,
5293
de5b524db473 map warning levels between libx264 and libavutil
benoit
parents: 5220
diff changeset
41 [X264_LOG_WARNING] = AV_LOG_WARNING,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
42 [X264_LOG_INFO] = AV_LOG_INFO,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
43 [X264_LOG_DEBUG] = AV_LOG_DEBUG
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
44 };
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
45
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
46 if(level < 0 || level > X264_LOG_DEBUG)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
47 return;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
48
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
49 av_vlog(p, level_map[level], fmt, args);
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
50 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
51
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
52
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
53 static int
2603
37cdd1a1174a s/u_char/uint8_t/
mru
parents: 2569
diff changeset
54 encode_nals(uint8_t *buf, int size, x264_nal_t *nals, int nnal)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
55 {
2603
37cdd1a1174a s/u_char/uint8_t/
mru
parents: 2569
diff changeset
56 uint8_t *p = buf;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
57 int i;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
58
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
59 for(i = 0; i < nnal; i++){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
60 int s = x264_nal_encode(p, &size, 1, nals + i);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
61 if(s < 0)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
62 return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
63 p += s;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
64 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
65
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
66 return p - buf;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
67 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
68
4169
8d67ae8320dc make two functions static
mru
parents: 4115
diff changeset
69 static int
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
70 X264_frame(AVCodecContext *ctx, uint8_t *buf, int bufsize, void *data)
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
71 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
72 X264Context *x4 = ctx->priv_data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
73 AVFrame *frame = data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
74 x264_nal_t *nal;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
75 int nnal, i;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
76 x264_picture_t pic_out;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
77
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
78 x4->pic.img.i_csp = X264_CSP_I420;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
79 x4->pic.img.i_plane = 3;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
80
4114
903017d72ffe CODEC_CAP_DELAY support
mru
parents: 4030
diff changeset
81 if (frame) {
4115
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
82 for(i = 0; i < 3; i++){
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
83 x4->pic.img.plane[i] = frame->data[i];
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
84 x4->pic.img.i_stride[i] = frame->linesize[i];
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
85 }
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
86
4115
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
87 x4->pic.i_pts = frame->pts;
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
88 x4->pic.i_type = X264_TYPE_AUTO;
4114
903017d72ffe CODEC_CAP_DELAY support
mru
parents: 4030
diff changeset
89 }
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
90
4114
903017d72ffe CODEC_CAP_DELAY support
mru
parents: 4030
diff changeset
91 if(x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL,
903017d72ffe CODEC_CAP_DELAY support
mru
parents: 4030
diff changeset
92 &pic_out))
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
93 return -1;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
94
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
95 bufsize = encode_nals(buf, bufsize, nal, nnal);
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
96 if(bufsize < 0)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
97 return -1;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
98
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
99 /* FIXME: dts */
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
100 x4->out_pic.pts = pic_out.i_pts;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
101
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
102 switch(pic_out.i_type){
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
103 case X264_TYPE_IDR:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
104 case X264_TYPE_I:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
105 x4->out_pic.pict_type = FF_I_TYPE;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
106 break;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
107 case X264_TYPE_P:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
108 x4->out_pic.pict_type = FF_P_TYPE;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
109 break;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
110 case X264_TYPE_B:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
111 case X264_TYPE_BREF:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
112 x4->out_pic.pict_type = FF_B_TYPE;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
113 break;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
114 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
115
2563
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
116 x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR;
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
117 x4->out_pic.quality = (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
118
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
119 return bufsize;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
120 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
121
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 5293
diff changeset
122 static av_cold int
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
123 X264_close(AVCodecContext *avctx)
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
124 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
125 X264Context *x4 = avctx->priv_data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
126
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
127 if(x4->enc)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
128 x264_encoder_close(x4->enc);
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
129
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
130 return 0;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
131 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
132
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 5293
diff changeset
133 static av_cold int
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
134 X264_init(AVCodecContext *avctx)
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
135 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
136 X264Context *x4 = avctx->priv_data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
137
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
138 x264_param_default(&x4->params);
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
139
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
140 x4->params.pf_log = X264_log;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
141 x4->params.p_log_private = avctx;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
142
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
143 x4->params.i_keyint_max = avctx->gop_size;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
144 x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
2682
dfa4d2773d13 work with latest svn of x264
mru
parents: 2637
diff changeset
145 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000;
2882
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
146 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000;
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
147 x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
148 if(avctx->flags & CODEC_FLAG_PASS2) x4->params.rc.b_stat_read = 1;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
149 else{
3493
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
150 if(avctx->crf){
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
151 x4->params.rc.i_rc_method = X264_RC_CRF;
4030
ffe1b004ecc7 Make ffmpeg work with x264 r592
lu_zero
parents: 3947
diff changeset
152 x4->params.rc.f_rf_constant = avctx->crf;
3493
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
153 }else if(avctx->cqp > -1){
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
154 x4->params.rc.i_rc_method = X264_RC_CQP;
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
155 x4->params.rc.i_qp_constant = avctx->cqp;
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
156 }
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
157 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
158
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
159 // if neither crf nor cqp modes are selected we have to enable the RC
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
160 // we do it this way because we cannot check if the bitrate has been set
3493
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
161 if(!(avctx->crf || (avctx->cqp > -1))) x4->params.rc.i_rc_method = X264_RC_ABR;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
162
2569
980f66959698 indentation fix
mru
parents: 2568
diff changeset
163 x4->params.i_bframe = avctx->max_b_frames;
980f66959698 indentation fix
mru
parents: 2568
diff changeset
164 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC;
7868
850abcd10e19 sync to latest x264 git, field was renamed
bcoudurier
parents: 7729
diff changeset
165 x4->params.i_bframe_adaptive = avctx->b_frame_strategy;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
166 x4->params.i_bframe_bias = avctx->bframebias;
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
167 x4->params.b_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID;
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
168 avctx->has_b_frames= avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
169
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
170 x4->params.i_keyint_min = avctx->keyint_min;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
171 if(x4->params.i_keyint_min > x4->params.i_keyint_max)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
172 x4->params.i_keyint_min = x4->params.i_keyint_max;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
173
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
174 x4->params.i_scenecut_threshold = avctx->scenechange_threshold;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
175
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
176 x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
177 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
178 x4->params.i_deblocking_filter_beta = avctx->deblockbeta;
2568
f06d5bf3da71 B frames and CABAC/CAVLC selection by Erik Slagter (erik at slagter dot name)
mru
parents: 2563
diff changeset
179
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
180 x4->params.rc.i_qp_min = avctx->qmin;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
181 x4->params.rc.i_qp_max = avctx->qmax;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
182 x4->params.rc.i_qp_step = avctx->max_qdiff;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
183
2882
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
184 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
185 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
186 x4->params.rc.f_complexity_blur = avctx->complexityblur;
2882
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
187
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
188 x4->params.i_frame_reference = avctx->refs;
2563
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
189
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
190 x4->params.i_width = avctx->width;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
191 x4->params.i_height = avctx->height;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
192 x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
193 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den;
2637
ef44d24680d1 switch to native time bases
michael
parents: 2603
diff changeset
194 x4->params.i_fps_num = avctx->time_base.den;
ef44d24680d1 switch to native time bases
michael
parents: 2603
diff changeset
195 x4->params.i_fps_den = avctx->time_base.num;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
196
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
197 x4->params.analyse.inter = 0;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
198 if(avctx->partitions){
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
199 if(avctx->partitions & X264_PART_I4X4)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
200 x4->params.analyse.inter |= X264_ANALYSE_I4x4;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
201 if(avctx->partitions & X264_PART_I8X8)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
202 x4->params.analyse.inter |= X264_ANALYSE_I8x8;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
203 if(avctx->partitions & X264_PART_P8X8)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
204 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
205 if(avctx->partitions & X264_PART_P4X4)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
206 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
207 if(avctx->partitions & X264_PART_B8X8)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
208 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
209 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
210
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
211 x4->params.analyse.i_direct_mv_pred = avctx->directpred;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
212
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
213 x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
214
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
215 if(avctx->me_method == ME_EPZS)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
216 x4->params.analyse.i_me_method = X264_ME_DIA;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
217 else if(avctx->me_method == ME_HEX)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
218 x4->params.analyse.i_me_method = X264_ME_HEX;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
219 else if(avctx->me_method == ME_UMH)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
220 x4->params.analyse.i_me_method = X264_ME_UMH;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
221 else if(avctx->me_method == ME_FULL)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
222 x4->params.analyse.i_me_method = X264_ME_ESA;
7002
92c74bbdf4fb add esa/dia compat me options and new tesa for libx264
bcoudurier
parents: 7001
diff changeset
223 else if(avctx->me_method == ME_TESA)
92c74bbdf4fb add esa/dia compat me options and new tesa for libx264
bcoudurier
parents: 7001
diff changeset
224 x4->params.analyse.i_me_method = X264_ME_TESA;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
225 else x4->params.analyse.i_me_method = X264_ME_HEX;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
226
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
227 x4->params.analyse.i_me_range = avctx->me_range;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
228 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
229
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
230 x4->params.analyse.b_mixed_references =
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
231 avctx->flags2 & CODEC_FLAG2_MIXED_REFS;
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
232 x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA;
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
233 x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT;
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
234 x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
235
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
236 x4->params.analyse.i_trellis = avctx->trellis;
3133
7dcdc73c1631 pass noise reduction option to x264
mru
parents: 3063
diff changeset
237 x4->params.analyse.i_noise_reduction = avctx->noise_reduction;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
238
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
239 if(avctx->level > 0) x4->params.i_level_idc = avctx->level;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
240
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
241 x4->params.rc.f_rate_tolerance =
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
242 (float)avctx->bit_rate_tolerance/avctx->bit_rate;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
243
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
244 if((avctx->rc_buffer_size != 0) &&
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
245 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)){
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
246 x4->params.rc.f_vbv_buffer_init =
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
247 (float)avctx->rc_initial_buffer_occupancy/avctx->rc_buffer_size;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
248 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
249 else x4->params.rc.f_vbv_buffer_init = 0.9;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
250
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
251 x4->params.rc.f_ip_factor = 1/fabs(avctx->i_quant_factor);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
252 x4->params.rc.f_pb_factor = avctx->b_quant_factor;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
253 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
254
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
255 x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
256 x4->params.i_log_level = X264_LOG_DEBUG;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
257
7000
af0fe48cda98 cleanup, remove useless parentheses
bcoudurier
parents: 6788
diff changeset
258 x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
259
2742
5bdc60634470 enable x264 multi-threading
mru
parents: 2682
diff changeset
260 x4->params.i_threads = avctx->thread_count;
5bdc60634470 enable x264 multi-threading
mru
parents: 2682
diff changeset
261
7001
8193f8ae7ff4 x264 interlaced encoding option
bcoudurier
parents: 7000
diff changeset
262 x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT;
8193f8ae7ff4 x264 interlaced encoding option
bcoudurier
parents: 7000
diff changeset
263
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
264 if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
265 x4->params.b_repeat_headers = 0;
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
266 }
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
267
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
268 x4->enc = x264_encoder_open(&x4->params);
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
269 if(!x4->enc)
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
270 return -1;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
271
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
272 avctx->coded_frame = &x4->out_pic;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
273
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
274 if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
275 x264_nal_t *nal;
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
276 int nnal, i, s = 0;
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
277
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
278 x264_encoder_headers(x4->enc, &nal, &nnal);
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
279
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
280 /* 5 bytes NAL header + worst case escaping */
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
281 for(i = 0; i < nnal; i++)
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
282 s += 5 + nal[i].i_payload * 4 / 3;
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
283
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
284 avctx->extradata = av_malloc(s);
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
285 avctx->extradata_size = encode_nals(avctx->extradata, s, nal, nnal);
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
286 }
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
287
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
288 return 0;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
289 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
290
5103
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
291 AVCodec libx264_encoder = {
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
292 .name = "libx264",
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
293 .type = CODEC_TYPE_VIDEO,
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
294 .id = CODEC_ID_H264,
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
295 .priv_data_size = sizeof(X264Context),
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
296 .init = X264_init,
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
297 .encode = X264_frame,
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
298 .close = X264_close,
4114
903017d72ffe CODEC_CAP_DELAY support
mru
parents: 4030
diff changeset
299 .capabilities = CODEC_CAP_DELAY,
6788
e1302edb0f69 Replace some occurrences of -1 with PIX_FMT_NONE.
cehoyos
parents: 6717
diff changeset
300 .pix_fmts = (enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE },
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7002
diff changeset
301 .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
302 };