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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
1 /*
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
2 * H.264 encoding using the x264 library
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
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
23 #include <stdio.h>
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
24 #include <stdlib.h>
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
38 [X264_LOG_ERROR] = AV_LOG_ERROR,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
39 [X264_LOG_WARNING] = AV_LOG_ERROR,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
40 [X264_LOG_INFO] = AV_LOG_INFO,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
37cdd1a1174a s/u_char/uint8_t/
mru
parents: 2569
diff changeset
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
37cdd1a1174a s/u_char/uint8_t/
mru
parents: 2569
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
58 int s = x264_nal_encode(p, &size, 1, nals + i);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
59 if(s < 0)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
60 return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
80 x4->pic.img.plane[i] = frame->data[i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
111 x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR;
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
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
dfa4d2773d13 work with latest svn of x264
mru
parents: 2637
diff changeset
140 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000;
2882
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
141 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
142 x4->params.rc.b_stat_write = (avctx->flags & CODEC_FLAG_PASS1);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
143 if(avctx->flags & CODEC_FLAG_PASS2) x4->params.rc.b_stat_read = 1;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
144 else{
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
145 if(avctx->crf) x4->params.rc.i_rf_constant = avctx->crf;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
146 else if(avctx->cqp > -1) x4->params.rc.i_qp_constant = avctx->cqp;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
147 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
148
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
149 // if neither crf nor cqp modes are selected we have to enable the RC
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
150 // we do it this way because we cannot check if the bitrate has been set
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
151 if(!(avctx->crf || (avctx->cqp > -1))) x4->params.rc.b_cbr = 1;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
152
2569
980f66959698 indentation fix
mru
parents: 2568
diff changeset
153 x4->params.i_bframe = avctx->max_b_frames;
980f66959698 indentation fix
mru
parents: 2568
diff changeset
154 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
155 x4->params.b_bframe_adaptive = avctx->b_frame_strategy;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
156 x4->params.i_bframe_bias = avctx->bframebias;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
157 x4->params.b_bframe_pyramid = (avctx->flags2 & CODEC_FLAG2_BPYRAMID);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
158
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
159 x4->params.i_keyint_min = avctx->keyint_min;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
160 if(x4->params.i_keyint_min > x4->params.i_keyint_max)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
161 x4->params.i_keyint_min = x4->params.i_keyint_max;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
162
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
163 x4->params.i_scenecut_threshold = avctx->scenechange_threshold;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
164
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
165 x4->params.b_deblocking_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
166 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
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
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
173 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
174 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
175 x4->params.rc.f_complexity_blur = avctx->complexityblur;
2882
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
176
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
177 x4->params.i_frame_reference = avctx->refs;
2563
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
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
ef44d24680d1 switch to native time bases
michael
parents: 2603
diff changeset
183 x4->params.i_fps_num = avctx->time_base.den;
ef44d24680d1 switch to native time bases
michael
parents: 2603
diff changeset
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
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
186 x4->params.analyse.inter = 0;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
187 if(avctx->partitions){
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
188 if(avctx->partitions & X264_PART_I4X4)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
189 x4->params.analyse.inter |= X264_ANALYSE_I4x4;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
190 if(avctx->partitions & X264_PART_I8X8)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
191 x4->params.analyse.inter |= X264_ANALYSE_I8x8;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
192 if(avctx->partitions & X264_PART_P8X8)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
193 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
194 if(avctx->partitions & X264_PART_P4X4)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
195 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
196 if(avctx->partitions & X264_PART_B8X8)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
197 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
198 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
199
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
200 x4->params.analyse.i_direct_mv_pred = avctx->directpred;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
201
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
202 x4->params.analyse.b_weighted_bipred = (avctx->flags2 & CODEC_FLAG2_WPRED);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
203
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
204 if(avctx->me_method == ME_EPZS)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
205 x4->params.analyse.i_me_method = X264_ME_DIA;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
206 else if(avctx->me_method == ME_HEX)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
207 x4->params.analyse.i_me_method = X264_ME_HEX;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
208 else if(avctx->me_method == ME_UMH)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
209 x4->params.analyse.i_me_method = X264_ME_UMH;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
210 else if(avctx->me_method == ME_FULL)
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
211 x4->params.analyse.i_me_method = X264_ME_ESA;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
212 else x4->params.analyse.i_me_method = X264_ME_HEX;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
213
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
214 x4->params.analyse.i_me_range = avctx->me_range;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
215 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
216
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
217 x4->params.analyse.b_bframe_rdo = (avctx->flags2 & CODEC_FLAG2_BRDO);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
218 x4->params.analyse.b_mixed_references =
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
219 (avctx->flags2 & CODEC_FLAG2_MIXED_REFS);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
220 x4->params.analyse.b_chroma_me = (avctx->me_cmp & FF_CMP_CHROMA);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
221 x4->params.analyse.b_transform_8x8 = (avctx->flags2 & CODEC_FLAG2_8X8DCT);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
222 x4->params.analyse.b_fast_pskip = (avctx->flags2 & CODEC_FLAG2_FASTPSKIP);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
223
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
224 x4->params.analyse.i_trellis = avctx->trellis;
3133
7dcdc73c1631 pass noise reduction option to x264
mru
parents: 3063
diff changeset
225 x4->params.analyse.i_noise_reduction = avctx->noise_reduction;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
226
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
227 if(avctx->level > 0) x4->params.i_level_idc = avctx->level;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
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
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
230 (float)avctx->bit_rate_tolerance/avctx->bit_rate;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
231
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
232 if((avctx->rc_buffer_size != 0) &&
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
233 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)){
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
234 x4->params.rc.f_vbv_buffer_init =
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
235 (float)avctx->rc_initial_buffer_occupancy/avctx->rc_buffer_size;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
236 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
237 else x4->params.rc.f_vbv_buffer_init = 0.9;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
238
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
239 x4->params.rc.f_ip_factor = 1/fabs(avctx->i_quant_factor);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
240 x4->params.rc.f_pb_factor = avctx->b_quant_factor;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
241 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
242 x4->params.rc.psz_rc_eq = avctx->rc_eq;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
243
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
244 x4->params.analyse.b_psnr = (avctx->flags & CODEC_FLAG_PSNR);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
245 x4->params.i_log_level = X264_LOG_DEBUG;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
246
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
247 x4->params.b_aud = (avctx->flags2 & CODEC_FLAG2_AUD);
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
248
2742
5bdc60634470 enable x264 multi-threading
mru
parents: 2682
diff changeset
249 x4->params.i_threads = avctx->thread_count;
5bdc60634470 enable x264 multi-threading
mru
parents: 2682
diff changeset
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 };