33 #define END_OF_STREAM 0x001
35 #define XAVS_PART_I8X8 0x002
36 #define XAVS_PART_P8X8 0x010
37 #define XAVS_PART_B8X8 0x100
60 static const int level_map[] = {
67 if (level < 0 || level > XAVS_LOG_DEBUG)
70 av_vlog(p, level_map[level], fmt, args);
74 int size, xavs_nal_t *nals,
75 int nnal,
int skip_sei)
88 for (i = 0; i < nnal; i++) {
90 if (skip_sei && nals[i].i_type ==
NAL_SEI) {
92 if (xavs_nal_encode(x4->
sei, &x4->
sei_size, 1, nals + i) < 0)
97 s = xavs_nal_encode(p, &size, 1, nals + i);
107 int bufsize,
void *
data)
113 xavs_picture_t pic_out;
115 x4->
pic.img.i_csp = XAVS_CSP_I420;
116 x4->
pic.img.i_plane = 3;
119 for (i = 0; i < 3; i++) {
120 x4->
pic.img.plane[i] = frame->
data[i];
124 x4->
pic.i_pts = frame->
pts;
125 x4->
pic.i_type = XAVS_TYPE_AUTO;
128 if (xavs_encoder_encode(x4->
enc, &nal, &nnal,
129 frame? &x4->
pic:
NULL, &pic_out) < 0)
132 bufsize =
encode_nals(ctx, buf, bufsize, nal, nnal, 0);
139 buf[bufsize+1] = 0x0;
140 buf[bufsize+2] = 0x01;
141 buf[bufsize+3] = 0xb1;
150 switch (pic_out.i_type) {
181 xavs_encoder_close(x4->
enc);
191 xavs_param_default(&x4->
params);
194 x4->
params.p_log_private = avctx;
198 x4->
params.rc.i_rc_method = XAVS_RC_ABR;
204 x4->
params.rc.b_stat_read = 1;
206 #if FF_API_X264_GLOBAL_OPTS
208 x4->
params.rc.i_rc_method = XAVS_RC_CRF;
209 x4->
params.rc.f_rf_constant = avctx->crf;
210 }
else if (avctx->cqp > -1) {
211 x4->
params.rc.i_rc_method = XAVS_RC_CQP;
212 x4->
params.rc.i_qp_constant = avctx->cqp;
217 x4->
params.rc.i_rc_method = XAVS_RC_CRF;
219 }
else if (x4->
cqp >= 0) {
220 x4->
params.rc.i_rc_method = XAVS_RC_CQP;
225 #if FF_API_X264_GLOBAL_OPTS
226 if (avctx->bframebias)
227 x4->
params.i_bframe_bias = avctx->bframebias;
228 if (avctx->deblockalpha)
229 x4->
params.i_deblocking_filter_alphac0 = avctx->deblockalpha;
230 if (avctx->deblockbeta)
231 x4->
params.i_deblocking_filter_beta = avctx->deblockbeta;
232 if (avctx->complexityblur >= 0)
233 x4->
params.rc.f_complexity_blur = avctx->complexityblur;
234 if (avctx->directpred >= 0)
235 x4->
params.analyse.i_direct_mv_pred = avctx->directpred;
236 if (avctx->partitions) {
238 x4->
params.analyse.inter |= XAVS_ANALYSE_I8x8;
240 x4->
params.analyse.inter |= XAVS_ANALYSE_PSUB16x16;
242 x4->
params.analyse.inter |= XAVS_ANALYSE_BSUB16x16;
244 x4->
params.rc.b_mb_tree = !!(avctx->
flags2 & CODEC_FLAG2_MBTREE);
246 x4->
params.analyse.b_mixed_references = avctx->
flags2 & CODEC_FLAG2_MIXED_REFS;
247 x4->
params.analyse.b_fast_pskip = avctx->
flags2 & CODEC_FLAG2_FASTPSKIP;
248 x4->
params.analyse.b_weighted_bipred = avctx->
flags2 & CODEC_FLAG2_WPRED;
261 if (x4->
b_bias != INT_MIN)
300 x4->
params.analyse.inter = XAVS_ANALYSE_I8x8 |XAVS_ANALYSE_PSUB16x16| XAVS_ANALYSE_BSUB16x16;
304 x4->
params.analyse.i_me_method = XAVS_ME_DIA;
307 x4->
params.analyse.i_me_method = XAVS_ME_HEX;
310 x4->
params.analyse.i_me_method = XAVS_ME_UMH;
313 x4->
params.analyse.i_me_method = XAVS_ME_ESA;
316 x4->
params.analyse.i_me_method = XAVS_ME_TESA;
319 x4->
params.analyse.i_me_method = XAVS_ME_HEX;
327 x4->
params.analyse.b_transform_8x8 = 1;
332 if (avctx->
level > 0)
335 x4->
params.rc.f_rate_tolerance =
340 x4->
params.rc.f_vbv_buffer_init =
343 x4->
params.rc.f_vbv_buffer_init = 0.9;
352 x4->
params.i_log_level = XAVS_LOG_DEBUG;
357 x4->
params.b_repeat_headers = 0;
359 x4->
enc = xavs_encoder_open(&x4->
params);
370 s = xavs_encoder_headers(x4->
enc, &nal, &nnal);
378 #define OFFSET(x) offsetof(XavsContext, x)
379 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
382 {
"qp",
"Constant quantization parameter rate control method",
OFFSET(cqp),
AV_OPT_TYPE_INT, {-1 }, -1, INT_MAX,
VE },
383 {
"b-bias",
"Influences how often B-frames are used",
OFFSET(b_bias),
AV_OPT_TYPE_INT, {INT_MIN}, INT_MIN, INT_MAX,
VE },
384 {
"cplxblur",
"Reduce fluctuations in QP (before curve compression)",
OFFSET(cplxblur),
AV_OPT_TYPE_FLOAT, {-1 }, -1, FLT_MAX,
VE},
385 {
"direct-pred",
"Direct MV prediction mode",
OFFSET(direct_pred),
AV_OPT_TYPE_INT, {-1 }, -1, INT_MAX,
VE,
"direct-pred" },
392 {
"mixed-refs",
"One reference per partition, as opposed to one reference per macroblock",
OFFSET(mixed_refs),
AV_OPT_TYPE_INT, {-1}, -1, 1,
VE },
420 .priv_class = &
class,