Mercurial > libavcodec.hg
annotate libx264.c @ 12092:de9e45d04063 libavcodec
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
to verify the sync word the extension fsize field should be compared to
the core data length field.
Patch by nick.nbrereton@net
author | banan |
---|---|
date | Mon, 05 Jul 2010 08:16:43 +0000 |
parents | 22c2450cd00b |
children |
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 { |
10319 | 30 x264_param_t params; |
31 x264_t *enc; | |
32 x264_picture_t pic; | |
33 uint8_t *sei; | |
34 int sei_size; | |
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 | 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 | 41 [X264_LOG_ERROR] = AV_LOG_ERROR, |
5293 | 42 [X264_LOG_WARNING] = AV_LOG_WARNING, |
2979 | 43 [X264_LOG_INFO] = AV_LOG_INFO, |
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 | 47 if (level < 0 || level > X264_LOG_DEBUG) |
2979 | 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 | 54 static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size, |
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 | 58 uint8_t *p = buf; |
10233 | 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 | 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 | 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 | 70 if (skip_sei && nals[i].i_type == NAL_SEI) { |
10233 | 71 x4->sei_size = nals[i].i_payload; |
10319 | 72 x4->sei = av_malloc(x4->sei_size); |
10233 | 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 | 76 memcpy(p, nals[i].p_payload, nals[i].i_payload); |
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 | 83 static int X264_frame(AVCodecContext *ctx, uint8_t *buf, |
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 | 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 | 96 if (frame) { |
97 for (i = 0; i < 3; i++) { | |
98 x4->pic.img.plane[i] = frame->data[i]; | |
4115 | 99 x4->pic.img.i_stride[i] = frame->linesize[i]; |
100 } | |
2556
e5af3bc1d038
H.264 encoding with x264 by (Mns Rullgrd <mru inprovide com>)
michael
parents:
diff
changeset
|
101 |
10319 | 102 x4->pic.i_pts = frame->pts; |
4115 | 103 x4->pic.i_type = X264_TYPE_AUTO; |
4114 | 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 | 107 if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0) |
2979 | 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 | 111 if (bufsize < 0) |
2979 | 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 | 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 | 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 | 132 x4->out_pic.key_frame = pic_out.b_keyframe; |
10319 | 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 | 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 | 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 | 144 |
10319 | 145 if (x4->enc) |
2979 | 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 | 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 | 158 x4->params.pf_log = X264_log; |
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 | 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 | 163 x4->params.rc.i_bitrate = avctx->bit_rate / 1000; |
2682 | 164 x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000; |
10319 | 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 | 167 if (avctx->flags & CODEC_FLAG_PASS2) { |
168 x4->params.rc.b_stat_read = 1; | |
169 } else { | |
170 if (avctx->crf) { | |
171 x4->params.rc.i_rc_method = X264_RC_CRF; | |
4030 | 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 | 174 } else if (avctx->cqp > -1) { |
175 x4->params.rc.i_rc_method = X264_RC_CQP; | |
3493 | 176 x4->params.rc.i_qp_constant = avctx->cqp; |
177 } | |
2996 | 178 } |
179 | |
180 // if neither crf nor cqp modes are selected we have to enable the RC | |
181 // we do it this way because we cannot check if the bitrate has been set | |
10319 | 182 if (!(avctx->crf || (avctx->cqp > -1))) |
183 x4->params.rc.i_rc_method = X264_RC_ABR; | |
2996 | 184 |
10319 | 185 x4->params.i_bframe = avctx->max_b_frames; |
186 x4->params.b_cabac = avctx->coder_type == FF_CODER_TYPE_AC; | |
7868 | 187 x4->params.i_bframe_adaptive = avctx->b_frame_strategy; |
10319 | 188 x4->params.i_bframe_bias = avctx->bframebias; |
10435 | 189 x4->params.i_bframe_pyramid = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? X264_B_PYRAMID_NORMAL : X264_B_PYRAMID_NONE; |
10319 | 190 avctx->has_b_frames = avctx->flags2 & CODEC_FLAG2_BPYRAMID ? 2 : !!avctx->max_b_frames; |
2996 | 191 |
192 x4->params.i_keyint_min = avctx->keyint_min; | |
10319 | 193 if (x4->params.i_keyint_min > x4->params.i_keyint_max) |
2996 | 194 x4->params.i_keyint_min = x4->params.i_keyint_max; |
195 | |
10319 | 196 x4->params.i_scenecut_threshold = avctx->scenechange_threshold; |
2996 | 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 | 199 x4->params.i_deblocking_filter_alphac0 = avctx->deblockalpha; |
10319 | 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 | 202 x4->params.rc.i_qp_min = avctx->qmin; |
203 x4->params.rc.i_qp_max = avctx->qmax; | |
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 | 206 x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */ |
207 x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */ | |
2996 | 208 x4->params.rc.f_complexity_blur = avctx->complexityblur; |
2882 | 209 |
10319 | 210 x4->params.i_frame_reference = avctx->refs; |
2563 | 211 |
10319 | 212 x4->params.i_width = avctx->width; |
213 x4->params.i_height = avctx->height; | |
214 x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num; | |
215 x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den; | |
10936 | 216 x4->params.i_fps_num = x4->params.i_timebase_den = avctx->time_base.den; |
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 | 219 x4->params.analyse.inter = 0; |
220 if (avctx->partitions) { | |
221 if (avctx->partitions & X264_PART_I4X4) | |
2996 | 222 x4->params.analyse.inter |= X264_ANALYSE_I4x4; |
10319 | 223 if (avctx->partitions & X264_PART_I8X8) |
2996 | 224 x4->params.analyse.inter |= X264_ANALYSE_I8x8; |
10319 | 225 if (avctx->partitions & X264_PART_P8X8) |
2996 | 226 x4->params.analyse.inter |= X264_ANALYSE_PSUB16x16; |
10319 | 227 if (avctx->partitions & X264_PART_P4X4) |
2996 | 228 x4->params.analyse.inter |= X264_ANALYSE_PSUB8x8; |
10319 | 229 if (avctx->partitions & X264_PART_B8X8) |
2996 | 230 x4->params.analyse.inter |= X264_ANALYSE_BSUB16x16; |
231 } | |
232 | |
10319 | 233 x4->params.analyse.i_direct_mv_pred = avctx->directpred; |
2996 | 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 | 236 x4->params.analyse.i_weighted_pred = avctx->weighted_p_pred; |
2996 | 237 |
10319 | 238 if (avctx->me_method == ME_EPZS) |
2996 | 239 x4->params.analyse.i_me_method = X264_ME_DIA; |
10319 | 240 else if (avctx->me_method == ME_HEX) |
2996 | 241 x4->params.analyse.i_me_method = X264_ME_HEX; |
10319 | 242 else if (avctx->me_method == ME_UMH) |
2996 | 243 x4->params.analyse.i_me_method = X264_ME_UMH; |
10319 | 244 else if (avctx->me_method == ME_FULL) |
2996 | 245 x4->params.analyse.i_me_method = X264_ME_ESA; |
10319 | 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 | 248 else x4->params.analyse.i_me_method = X264_ME_HEX; |
249 | |
11642 | 250 x4->params.rc.i_aq_mode = avctx->aq_mode; |
251 x4->params.rc.f_aq_strength = avctx->aq_strength; | |
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 | 254 x4->params.analyse.b_psy = avctx->flags2 & CODEC_FLAG2_PSY; |
255 x4->params.analyse.f_psy_rd = avctx->psy_rd; | |
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 | 258 x4->params.analyse.i_me_range = avctx->me_range; |
259 x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; | |
2996 | 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 | 265 |
10319 | 266 x4->params.analyse.i_trellis = avctx->trellis; |
267 x4->params.analyse.i_noise_reduction = avctx->noise_reduction; | |
2996 | 268 |
10319 | 269 if (avctx->level > 0) |
270 x4->params.i_level_idc = avctx->level; | |
2996 | 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 | 273 (float)avctx->bit_rate_tolerance/avctx->bit_rate; |
274 | |
10319 | 275 if ((avctx->rc_buffer_size != 0) && |
276 (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)) { | |
2996 | 277 x4->params.rc.f_vbv_buffer_init = |
10319 | 278 (float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size; |
279 } else | |
280 x4->params.rc.f_vbv_buffer_init = 0.9; | |
2996 | 281 |
10658 | 282 x4->params.rc.b_mb_tree = !!(avctx->flags2 & CODEC_FLAG2_MBTREE); |
10319 | 283 x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor); |
284 x4->params.rc.f_pb_factor = avctx->b_quant_factor; | |
2996 | 285 x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset; |
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 | 289 x4->params.i_log_level = X264_LOG_DEBUG; |
2996 | 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 | 292 |
10319 | 293 x4->params.i_threads = avctx->thread_count; |
7001 | 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 | 296 |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 328 .init = X264_init, |
329 .encode = X264_frame, | |
330 .close = X264_close, | |
331 .capabilities = CODEC_CAP_DELAY, | |
332 .pix_fmts = (const enum PixelFormat[]) { PIX_FMT_YUV420P, PIX_FMT_NONE }, | |
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 }; |