Mercurial > libavcodec.hg
annotate libx264.c @ 8130:c45366b01126 libavcodec
ARM: fix j_rev_dct_ARM
This is a bugfix for ARMv4 assembly implementation of 'j_rev_dct'
function.
The problem was in the incorrect partially empty row detection. Even
if the first two coefficients in the row were nonzero, it handled this
just like the case with only the first nonzero coefficient.
Now this function produces exactly the same output as the stripped
down reference C version of 'j_rev_dct' (with the nested checks like
'if (d6) { if (d2) { ...' always evaluated as true, avoiding shortcut
branches).
author | mru |
---|---|
date | Wed, 12 Nov 2008 20:23:36 +0000 |
parents | 4f555a34e00f |
children | 06ab8ac1a593 |
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 { |
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 | 40 [X264_LOG_ERROR] = AV_LOG_ERROR, |
5293 | 41 [X264_LOG_WARNING] = AV_LOG_WARNING, |
2979 | 42 [X264_LOG_INFO] = AV_LOG_INFO, |
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 | 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 | 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 | 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 | 60 int s = x264_nal_encode(p, &size, 1, nals + i); |
61 if(s < 0) | |
62 return -1; | |
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 | 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 | 81 if (frame) { |
4115 | 82 for(i = 0; i < 3; i++){ |
83 x4->pic.img.plane[i] = frame->data[i]; | |
84 x4->pic.img.i_stride[i] = frame->linesize[i]; | |
85 } | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
86 |
4115 | 87 x4->pic.i_pts = frame->pts; |
88 x4->pic.i_type = X264_TYPE_AUTO; | |
4114 | 89 } |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
90 |
4114 | 91 if(x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, |
92 &pic_out)) | |
2979 | 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 | 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 | 116 x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR; |
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 |
8024 | 127 av_freep(&avctx->extradata); |
128 | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
129 if(x4->enc) |
2979 | 130 x264_encoder_close(x4->enc); |
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 0; |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5293
diff
changeset
|
135 static av_cold int |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
136 X264_init(AVCodecContext *avctx) |
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 X264Context *x4 = avctx->priv_data; |
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 x264_param_default(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
141 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
142 x4->params.pf_log = X264_log; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
143 x4->params.p_log_private = avctx; |
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 x4->params.i_keyint_max = avctx->gop_size; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
146 x4->params.rc.i_bitrate = avctx->bit_rate / 1000; |
2682 | 147 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000; |
2882 | 148 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000; |
7000 | 149 x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1; |
2996 | 150 if(avctx->flags & CODEC_FLAG_PASS2) x4->params.rc.b_stat_read = 1; |
151 else{ | |
3493 | 152 if(avctx->crf){ |
153 x4->params.rc.i_rc_method = X264_RC_CRF; | |
4030 | 154 x4->params.rc.f_rf_constant = avctx->crf; |
3493 | 155 }else if(avctx->cqp > -1){ |
156 x4->params.rc.i_rc_method = X264_RC_CQP; | |
157 x4->params.rc.i_qp_constant = avctx->cqp; | |
158 } | |
2996 | 159 } |
160 | |
161 // if neither crf nor cqp modes are selected we have to enable the RC | |
162 // we do it this way because we cannot check if the bitrate has been set | |
3493 | 163 if(!(avctx->crf || (avctx->cqp > -1))) x4->params.rc.i_rc_method = X264_RC_ABR; |
2996 | 164 |
2569 | 165 x4->params.i_bframe = avctx->max_b_frames; |
166 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC; | |
7868 | 167 x4->params.i_bframe_adaptive = avctx->b_frame_strategy; |
2996 | 168 x4->params.i_bframe_bias = avctx->bframebias; |
7000 | 169 x4->params.b_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID; |
170 avctx->has_b_frames= avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames; | |
2996 | 171 |
172 x4->params.i_keyint_min = avctx->keyint_min; | |
173 if(x4->params.i_keyint_min > x4->params.i_keyint_max) | |
174 x4->params.i_keyint_min = x4->params.i_keyint_max; | |
175 | |
176 x4->params.i_scenecut_threshold = avctx->scenechange_threshold; | |
177 | |
7000 | 178 x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER; |
2996 | 179 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha; |
180 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
|
181 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
182 x4->params.rc.i_qp_min = avctx->qmin; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
183 x4->params.rc.i_qp_max = avctx->qmax; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
184 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
|
185 |
2882 | 186 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */ |
187 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */ | |
2996 | 188 x4->params.rc.f_complexity_blur = avctx->complexityblur; |
2882 | 189 |
2996 | 190 x4->params.i_frame_reference = avctx->refs; |
2563 | 191 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
192 x4->params.i_width = avctx->width; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
193 x4->params.i_height = avctx->height; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
194 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
|
195 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den; |
2637 | 196 x4->params.i_fps_num = avctx->time_base.den; |
197 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
|
198 |
2996 | 199 x4->params.analyse.inter = 0; |
200 if(avctx->partitions){ | |
201 if(avctx->partitions & X264_PART_I4X4) | |
202 x4->params.analyse.inter |= X264_ANALYSE_I4x4; | |
203 if(avctx->partitions & X264_PART_I8X8) | |
204 x4->params.analyse.inter |= X264_ANALYSE_I8x8; | |
205 if(avctx->partitions & X264_PART_P8X8) | |
206 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16; | |
207 if(avctx->partitions & X264_PART_P4X4) | |
208 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8; | |
209 if(avctx->partitions & X264_PART_B8X8) | |
210 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16; | |
211 } | |
212 | |
213 x4->params.analyse.i_direct_mv_pred = avctx->directpred; | |
214 | |
7000 | 215 x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED; |
2996 | 216 |
217 if(avctx->me_method == ME_EPZS) | |
218 x4->params.analyse.i_me_method = X264_ME_DIA; | |
219 else if(avctx->me_method == ME_HEX) | |
220 x4->params.analyse.i_me_method = X264_ME_HEX; | |
221 else if(avctx->me_method == ME_UMH) | |
222 x4->params.analyse.i_me_method = X264_ME_UMH; | |
223 else if(avctx->me_method == ME_FULL) | |
224 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
|
225 else if(avctx->me_method == ME_TESA) |
92c74bbdf4fb
add esa/dia compat me options and new tesa for libx264
bcoudurier
parents:
7001
diff
changeset
|
226 x4->params.analyse.i_me_method = X264_ME_TESA; |
2996 | 227 else x4->params.analyse.i_me_method = X264_ME_HEX; |
228 | |
229 x4->params.analyse.i_me_range = avctx->me_range; | |
230 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; | |
231 | |
232 x4->params.analyse.b_mixed_references = | |
7000 | 233 avctx->flags2 & CODEC_FLAG2_MIXED_REFS; |
234 x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA; | |
235 x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT; | |
236 x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP; | |
2996 | 237 |
238 x4->params.analyse.i_trellis = avctx->trellis; | |
3133 | 239 x4->params.analyse.i_noise_reduction = avctx->noise_reduction; |
2996 | 240 |
241 if(avctx->level > 0) x4->params.i_level_idc = avctx->level; | |
242 | |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
243 x4->params.rc.f_rate_tolerance = |
2996 | 244 (float)avctx->bit_rate_tolerance/avctx->bit_rate; |
245 | |
246 if((avctx->rc_buffer_size != 0) && | |
247 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)){ | |
248 x4->params.rc.f_vbv_buffer_init = | |
249 (float)avctx->rc_initial_buffer_occupancy/avctx->rc_buffer_size; | |
250 } | |
251 else x4->params.rc.f_vbv_buffer_init = 0.9; | |
252 | |
253 x4->params.rc.f_ip_factor = 1/fabs(avctx->i_quant_factor); | |
254 x4->params.rc.f_pb_factor = avctx->b_quant_factor; | |
255 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset; | |
256 | |
7000 | 257 x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR; |
2996 | 258 x4->params.i_log_level = X264_LOG_DEBUG; |
259 | |
7000 | 260 x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD; |
2996 | 261 |
2742 | 262 x4->params.i_threads = avctx->thread_count; |
263 | |
7001 | 264 x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT; |
265 | |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
266 if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){ |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
267 x4->params.b_repeat_headers = 0; |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
268 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
269 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
270 x4->enc = x264_encoder_open(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
271 if(!x4->enc) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
272 return -1; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
273 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
274 avctx->coded_frame = &x4->out_pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
275 |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
276 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
|
277 x264_nal_t *nal; |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
278 int nnal, i, s = 0; |
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 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
|
281 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
282 /* 5 bytes NAL header + worst case escaping */ |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
283 for(i = 0; i < nnal; i++) |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
284 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
|
285 |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
286 avctx->extradata = av_malloc(s); |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
287 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
|
288 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
289 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
290 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
291 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
292 |
5103
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
293 AVCodec libx264_encoder = { |
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
294 .name = "libx264", |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
295 .type = CODEC_TYPE_VIDEO, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
296 .id = CODEC_ID_H264, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
297 .priv_data_size = sizeof(X264Context), |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
298 .init = X264_init, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
299 .encode = X264_frame, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
300 .close = X264_close, |
4114 | 301 .capabilities = CODEC_CAP_DELAY, |
6788 | 302 .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
|
303 .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
|
304 }; |