Mercurial > libavcodec.hg
annotate libx264.c @ 9899:06ab8ac1a593 libavcodec
Fix libx264.c to not drop SEI userdata from x264 encoder.
Most muxers in ffmpeg ignore the SEI if it is placed in extradata, so instead
it has to be catted to the front of the first video frame.
author | darkshikari |
---|---|
date | Tue, 30 Jun 2009 23:45:01 +0000 |
parents | 4f555a34e00f |
children | 38cfe222e1a4 |
rev | line source |
---|---|
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
1 /* |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
2 * H.264 encoding using the x264 library |
5220 | 3 * Copyright (C) 2005 Mans Rullgard <mans@mansr.com> |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3653
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3653
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3653
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3653
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3653
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
16 * |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3653
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2996
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
20 */ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
21 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
22 #include "avcodec.h" |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
23 #include <x264.h> |
2784
cdf74a048614
patch from http://www.freebsd.org/cgi/cvsweb.cgi/ports/multimedia/ffmpeg-devel/files/patch-libavcodec::x264.c
michael
parents:
2742
diff
changeset
|
24 #include <math.h> |
2996 | 25 #include <stdio.h> |
26 #include <stdlib.h> | |
27 #include <string.h> | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
28 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
29 typedef struct X264Context { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
30 x264_param_t params; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
31 x264_t *enc; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
32 x264_picture_t pic; |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
33 uint8_t *sei; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
34 int sei_size; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
35 AVFrame out_pic; |
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 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
38 static void |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
39 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
|
40 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
41 static const int level_map[] = { |
2979 | 42 [X264_LOG_ERROR] = AV_LOG_ERROR, |
5293 | 43 [X264_LOG_WARNING] = AV_LOG_WARNING, |
2979 | 44 [X264_LOG_INFO] = AV_LOG_INFO, |
45 [X264_LOG_DEBUG] = AV_LOG_DEBUG | |
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 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
48 if(level < 0 || level > X264_LOG_DEBUG) |
2979 | 49 return; |
2556
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 av_vlog(p, level_map[level], fmt, args); |
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 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
54 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
55 static int |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
56 encode_nals(AVCodecContext *ctx, uint8_t *buf, int size, 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
|
57 { |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
58 X264Context *x4 = ctx->priv_data; |
2603 | 59 uint8_t *p = buf; |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
60 int i, s; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
61 |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
62 /* Write the SEI as part of the first frame. */ |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
63 if(x4->sei_size > 0 && nnal > 0) |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
64 { |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
65 memcpy(p, x4->sei, x4->sei_size); |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
66 p += x4->sei_size; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
67 x4->sei_size = 0; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
68 } |
2556
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 for(i = 0; i < nnal; i++){ |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
71 /* Don't put the SEI in extradata. */ |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
72 if(skip_sei && nals[i].i_type == NAL_SEI) |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
73 { |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
74 x4->sei = av_malloc( 5 + nals[i].i_payload * 4 / 3 ); |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
75 if(x264_nal_encode(x4->sei, &x4->sei_size, 1, nals + i) < 0) |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
76 return -1; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
77 continue; |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
78 } |
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
79 s = x264_nal_encode(p, &size, 1, nals + i); |
2979 | 80 if(s < 0) |
81 return -1; | |
82 p += s; | |
2556
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 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
85 return p - buf; |
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 |
4169 | 88 static int |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
89 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
|
90 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
91 X264Context *x4 = ctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
92 AVFrame *frame = data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
93 x264_nal_t *nal; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
94 int nnal, i; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
95 x264_picture_t pic_out; |
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 x4->pic.img.i_csp = X264_CSP_I420; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
98 x4->pic.img.i_plane = 3; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
99 |
4114 | 100 if (frame) { |
4115 | 101 for(i = 0; i < 3; i++){ |
102 x4->pic.img.plane[i] = frame->data[i]; | |
103 x4->pic.img.i_stride[i] = frame->linesize[i]; | |
104 } | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
105 |
4115 | 106 x4->pic.i_pts = frame->pts; |
107 x4->pic.i_type = X264_TYPE_AUTO; | |
4114 | 108 } |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
109 |
4114 | 110 if(x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, |
111 &pic_out)) | |
2979 | 112 return -1; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
113 |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
114 bufsize = encode_nals(ctx, buf, bufsize, nal, nnal, 0); |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
115 if(bufsize < 0) |
2979 | 116 return -1; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
117 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
118 /* FIXME: dts */ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
119 x4->out_pic.pts = pic_out.i_pts; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
120 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
121 switch(pic_out.i_type){ |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
122 case X264_TYPE_IDR: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
123 case X264_TYPE_I: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
124 x4->out_pic.pict_type = FF_I_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_P: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
127 x4->out_pic.pict_type = FF_P_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
128 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
129 case X264_TYPE_B: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
130 case X264_TYPE_BREF: |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
131 x4->out_pic.pict_type = FF_B_TYPE; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
132 break; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
133 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
134 |
2563 | 135 x4->out_pic.key_frame = pic_out.i_type == X264_TYPE_IDR; |
136 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
|
137 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
138 return bufsize; |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5293
diff
changeset
|
141 static av_cold int |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
142 X264_close(AVCodecContext *avctx) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
143 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
144 X264Context *x4 = avctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
145 |
8024 | 146 av_freep(&avctx->extradata); |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
147 av_free(x4->sei); |
8024 | 148 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
149 if(x4->enc) |
2979 | 150 x264_encoder_close(x4->enc); |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
151 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
152 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
153 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
154 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5293
diff
changeset
|
155 static av_cold int |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
156 X264_init(AVCodecContext *avctx) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
157 { |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
158 X264Context *x4 = avctx->priv_data; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
159 |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
160 x4->sei_size = 0; |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
161 x264_param_default(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
162 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
163 x4->params.pf_log = X264_log; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
164 x4->params.p_log_private = avctx; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
165 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
166 x4->params.i_keyint_max = avctx->gop_size; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
167 x4->params.rc.i_bitrate = avctx->bit_rate / 1000; |
2682 | 168 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000; |
2882 | 169 x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000; |
7000 | 170 x4->params.rc.b_stat_write = avctx->flags & CODEC_FLAG_PASS1; |
2996 | 171 if(avctx->flags & CODEC_FLAG_PASS2) x4->params.rc.b_stat_read = 1; |
172 else{ | |
3493 | 173 if(avctx->crf){ |
174 x4->params.rc.i_rc_method = X264_RC_CRF; | |
4030 | 175 x4->params.rc.f_rf_constant = avctx->crf; |
3493 | 176 }else if(avctx->cqp > -1){ |
177 x4->params.rc.i_rc_method = X264_RC_CQP; | |
178 x4->params.rc.i_qp_constant = avctx->cqp; | |
179 } | |
2996 | 180 } |
181 | |
182 // if neither crf nor cqp modes are selected we have to enable the RC | |
183 // we do it this way because we cannot check if the bitrate has been set | |
3493 | 184 if(!(avctx->crf || (avctx->cqp > -1))) x4->params.rc.i_rc_method = X264_RC_ABR; |
2996 | 185 |
2569 | 186 x4->params.i_bframe = avctx->max_b_frames; |
187 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC; | |
7868 | 188 x4->params.i_bframe_adaptive = avctx->b_frame_strategy; |
2996 | 189 x4->params.i_bframe_bias = avctx->bframebias; |
7000 | 190 x4->params.b_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID; |
191 avctx->has_b_frames= avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames; | |
2996 | 192 |
193 x4->params.i_keyint_min = avctx->keyint_min; | |
194 if(x4->params.i_keyint_min > x4->params.i_keyint_max) | |
195 x4->params.i_keyint_min = x4->params.i_keyint_max; | |
196 | |
197 x4->params.i_scenecut_threshold = avctx->scenechange_threshold; | |
198 | |
7000 | 199 x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER; |
2996 | 200 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha; |
201 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
|
202 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
203 x4->params.rc.i_qp_min = avctx->qmin; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
204 x4->params.rc.i_qp_max = avctx->qmax; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
205 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
|
206 |
2882 | 207 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */ |
208 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */ | |
2996 | 209 x4->params.rc.f_complexity_blur = avctx->complexityblur; |
2882 | 210 |
2996 | 211 x4->params.i_frame_reference = avctx->refs; |
2563 | 212 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
213 x4->params.i_width = avctx->width; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
214 x4->params.i_height = avctx->height; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
215 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
|
216 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den; |
2637 | 217 x4->params.i_fps_num = avctx->time_base.den; |
218 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
|
219 |
2996 | 220 x4->params.analyse.inter = 0; |
221 if(avctx->partitions){ | |
222 if(avctx->partitions & X264_PART_I4X4) | |
223 x4->params.analyse.inter |= X264_ANALYSE_I4x4; | |
224 if(avctx->partitions & X264_PART_I8X8) | |
225 x4->params.analyse.inter |= X264_ANALYSE_I8x8; | |
226 if(avctx->partitions & X264_PART_P8X8) | |
227 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16; | |
228 if(avctx->partitions & X264_PART_P4X4) | |
229 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8; | |
230 if(avctx->partitions & X264_PART_B8X8) | |
231 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16; | |
232 } | |
233 | |
234 x4->params.analyse.i_direct_mv_pred = avctx->directpred; | |
235 | |
7000 | 236 x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED; |
2996 | 237 |
238 if(avctx->me_method == ME_EPZS) | |
239 x4->params.analyse.i_me_method = X264_ME_DIA; | |
240 else if(avctx->me_method == ME_HEX) | |
241 x4->params.analyse.i_me_method = X264_ME_HEX; | |
242 else if(avctx->me_method == ME_UMH) | |
243 x4->params.analyse.i_me_method = X264_ME_UMH; | |
244 else if(avctx->me_method == ME_FULL) | |
245 x4->params.analyse.i_me_method = X264_ME_ESA; | |
7002
92c74bbdf4fb
add esa/dia compat me options and new tesa for libx264
bcoudurier
parents:
7001
diff
changeset
|
246 else if(avctx->me_method == ME_TESA) |
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 | 248 else x4->params.analyse.i_me_method = X264_ME_HEX; |
249 | |
250 x4->params.analyse.i_me_range = avctx->me_range; | |
251 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; | |
252 | |
253 x4->params.analyse.b_mixed_references = | |
7000 | 254 avctx->flags2 & CODEC_FLAG2_MIXED_REFS; |
255 x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA; | |
256 x4->params.analyse.b_transform_8x8 = avctx->flags2 & CODEC_FLAG2_8X8DCT; | |
257 x4->params.analyse.b_fast_pskip = avctx->flags2 & CODEC_FLAG2_FASTPSKIP; | |
2996 | 258 |
259 x4->params.analyse.i_trellis = avctx->trellis; | |
3133 | 260 x4->params.analyse.i_noise_reduction = avctx->noise_reduction; |
2996 | 261 |
262 if(avctx->level > 0) x4->params.i_level_idc = avctx->level; | |
263 | |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
264 x4->params.rc.f_rate_tolerance = |
2996 | 265 (float)avctx->bit_rate_tolerance/avctx->bit_rate; |
266 | |
267 if((avctx->rc_buffer_size != 0) && | |
268 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)){ | |
269 x4->params.rc.f_vbv_buffer_init = | |
270 (float)avctx->rc_initial_buffer_occupancy/avctx->rc_buffer_size; | |
271 } | |
272 else x4->params.rc.f_vbv_buffer_init = 0.9; | |
273 | |
274 x4->params.rc.f_ip_factor = 1/fabs(avctx->i_quant_factor); | |
275 x4->params.rc.f_pb_factor = avctx->b_quant_factor; | |
276 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset; | |
277 | |
7000 | 278 x4->params.analyse.b_psnr = avctx->flags & CODEC_FLAG_PSNR; |
2996 | 279 x4->params.i_log_level = X264_LOG_DEBUG; |
280 | |
7000 | 281 x4->params.b_aud = avctx->flags2 & CODEC_FLAG2_AUD; |
2996 | 282 |
2742 | 283 x4->params.i_threads = avctx->thread_count; |
284 | |
7001 | 285 x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT; |
286 | |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
287 if(avctx->flags & CODEC_FLAG_GLOBAL_HEADER){ |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
288 x4->params.b_repeat_headers = 0; |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
289 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
290 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
291 x4->enc = x264_encoder_open(&x4->params); |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
292 if(!x4->enc) |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
293 return -1; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
294 |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
295 avctx->coded_frame = &x4->out_pic; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
296 |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
297 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
|
298 x264_nal_t *nal; |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
299 int nnal, i, s = 0; |
3054
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
300 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
301 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
|
302 |
3063
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
303 /* 5 bytes NAL header + worst case escaping */ |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
304 for(i = 0; i < nnal; i++) |
f02d0b59279c
Remove all stray tabs and trailing whitespace, this time for good.
diego
parents:
3054
diff
changeset
|
305 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
|
306 |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
307 avctx->extradata = av_malloc(s); |
9899
06ab8ac1a593
Fix libx264.c to not drop SEI userdata from x264 encoder.
darkshikari
parents:
8024
diff
changeset
|
308 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
|
309 } |
d640e46c69ea
place SPS/PPS in extradata if GLOBAL_HEADER flag is set
mru
parents:
3036
diff
changeset
|
310 |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
311 return 0; |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
312 } |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
313 |
5103
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
314 AVCodec libx264_encoder = { |
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
315 .name = "libx264", |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
316 .type = CODEC_TYPE_VIDEO, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
317 .id = CODEC_ID_H264, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
318 .priv_data_size = sizeof(X264Context), |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
319 .init = X264_init, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
320 .encode = X264_frame, |
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
321 .close = X264_close, |
4114 | 322 .capabilities = CODEC_CAP_DELAY, |
6788 | 323 .pix_fmts = (enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE }, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7002
diff
changeset
|
324 .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
|
325 }; |