Mercurial > libavcodec.hg
annotate x264.c @ 3308:57078a058b96 libavcodec
fix compilation of 3dnowext instinsincs, both on ia32 and AMD64.
3dnow intrinsincs are for now only compiled if 3dnowext support is available. (I should add smth that
checks for plain 3dnow later)
author | gpoirier |
---|---|
date | Tue, 16 May 2006 14:24:45 +0000 |
parents | 7dcdc73c1631 |
children | 7dc6dcbc6960 |
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 |
2568
f06d5bf3da71
B frames and CABAC/CAVLC selection by Erik Slagter (erik at slagter dot name)
mru
parents:
2563
diff
changeset
|
3 * Copyright (C) 2005 Mans Rullgard <mru@inprovide.com> |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
4 * |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
6 * 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
|
7 * License as published by the Free Software Foundation; either |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
8 * version 2 of the License, or (at your option) any later version. |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
9 * |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
11 * 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
|
12 * 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
|
13 * Lesser General Public License for more details. |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
14 * |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2996
diff
changeset
|
17 * 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
|
18 */ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
19 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
20 #include "avcodec.h" |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
21 #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
|
22 #include <math.h> |
2996 | 23 #include <stdio.h> |
24 #include <stdlib.h> | |
25 #include <string.h> | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
26 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
27 typedef struct X264Context { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
28 x264_param_t params; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
29 x264_t *enc; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
30 x264_picture_t pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
31 AVFrame out_pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
32 } X264Context; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
33 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
34 static void |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
35 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
|
36 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
37 static const int level_map[] = { |
2979 | 38 [X264_LOG_ERROR] = AV_LOG_ERROR, |
39 [X264_LOG_WARNING] = AV_LOG_ERROR, | |
40 [X264_LOG_INFO] = AV_LOG_INFO, | |
41 [X264_LOG_DEBUG] = AV_LOG_DEBUG | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
42 }; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
43 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
44 if(level < 0 || level > X264_LOG_DEBUG) |
2979 | 45 return; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
46 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
47 av_vlog(p, level_map[level], fmt, args); |
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 |
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 static int |
2603 | 52 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
|
53 { |
2603 | 54 uint8_t *p = buf; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
55 int i; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
56 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
57 for(i = 0; i < nnal; i++){ |
2979 | 58 int s = x264_nal_encode(p, &size, 1, nals + i); |
59 if(s < 0) | |
60 return -1; | |
61 p += s; | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
62 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
63 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
64 return p - buf; |
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 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
67 extern int |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
68 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
|
69 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
70 X264Context *x4 = ctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
71 AVFrame *frame = data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
72 x264_nal_t *nal; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
73 int nnal, i; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
74 x264_picture_t pic_out; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
75 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
76 x4->pic.img.i_csp = X264_CSP_I420; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
77 x4->pic.img.i_plane = 3; |
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 for(i = 0; i < 3; i++){ |
2979 | 80 x4->pic.img.plane[i] = frame->data[i]; |
81 x4->pic.img.i_stride[i] = frame->linesize[i]; | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
82 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
83 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
84 x4->pic.i_pts = frame->pts; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
85 x4->pic.i_type = X264_TYPE_AUTO; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
86 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
87 if(x264_encoder_encode(x4->enc, &nal, &nnal, &x4->pic, &pic_out)) |
2979 | 88 return -1; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
89 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
90 bufsize = encode_nals(buf, bufsize, nal, nnal); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
91 if(bufsize < 0) |
2979 | 92 return -1; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
93 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
94 /* FIXME: dts */ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
95 x4->out_pic.pts = pic_out.i_pts; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
96 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
97 switch(pic_out.i_type){ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
98 case X264_TYPE_IDR: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
99 case X264_TYPE_I: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
100 x4->out_pic.pict_type = FF_I_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
101 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
102 case X264_TYPE_P: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
103 x4->out_pic.pict_type = FF_P_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
104 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
105 case X264_TYPE_B: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
106 case X264_TYPE_BREF: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
107 x4->out_pic.pict_type = FF_B_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
108 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
109 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
110 |
2563 | 111 x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR; |
112 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
|
113 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
114 return bufsize; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
115 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
116 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
117 static int |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
118 X264_close(AVCodecContext *avctx) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
119 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
120 X264Context *x4 = avctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
121 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
122 if(x4->enc) |
2979 | 123 x264_encoder_close(x4->enc); |
2556
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 return 0; |
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 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
128 extern int |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
129 X264_init(AVCodecContext *avctx) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
130 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
131 X264Context *x4 = avctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
132 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
133 x264_param_default(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
134 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
135 x4->params.pf_log = X264_log; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
136 x4->params.p_log_private = 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 x4->params.i_keyint_max = avctx->gop_size; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
139 x4->params.rc.i_bitrate = avctx->bit_rate / 1000; |
2682 | 140 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000; |
2882 | 141 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000; |
2996 | 142 x4->params.rc.b_stat_write = (avctx->flags & CODEC_FLAG_PASS1); |
143 if(avctx->flags & CODEC_FLAG_PASS2) x4->params.rc.b_stat_read = 1; | |
144 else{ | |
145 if(avctx->crf) x4->params.rc.i_rf_constant = avctx->crf; | |
146 else if(avctx->cqp > -1) x4->params.rc.i_qp_constant = avctx->cqp; | |
147 } | |
148 | |
149 // if neither crf nor cqp modes are selected we have to enable the RC | |
150 // we do it this way because we cannot check if the bitrate has been set | |
151 if(!(avctx->crf || (avctx->cqp > -1))) x4->params.rc.b_cbr = 1; | |
152 | |
2569 | 153 x4->params.i_bframe = avctx->max_b_frames; |
154 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC; | |
2996 | 155 x4->params.b_bframe_adaptive = avctx->b_frame_strategy; |
156 x4->params.i_bframe_bias = avctx->bframebias; | |
157 x4->params.b_bframe_pyramid = (avctx->flags2 & CODEC_FLAG2_BPYRAMID); | |
158 | |
159 x4->params.i_keyint_min = avctx->keyint_min; | |
160 if(x4->params.i_keyint_min > x4->params.i_keyint_max) | |
161 x4->params.i_keyint_min = x4->params.i_keyint_max; | |
162 | |
163 x4->params.i_scenecut_threshold = avctx->scenechange_threshold; | |
164 | |
165 x4->params.b_deblocking_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER); | |
166 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha; | |
167 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
|
168 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
169 x4->params.rc.i_qp_min = avctx->qmin; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
170 x4->params.rc.i_qp_max = avctx->qmax; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
171 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
|
172 |
2882 | 173 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */ |
174 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */ | |
2996 | 175 x4->params.rc.f_complexity_blur = avctx->complexityblur; |
2882 | 176 |
2996 | 177 x4->params.i_frame_reference = avctx->refs; |
2563 | 178 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
179 x4->params.i_width = avctx->width; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
180 x4->params.i_height = avctx->height; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
181 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
|
182 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den; |
2637 | 183 x4->params.i_fps_num = avctx->time_base.den; |
184 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
|
185 |
2996 | 186 x4->params.analyse.inter = 0; |
187 if(avctx->partitions){ | |
188 if(avctx->partitions & X264_PART_I4X4) | |
189 x4->params.analyse.inter |= X264_ANALYSE_I4x4; | |
190 if(avctx->partitions & X264_PART_I8X8) | |
191 x4->params.analyse.inter |= X264_ANALYSE_I8x8; | |
192 if(avctx->partitions & X264_PART_P8X8) | |
193 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16; | |
194 if(avctx->partitions & X264_PART_P4X4) | |
195 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8; | |
196 if(avctx->partitions & X264_PART_B8X8) | |
197 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16; | |
198 } | |
199 | |
200 x4->params.analyse.i_direct_mv_pred = avctx->directpred; | |
201 | |
202 x4->params.analyse.b_weighted_bipred = (avctx->flags2 & CODEC_FLAG2_WPRED); | |
203 | |
204 if(avctx->me_method == ME_EPZS) | |
205 x4->params.analyse.i_me_method = X264_ME_DIA; | |
206 else if(avctx->me_method == ME_HEX) | |
207 x4->params.analyse.i_me_method = X264_ME_HEX; | |
208 else if(avctx->me_method == ME_UMH) | |
209 x4->params.analyse.i_me_method = X264_ME_UMH; | |
210 else if(avctx->me_method == ME_FULL) | |
211 x4->params.analyse.i_me_method = X264_ME_ESA; | |
212 else x4->params.analyse.i_me_method = X264_ME_HEX; | |
213 | |
214 x4->params.analyse.i_me_range = avctx->me_range; | |
215 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; | |
216 | |
217 x4->params.analyse.b_bframe_rdo = (avctx->flags2 & CODEC_FLAG2_BRDO); | |
218 x4->params.analyse.b_mixed_references = | |
219 (avctx->flags2 & CODEC_FLAG2_MIXED_REFS); | |
220 x4->params.analyse.b_chroma_me = (avctx->me_cmp & FF_CMP_CHROMA); | |
221 x4->params.analyse.b_transform_8x8 = (avctx->flags2 & CODEC_FLAG2_8X8DCT); | |
222 x4->params.analyse.b_fast_pskip = (avctx->flags2 & CODEC_FLAG2_FASTPSKIP); | |
223 | |
224 x4->params.analyse.i_trellis = avctx->trellis; | |
3133 | 225 x4->params.analyse.i_noise_reduction = avctx->noise_reduction; |
2996 | 226 |
227 if(avctx->level > 0) x4->params.i_level_idc = avctx->level; | |
228 | |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
229 x4->params.rc.f_rate_tolerance = |
2996 | 230 (float)avctx->bit_rate_tolerance/avctx->bit_rate; |
231 | |
232 if((avctx->rc_buffer_size != 0) && | |
233 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)){ | |
234 x4->params.rc.f_vbv_buffer_init = | |
235 (float)avctx->rc_initial_buffer_occupancy/avctx->rc_buffer_size; | |
236 } | |
237 else x4->params.rc.f_vbv_buffer_init = 0.9; | |
238 | |
239 x4->params.rc.f_ip_factor = 1/fabs(avctx->i_quant_factor); | |
240 x4->params.rc.f_pb_factor = avctx->b_quant_factor; | |
241 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset; | |
242 x4->params.rc.psz_rc_eq = avctx->rc_eq; | |
243 | |
244 x4->params.analyse.b_psnr = (avctx->flags & CODEC_FLAG_PSNR); | |
245 x4->params.i_log_level = X264_LOG_DEBUG; | |
246 | |
247 x4->params.b_aud = (avctx->flags2 & CODEC_FLAG2_AUD); | |
248 | |
2742 | 249 x4->params.i_threads = avctx->thread_count; |
250 | |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
251 if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){ |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
252 x4->params.b_repeat_headers = 0; |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
253 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
254 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
255 x4->enc = x264_encoder_open(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
256 if(!x4->enc) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
257 return -1; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
258 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
259 avctx->coded_frame = &x4->out_pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
260 |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
261 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
|
262 x264_nal_t *nal; |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
263 int nnal, i, s = 0; |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
264 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
265 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
|
266 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
267 /* 5 bytes NAL header + worst case escaping */ |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
268 for(i = 0; i < nnal; i++) |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
269 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
|
270 |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
271 avctx->extradata = av_malloc(s); |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
272 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
|
273 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
274 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
275 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
276 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
277 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
278 AVCodec x264_encoder = { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
279 .name = "h264", |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
280 .type = CODEC_TYPE_VIDEO, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
281 .id = CODEC_ID_H264, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
282 .priv_data_size = sizeof(X264Context), |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
283 .init = X264_init, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
284 .encode = X264_frame, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
285 .close = X264_close, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
286 .pix_fmts = (enum PixelFormat[]) { PIX_FMT_YUV420P, -1 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
287 }; |