Mercurial > libavcodec.hg
annotate libx264.c @ 10543:7ff7a34848bf libavcodec
10l trocadero: ZMBV encoder used zero score to detect whether block should be
XORed with source one or not, which went wrong with new block comparing code.
So track this condition explicitly.
author | kostya |
---|---|
date | Fri, 20 Nov 2009 07:22:41 +0000 |
parents | f1d179ba9e7a |
children | 7ca185b4bc42 |
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 | 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 | 25 #include <stdio.h> |
26 #include <stdlib.h> | |
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 { |
10319 | 30 x264_param_t params; |
31 x264_t *enc; | |
32 x264_picture_t pic; | |
33 uint8_t *sei; | |
34 int sei_size; | |
35 AVFrame out_pic; | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
36 } X264Context; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
37 |
10319 | 38 static void X264_log(void *p, int level, const char *fmt, va_list args) |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
39 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
40 static const int level_map[] = { |
2979 | 41 [X264_LOG_ERROR] = AV_LOG_ERROR, |
5293 | 42 [X264_LOG_WARNING] = AV_LOG_WARNING, |
2979 | 43 [X264_LOG_INFO] = AV_LOG_INFO, |
44 [X264_LOG_DEBUG] = AV_LOG_DEBUG | |
2556
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 |
10319 | 47 if (level < 0 || level > X264_LOG_DEBUG) |
2979 | 48 return; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
49 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
50 av_vlog(p, level_map[level], fmt, args); |
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 |
10319 | 54 static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size, |
55 x264_nal_t *nals, int nnal, int skip_sei) | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
56 { |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
57 X264Context *x4 = ctx->priv_data; |
2603 | 58 uint8_t *p = buf; |
10233 | 59 int i; |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
60 |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
61 /* Write the SEI as part of the first frame. */ |
10319 | 62 if (x4->sei_size > 0 && nnal > 0) { |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
63 memcpy(p, x4->sei, x4->sei_size); |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
64 p += x4->sei_size; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
65 x4->sei_size = 0; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
66 } |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
67 |
10319 | 68 for (i = 0; i < nnal; i++){ |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
69 /* Don't put the SEI in extradata. */ |
10319 | 70 if (skip_sei && nals[i].i_type == NAL_SEI) { |
10233 | 71 x4->sei_size = nals[i].i_payload; |
10319 | 72 x4->sei = av_malloc(x4->sei_size); |
10233 | 73 memcpy(x4->sei, nals[i].p_payload, nals[i].i_payload); |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
74 continue; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
75 } |
10233 | 76 memcpy(p, nals[i].p_payload, nals[i].i_payload); |
77 p += nals[i].i_payload; | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
78 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
79 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
80 return p - buf; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
81 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
82 |
10319 | 83 static int X264_frame(AVCodecContext *ctx, uint8_t *buf, |
84 int bufsize, void *data) | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
85 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
86 X264Context *x4 = ctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
87 AVFrame *frame = data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
88 x264_nal_t *nal; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
89 int nnal, i; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
90 x264_picture_t pic_out; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
91 |
10319 | 92 x4->pic.img.i_csp = X264_CSP_I420; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
93 x4->pic.img.i_plane = 3; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
94 |
10319 | 95 if (frame) { |
96 for (i = 0; i < 3; i++) { | |
97 x4->pic.img.plane[i] = frame->data[i]; | |
4115 | 98 x4->pic.img.i_stride[i] = frame->linesize[i]; |
99 } | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
100 |
10319 | 101 x4->pic.i_pts = frame->pts; |
4115 | 102 x4->pic.i_type = X264_TYPE_AUTO; |
4114 | 103 } |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
104 |
10319 | 105 if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0) |
2979 | 106 return -1; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
107 |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
108 bufsize = encode_nals(ctx, buf, bufsize, nal, nnal, 0); |
10319 | 109 if (bufsize < 0) |
2979 | 110 return -1; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
111 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
112 /* FIXME: dts */ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
113 x4->out_pic.pts = pic_out.i_pts; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
114 |
10319 | 115 switch (pic_out.i_type) { |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
116 case X264_TYPE_IDR: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
117 case X264_TYPE_I: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
118 x4->out_pic.pict_type = FF_I_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
119 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
120 case X264_TYPE_P: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
121 x4->out_pic.pict_type = FF_P_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
122 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
123 case X264_TYPE_B: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
124 case X264_TYPE_BREF: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
125 x4->out_pic.pict_type = FF_B_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
126 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
127 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
128 |
2563 | 129 x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR; |
10319 | 130 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
|
131 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
132 return bufsize; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
133 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
134 |
10319 | 135 static av_cold int X264_close(AVCodecContext *avctx) |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
136 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
137 X264Context *x4 = avctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
138 |
8024 | 139 av_freep(&avctx->extradata); |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
140 av_free(x4->sei); |
8024 | 141 |
10319 | 142 if (x4->enc) |
2979 | 143 x264_encoder_close(x4->enc); |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
144 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
145 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
146 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
147 |
10319 | 148 static av_cold int X264_init(AVCodecContext *avctx) |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
149 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
150 X264Context *x4 = avctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
151 |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
152 x4->sei_size = 0; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
153 x264_param_default(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
154 |
10319 | 155 x4->params.pf_log = X264_log; |
156 x4->params.p_log_private = avctx; | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
157 |
10319 | 158 x4->params.i_keyint_max = avctx->gop_size; |
159 x4->params.rc.i_bitrate = avctx->bit_rate / 1000; | |
2682 | 160 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000; |
10319 | 161 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000; |
162 x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1; | |
163 if (avctx->flags & CODEC_FLAG_PASS2) { | |
164 x4->params.rc.b_stat_read = 1; | |
165 } else { | |
166 if (avctx->crf) { | |
167 x4->params.rc.i_rc_method = X264_RC_CRF; | |
4030 | 168 x4->params.rc.f_rf_constant = avctx->crf; |
10319 | 169 } else if (avctx->cqp > -1) { |
170 x4->params.rc.i_rc_method = X264_RC_CQP; | |
3493 | 171 x4->params.rc.i_qp_constant = avctx->cqp; |
172 } | |
2996 | 173 } |
174 | |
175 // if neither crf nor cqp modes are selected we have to enable the RC | |
176 // we do it this way because we cannot check if the bitrate has been set | |
10319 | 177 if (!(avctx->crf || (avctx->cqp > -1))) |
178 x4->params.rc.i_rc_method = X264_RC_ABR; | |
2996 | 179 |
10319 | 180 x4->params.i_bframe = avctx->max_b_frames; |
181 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC; | |
7868 | 182 x4->params.i_bframe_adaptive = avctx->b_frame_strategy; |
10319 | 183 x4->params.i_bframe_bias = avctx->bframebias; |
10435 | 184 x4->params.i_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? X264_B_PYRAMID_NORMAL : X264_B_PYRAMID_NONE; |
10319 | 185 avctx->has_b_frames = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames; |
2996 | 186 |
187 x4->params.i_keyint_min = avctx->keyint_min; | |
10319 | 188 if (x4->params.i_keyint_min > x4->params.i_keyint_max) |
2996 | 189 x4->params.i_keyint_min = x4->params.i_keyint_max; |
190 | |
10319 | 191 x4->params.i_scenecut_threshold = avctx->scenechange_threshold; |
2996 | 192 |
10319 | 193 x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER; |
2996 | 194 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha; |
10319 | 195 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
|
196 |
10319 | 197 x4->params.rc.i_qp_min = avctx->qmin; |
198 x4->params.rc.i_qp_max = avctx->qmax; | |
199 x4->params.rc.i_qp_step = avctx->max_qdiff; | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
200 |
10319 | 201 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */ |
202 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */ | |
2996 | 203 x4->params.rc.f_complexity_blur = avctx->complexityblur; |
2882 | 204 |
10319 | 205 x4->params.i_frame_reference = avctx->refs; |
2563 | 206 |
10319 | 207 x4->params.i_width = avctx->width; |
208 x4->params.i_height = avctx->height; | |
209 x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num; | |
210 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den; | |
211 x4->params.i_fps_num = avctx->time_base.den; | |
212 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
|
213 |
10319 | 214 x4->params.analyse.inter = 0; |
215 if (avctx->partitions) { | |
216 if (avctx->partitions & X264_PART_I4X4) | |
2996 | 217 x4->params.analyse.inter |= X264_ANALYSE_I4x4; |
10319 | 218 if (avctx->partitions & X264_PART_I8X8) |
2996 | 219 x4->params.analyse.inter |= X264_ANALYSE_I8x8; |
10319 | 220 if (avctx->partitions & X264_PART_P8X8) |
2996 | 221 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16; |
10319 | 222 if (avctx->partitions & X264_PART_P4X4) |
2996 | 223 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8; |
10319 | 224 if (avctx->partitions & X264_PART_B8X8) |
2996 | 225 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16; |
226 } | |
227 | |
10319 | 228 x4->params.analyse.i_direct_mv_pred = avctx->directpred; |
2996 | 229 |
7000 | 230 x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED; |
2996 | 231 |
10319 | 232 if (avctx->me_method == ME_EPZS) |
2996 | 233 x4->params.analyse.i_me_method = X264_ME_DIA; |
10319 | 234 else if (avctx->me_method == ME_HEX) |
2996 | 235 x4->params.analyse.i_me_method = X264_ME_HEX; |
10319 | 236 else if (avctx->me_method == ME_UMH) |
2996 | 237 x4->params.analyse.i_me_method = X264_ME_UMH; |
10319 | 238 else if (avctx->me_method == ME_FULL) |
2996 | 239 x4->params.analyse.i_me_method = X264_ME_ESA; |
10319 | 240 else if (avctx->me_method == ME_TESA) |
7002
92c74bbdf4fb
add esa/dia compat me options and new tesa for libx264
bcoudurier
parents:
7001
diff
changeset
|
241 x4->params.analyse.i_me_method = X264_ME_TESA; |
2996 | 242 else x4->params.analyse.i_me_method = X264_ME_HEX; |
243 | |
10319 | 244 x4->params.analyse.i_me_range = avctx->me_range; |
245 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; | |
2996 | 246 |
10319 | 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; | |
2996 | 251 |
10319 | 252 x4->params.analyse.i_trellis = avctx->trellis; |
253 x4->params.analyse.i_noise_reduction = avctx->noise_reduction; | |
2996 | 254 |
10319 | 255 if (avctx->level > 0) |
256 x4->params.i_level_idc = avctx->level; | |
2996 | 257 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
258 x4->params.rc.f_rate_tolerance = |
2996 | 259 (float)avctx->bit_rate_tolerance/avctx->bit_rate; |
260 | |
10319 | 261 if ((avctx->rc_buffer_size != 0) && |
262 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)) { | |
2996 | 263 x4->params.rc.f_vbv_buffer_init = |
10319 | 264 (float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size; |
265 } else | |
266 x4->params.rc.f_vbv_buffer_init = 0.9; | |
2996 | 267 |
10319 | 268 x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor); |
269 x4->params.rc.f_pb_factor = avctx->b_quant_factor; | |
2996 | 270 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset; |
271 | |
7000 | 272 x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR; |
10319 | 273 x4->params.i_log_level = X264_LOG_DEBUG; |
2996 | 274 |
10319 | 275 x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD; |
2742 | 276 |
10319 | 277 x4->params.i_threads = avctx->thread_count; |
7001 | 278 |
10319 | 279 x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT; |
280 | |
281 if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) | |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
282 x4->params.b_repeat_headers = 0; |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
283 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
284 x4->enc = x264_encoder_open(&x4->params); |
10319 | 285 if (!x4->enc) |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
286 return -1; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
287 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
288 avctx->coded_frame = &x4->out_pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
289 |
10319 | 290 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
|
291 x264_nal_t *nal; |
10233 | 292 int nnal, s; |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
293 |
10233 | 294 s = 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
|
295 |
10319 | 296 avctx->extradata = av_malloc(s); |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
297 avctx->extradata_size = encode_nals(avctx, avctx->extradata, s, nal, nnal, 1); |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
298 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
299 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
300 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
301 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
302 |
5103
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
303 AVCodec libx264_encoder = { |
10319 | 304 .name = "libx264", |
305 .type = CODEC_TYPE_VIDEO, | |
306 .id = CODEC_ID_H264, | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
307 .priv_data_size = sizeof(X264Context), |
10319 | 308 .init = X264_init, |
309 .encode = X264_frame, | |
310 .close = X264_close, | |
311 .capabilities = CODEC_CAP_DELAY, | |
312 .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE }, | |
313 .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
|
314 }; |