annotate libx264.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 22c2450cd00b
children
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
5220
744e91a36a23 update my email address
mru
parents: 5103
diff changeset
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
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
25 #include <stdio.h>
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
26 #include <stdlib.h>
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
27 #include <string.h>
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
28
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
29 typedef struct X264Context {
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
30 x264_param_t params;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
31 x264_t *enc;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
32 x264_picture_t pic;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
33 uint8_t *sei;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
34 int sei_size;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
35 AVFrame out_pic;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
36 } X264Context;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
37
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
38 static void X264_log(void *p, int level, const char *fmt, va_list args)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
39 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
40 static const int level_map[] = {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
41 [X264_LOG_ERROR] = AV_LOG_ERROR,
5293
de5b524db473 map warning levels between libx264 and libavutil
benoit
parents: 5220
diff changeset
42 [X264_LOG_WARNING] = AV_LOG_WARNING,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
43 [X264_LOG_INFO] = AV_LOG_INFO,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
44 [X264_LOG_DEBUG] = AV_LOG_DEBUG
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
45 };
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
46
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
47 if (level < 0 || level > X264_LOG_DEBUG)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
48 return;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
49
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
50 av_vlog(p, level_map[level], fmt, args);
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
51 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
52
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
53
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
54 static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size,
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
55 x264_nal_t *nals, int nnal, int skip_sei)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
56 {
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
57 X264Context *x4 = ctx->priv_data;
2603
37cdd1a1174a s/u_char/uint8_t/
mru
parents: 2569
diff changeset
58 uint8_t *p = buf;
10233
f397ad0fa67d Add support for new x264 API.
darkshikari
parents: 10146
diff changeset
59 int i;
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
60
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
61 /* Write the SEI as part of the first frame. */
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
62 if (x4->sei_size > 0 && nnal > 0) {
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
63 memcpy(p, x4->sei, x4->sei_size);
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
64 p += x4->sei_size;
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
65 x4->sei_size = 0;
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
66 }
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
67
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
68 for (i = 0; i < nnal; i++){
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
69 /* Don't put the SEI in extradata. */
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
70 if (skip_sei && nals[i].i_type == NAL_SEI) {
10233
f397ad0fa67d Add support for new x264 API.
darkshikari
parents: 10146
diff changeset
71 x4->sei_size = nals[i].i_payload;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
72 x4->sei = av_malloc(x4->sei_size);
10233
f397ad0fa67d Add support for new x264 API.
darkshikari
parents: 10146
diff changeset
73 memcpy(x4->sei, nals[i].p_payload, nals[i].i_payload);
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
74 continue;
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
75 }
10233
f397ad0fa67d Add support for new x264 API.
darkshikari
parents: 10146
diff changeset
76 memcpy(p, nals[i].p_payload, nals[i].i_payload);
f397ad0fa67d Add support for new x264 API.
darkshikari
parents: 10146
diff changeset
77 p += nals[i].i_payload;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
78 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
79
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
80 return p - buf;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
81 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
82
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
83 static int X264_frame(AVCodecContext *ctx, uint8_t *buf,
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
84 int bufsize, void *data)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
85 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
86 X264Context *x4 = ctx->priv_data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
87 AVFrame *frame = data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
88 x264_nal_t *nal;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
89 int nnal, i;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
90 x264_picture_t pic_out;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
91
11814
22c2450cd00b Properly initialize x264_picture_t in libx264.
darkshikari
parents: 11748
diff changeset
92 x264_picture_init( &x4->pic );
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
93 x4->pic.img.i_csp = X264_CSP_I420;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
94 x4->pic.img.i_plane = 3;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
95
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
96 if (frame) {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
97 for (i = 0; i < 3; i++) {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
98 x4->pic.img.plane[i] = frame->data[i];
4115
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
99 x4->pic.img.i_stride[i] = frame->linesize[i];
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
100 }
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
101
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
102 x4->pic.i_pts = frame->pts;
4115
4e1b1a37e9d6 indentation
mru
parents: 4114
diff changeset
103 x4->pic.i_type = X264_TYPE_AUTO;
4114
903017d72ffe CODEC_CAP_DELAY support
mru
parents: 4030
diff changeset
104 }
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
105
11748
40911dc14bdc fix x264 encoding when delay is > number of input frames
bcoudurier
parents: 11689
diff changeset
106 do {
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
107 if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
108 return -1;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
109
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
110 bufsize = encode_nals(ctx, buf, bufsize, nal, nnal, 0);
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
111 if (bufsize < 0)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
112 return -1;
11748
40911dc14bdc fix x264 encoding when delay is > number of input frames
bcoudurier
parents: 11689
diff changeset
113 } while (!bufsize && !frame && x264_encoder_delayed_frames(x4->enc));
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
114
10936
b2ea6b0d17bf Update libx264.c to use new libx264 features
darkshikari
parents: 10662
diff changeset
115 /* FIXME: libx264 now provides DTS, but AVFrame doesn't have a field for it. */
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
116 x4->out_pic.pts = pic_out.i_pts;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
117
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
118 switch (pic_out.i_type) {
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
119 case X264_TYPE_IDR:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
120 case X264_TYPE_I:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
121 x4->out_pic.pict_type = FF_I_TYPE;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
122 break;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
123 case X264_TYPE_P:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
124 x4->out_pic.pict_type = FF_P_TYPE;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
125 break;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
126 case X264_TYPE_B:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
127 case X264_TYPE_BREF:
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
128 x4->out_pic.pict_type = FF_B_TYPE;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
129 break;
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
10936
b2ea6b0d17bf Update libx264.c to use new libx264 features
darkshikari
parents: 10662
diff changeset
132 x4->out_pic.key_frame = pic_out.b_keyframe;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
133 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
134
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
135 return bufsize;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
136 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
137
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
138 static av_cold int X264_close(AVCodecContext *avctx)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
139 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
140 X264Context *x4 = avctx->priv_data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
141
8024
4f555a34e00f Fix mem leak.
benoit
parents: 7983
diff changeset
142 av_freep(&avctx->extradata);
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
143 av_free(x4->sei);
8024
4f555a34e00f Fix mem leak.
benoit
parents: 7983
diff changeset
144
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
145 if (x4->enc)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2936
diff changeset
146 x264_encoder_close(x4->enc);
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
147
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
148 return 0;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
149 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
150
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
151 static av_cold int X264_init(AVCodecContext *avctx)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
152 {
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
153 X264Context *x4 = avctx->priv_data;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
154
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
155 x4->sei_size = 0;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
156 x264_param_default(&x4->params);
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
157
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
158 x4->params.pf_log = X264_log;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
159 x4->params.p_log_private = avctx;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
160
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
161 x4->params.i_keyint_max = avctx->gop_size;
11689
2312dfbe9251 Add intra refresh and crf-max support to the libavcodec libx264 wrapper.
darkshikari
parents: 11642
diff changeset
162 x4->params.b_intra_refresh = avctx->flags2 & CODEC_FLAG2_INTRA_REFRESH;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
163 x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
2682
dfa4d2773d13 work with latest svn of x264
mru
parents: 2637
diff changeset
164 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
165 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000;
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
166 x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
167 if (avctx->flags & CODEC_FLAG_PASS2) {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
168 x4->params.rc.b_stat_read = 1;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
169 } else {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
170 if (avctx->crf) {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
171 x4->params.rc.i_rc_method = X264_RC_CRF;
4030
ffe1b004ecc7 Make ffmpeg work with x264 r592
lu_zero
parents: 3947
diff changeset
172 x4->params.rc.f_rf_constant = avctx->crf;
11689
2312dfbe9251 Add intra refresh and crf-max support to the libavcodec libx264 wrapper.
darkshikari
parents: 11642
diff changeset
173 x4->params.rc.f_rf_constant_max = avctx->crf_max;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
174 } else if (avctx->cqp > -1) {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
175 x4->params.rc.i_rc_method = X264_RC_CQP;
3493
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
176 x4->params.rc.i_qp_constant = avctx->cqp;
7dc6dcbc6960 sync to x264 r537
lorenm
parents: 3133
diff changeset
177 }
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
178 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
179
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
180 // if neither crf nor cqp modes are selected we have to enable the RC
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
181 // we do it this way because we cannot check if the bitrate has been set
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
182 if (!(avctx->crf || (avctx->cqp > -1)))
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
183 x4->params.rc.i_rc_method = X264_RC_ABR;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
184
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
185 x4->params.i_bframe = avctx->max_b_frames;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
186 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC;
7868
850abcd10e19 sync to latest x264 git, field was renamed
bcoudurier
parents: 7729
diff changeset
187 x4->params.i_bframe_adaptive = avctx->b_frame_strategy;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
188 x4->params.i_bframe_bias = avctx->bframebias;
10435
f1d179ba9e7a Update libx264.c for x264 API change
darkshikari
parents: 10319
diff changeset
189 x4->params.i_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? X264_B_PYRAMID_NORMAL : X264_B_PYRAMID_NONE;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
190 avctx->has_b_frames = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
191
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
192 x4->params.i_keyint_min = avctx->keyint_min;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
193 if (x4->params.i_keyint_min > x4->params.i_keyint_max)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
194 x4->params.i_keyint_min = x4->params.i_keyint_max;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
195
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
196 x4->params.i_scenecut_threshold = avctx->scenechange_threshold;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
197
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
198 x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
199 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
200 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
201
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
202 x4->params.rc.i_qp_min = avctx->qmin;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
203 x4->params.rc.i_qp_max = avctx->qmax;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
204 x4->params.rc.i_qp_step = avctx->max_qdiff;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
205
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
206 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
207 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
208 x4->params.rc.f_complexity_blur = avctx->complexityblur;
2882
dd5a1abbf9a3 set more x264 encoding parameters
mru
parents: 2784
diff changeset
209
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
210 x4->params.i_frame_reference = avctx->refs;
2563
1e52ef4887b5 set constant QP from AVCodecContext.global_quality.
mru
parents: 2556
diff changeset
211
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
212 x4->params.i_width = avctx->width;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
213 x4->params.i_height = avctx->height;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
214 x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
215 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den;
10936
b2ea6b0d17bf Update libx264.c to use new libx264 features
darkshikari
parents: 10662
diff changeset
216 x4->params.i_fps_num = x4->params.i_timebase_den = avctx->time_base.den;
b2ea6b0d17bf Update libx264.c to use new libx264 features
darkshikari
parents: 10662
diff changeset
217 x4->params.i_fps_den = x4->params.i_timebase_num = avctx->time_base.num;
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
218
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
219 x4->params.analyse.inter = 0;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
220 if (avctx->partitions) {
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
221 if (avctx->partitions & X264_PART_I4X4)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
222 x4->params.analyse.inter |= X264_ANALYSE_I4x4;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
223 if (avctx->partitions & X264_PART_I8X8)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
224 x4->params.analyse.inter |= X264_ANALYSE_I8x8;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
225 if (avctx->partitions & X264_PART_P8X8)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
226 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
227 if (avctx->partitions & X264_PART_P4X4)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
228 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
229 if (avctx->partitions & X264_PART_B8X8)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
230 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
231 }
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
232
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
233 x4->params.analyse.i_direct_mv_pred = avctx->directpred;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
234
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
235 x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED;
10566
7ca185b4bc42 Add weightp support in API for libx264.
darkshikari
parents: 10435
diff changeset
236 x4->params.analyse.i_weighted_pred = avctx->weighted_p_pred;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
237
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
238 if (avctx->me_method == ME_EPZS)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
239 x4->params.analyse.i_me_method = X264_ME_DIA;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
240 else if (avctx->me_method == ME_HEX)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
241 x4->params.analyse.i_me_method = X264_ME_HEX;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
242 else if (avctx->me_method == ME_UMH)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
243 x4->params.analyse.i_me_method = X264_ME_UMH;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
244 else if (avctx->me_method == ME_FULL)
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
245 x4->params.analyse.i_me_method = X264_ME_ESA;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
246 else if (avctx->me_method == ME_TESA)
7002
92c74bbdf4fb add esa/dia compat me options and new tesa for libx264
bcoudurier
parents: 7001
diff changeset
247 x4->params.analyse.i_me_method = X264_ME_TESA;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
248 else x4->params.analyse.i_me_method = X264_ME_HEX;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
249
11642
52bc4e605761 vertical align in libx264.c
darkshikari
parents: 11568
diff changeset
250 x4->params.rc.i_aq_mode = avctx->aq_mode;
52bc4e605761 vertical align in libx264.c
darkshikari
parents: 11568
diff changeset
251 x4->params.rc.f_aq_strength = avctx->aq_strength;
52bc4e605761 vertical align in libx264.c
darkshikari
parents: 11568
diff changeset
252 x4->params.rc.i_lookahead = avctx->rc_lookahead;
11538
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
253
11642
52bc4e605761 vertical align in libx264.c
darkshikari
parents: 11568
diff changeset
254 x4->params.analyse.b_psy = avctx->flags2 & CODEC_FLAG2_PSY;
52bc4e605761 vertical align in libx264.c
darkshikari
parents: 11568
diff changeset
255 x4->params.analyse.f_psy_rd = avctx->psy_rd;
52bc4e605761 vertical align in libx264.c
darkshikari
parents: 11568
diff changeset
256 x4->params.analyse.f_psy_trellis = avctx->psy_trellis;
11538
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
257
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
258 x4->params.analyse.i_me_range = avctx->me_range;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
259 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
260
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
261 x4->params.analyse.b_mixed_references = avctx->flags2 & CODEC_FLAG2_MIXED_REFS;
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
262 x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA;
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
263 x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT;
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
264 x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
265
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
266 x4->params.analyse.i_trellis = avctx->trellis;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
267 x4->params.analyse.i_noise_reduction = avctx->noise_reduction;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
268
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
269 if (avctx->level > 0)
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
270 x4->params.i_level_idc = avctx->level;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
271
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3054
diff changeset
272 x4->params.rc.f_rate_tolerance =
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
273 (float)avctx->bit_rate_tolerance/avctx->bit_rate;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
274
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
275 if ((avctx->rc_buffer_size != 0) &&
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
276 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)) {
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
277 x4->params.rc.f_vbv_buffer_init =
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
278 (float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size;
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
279 } else
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
280 x4->params.rc.f_vbv_buffer_init = 0.9;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
281
10658
8a7d79132993 Add MBtree support for libx264
darkshikari
parents: 10566
diff changeset
282 x4->params.rc.b_mb_tree = !!(avctx->flags2 & CODEC_FLAG2_MBTREE);
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
283 x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor);
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
284 x4->params.rc.f_pb_factor = avctx->b_quant_factor;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
285 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset;
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
286
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
287 x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR;
11568
e2841a104105 Fix typo: CODEC_FLAG2_SSIM is in flags2, not in flags.
benoit
parents: 11560
diff changeset
288 x4->params.analyse.b_ssim = avctx->flags2 & CODEC_FLAG2_SSIM;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
289 x4->params.i_log_level = X264_LOG_DEBUG;
2996
bf34de4233a0 update x264 wrapper.
lorenm
parents: 2979
diff changeset
290
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
291 x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD;
2742
5bdc60634470 enable x264 multi-threading
mru
parents: 2682
diff changeset
292
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
293 x4->params.i_threads = avctx->thread_count;
7001
8193f8ae7ff4 x264 interlaced encoding option
bcoudurier
parents: 7000
diff changeset
294
10662
80161fd66fd1 revert r20775, because equivalent code has been committed to x264 instead
lorenm
parents: 10659
diff changeset
295 x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT;
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
296
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
297 if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER)
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
298 x4->params.b_repeat_headers = 0;
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
299
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
300 x4->enc = x264_encoder_open(&x4->params);
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
301 if (!x4->enc)
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
302 return -1;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
303
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
304 avctx->coded_frame = &x4->out_pic;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
305
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
306 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
307 x264_nal_t *nal;
11538
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
308 int nnal, s, i;
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
309
10233
f397ad0fa67d Add support for new x264 API.
darkshikari
parents: 10146
diff changeset
310 s = x264_encoder_headers(x4->enc, &nal, &nnal);
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
311
11538
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
312 for (i = 0; i < nnal; i++)
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
313 if (nal[i].i_type == NAL_SEI)
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
314 av_log(avctx, AV_LOG_INFO, "%s\n", nal[i].p_payload+25);
9beb570426f4 Enable more libx264 options, aq, psy, rc lookahead and ssim
bcoudurier
parents: 10936
diff changeset
315
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
316 avctx->extradata = av_malloc(s);
9899
06ab8ac1a593 Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents: 8024
diff changeset
317 avctx->extradata_size = encode_nals(avctx, avctx->extradata, s, nal, nnal, 1);
3054
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
318 }
d640e46c69ea place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents: 3036
diff changeset
319
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
320 return 0;
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
321 }
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
322
5103
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
323 AVCodec libx264_encoder = {
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
324 .name = "libx264",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11538
diff changeset
325 .type = AVMEDIA_TYPE_VIDEO,
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
326 .id = CODEC_ID_H264,
2556
e5af3bc1d038 H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff changeset
327 .priv_data_size = sizeof(X264Context),
10319
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
328 .init = X264_init,
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
329 .encode = X264_frame,
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
330 .close = X264_close,
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
331 .capabilities = CODEC_CAP_DELAY,
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
332 .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE },
9e43db5ad7ef cosmetics: K&R coding style, prettyprinting
diego
parents: 10233
diff changeset
333 .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
334 };