Mercurial > libavcodec.hg
annotate libx264.c @ 10960:10759fd39860 libavcodec
Gcc idiocy fixes related to filter_mb_edge*.
Change order of operands as gcc uses a hardcoded register per operand it seems
even for static functions
thus reducing unneeded moved (now functions try to pass the same argument in
the same spot).
Change signed int to unsigned int for array indexes as signed requires signed
extension while unsigned is free.
move the +52 up and merge it where it will end as a lea instruction, gcc always
splits the 52 out there turning the free +52 into an expensive one otherwise.
The changed code becomes a little faster.
author | michael |
---|---|
date | Fri, 22 Jan 2010 01:59:17 +0000 |
parents | b2ea6b0d17bf |
children | 9beb570426f4 |
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 |
10936 | 112 /* FIXME: libx264 now provides DTS, but AVFrame doesn't have a field for it. */ |
2556
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 |
10936 | 129 x4->out_pic.key_frame = pic_out.b_keyframe; |
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; |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
162 x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1; |
10319 | 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 |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
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; | |
10936 | 211 x4->params.i_fps_num = x4->params.i_timebase_den = avctx->time_base.den; |
212 x4->params.i_fps_den = x4->params.i_timebase_num = 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 |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
230 x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED; |
10566 | 231 x4->params.analyse.i_weighted_pred = avctx->weighted_p_pred; |
2996 | 232 |
10319 | 233 if (avctx->me_method == ME_EPZS) |
2996 | 234 x4->params.analyse.i_me_method = X264_ME_DIA; |
10319 | 235 else if (avctx->me_method == ME_HEX) |
2996 | 236 x4->params.analyse.i_me_method = X264_ME_HEX; |
10319 | 237 else if (avctx->me_method == ME_UMH) |
2996 | 238 x4->params.analyse.i_me_method = X264_ME_UMH; |
10319 | 239 else if (avctx->me_method == ME_FULL) |
2996 | 240 x4->params.analyse.i_me_method = X264_ME_ESA; |
10319 | 241 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
|
242 x4->params.analyse.i_me_method = X264_ME_TESA; |
2996 | 243 else x4->params.analyse.i_me_method = X264_ME_HEX; |
244 | |
10319 | 245 x4->params.analyse.i_me_range = avctx->me_range; |
246 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; | |
2996 | 247 |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
248 x4->params.analyse.b_mixed_references = avctx->flags2 & CODEC_FLAG2_MIXED_REFS; |
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
249 x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA; |
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
250 x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT; |
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
251 x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP; |
2996 | 252 |
10319 | 253 x4->params.analyse.i_trellis = avctx->trellis; |
254 x4->params.analyse.i_noise_reduction = avctx->noise_reduction; | |
2996 | 255 |
10319 | 256 if (avctx->level > 0) |
257 x4->params.i_level_idc = avctx->level; | |
2996 | 258 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
259 x4->params.rc.f_rate_tolerance = |
2996 | 260 (float)avctx->bit_rate_tolerance/avctx->bit_rate; |
261 | |
10319 | 262 if ((avctx->rc_buffer_size != 0) && |
263 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)) { | |
2996 | 264 x4->params.rc.f_vbv_buffer_init = |
10319 | 265 (float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size; |
266 } else | |
267 x4->params.rc.f_vbv_buffer_init = 0.9; | |
2996 | 268 |
10658 | 269 x4->params.rc.b_mb_tree = !!(avctx->flags2 & CODEC_FLAG2_MBTREE); |
10319 | 270 x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor); |
271 x4->params.rc.f_pb_factor = avctx->b_quant_factor; | |
2996 | 272 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset; |
273 | |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
274 x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR; |
10319 | 275 x4->params.i_log_level = X264_LOG_DEBUG; |
2996 | 276 |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
277 x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD; |
2742 | 278 |
10319 | 279 x4->params.i_threads = avctx->thread_count; |
7001 | 280 |
10662
80161fd66fd1
revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents:
10659
diff
changeset
|
281 x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT; |
10319 | 282 |
283 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
|
284 x4->params.b_repeat_headers = 0; |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
285 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
286 x4->enc = x264_encoder_open(&x4->params); |
10319 | 287 if (!x4->enc) |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
288 return -1; |
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 avctx->coded_frame = &x4->out_pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
291 |
10319 | 292 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
|
293 x264_nal_t *nal; |
10233 | 294 int nnal, s; |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
295 |
10233 | 296 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
|
297 |
10319 | 298 avctx->extradata = av_malloc(s); |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
299 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
|
300 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
301 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
302 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
303 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
304 |
5103
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
305 AVCodec libx264_encoder = { |
10319 | 306 .name = "libx264", |
307 .type = CODEC_TYPE_VIDEO, | |
308 .id = CODEC_ID_H264, | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
309 .priv_data_size = sizeof(X264Context), |
10319 | 310 .init = X264_init, |
311 .encode = X264_frame, | |
312 .close = X264_close, | |
313 .capabilities = CODEC_CAP_DELAY, | |
314 .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE }, | |
315 .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
|
316 }; |