uint8_t *sei;
int sei_size;
AVFrame out_pic;
- const char *preset;
- const char *tune;
- const char *profile;
- const char *level;
+ char *preset;
+ char *tune;
+ char *profile;
+ char *level;
int fastfirstpass;
- const char *stats;
+ char *stats;
+ char *weightp;
+ char *x264opts;
} X264Context;
static void X264_log(void *p, int level, const char *fmt, va_list args)
x4->pic.i_pts = frame->pts;
x4->pic.i_type =
- frame->pict_type == FF_I_TYPE ? X264_TYPE_KEYFRAME :
- frame->pict_type == FF_P_TYPE ? X264_TYPE_P :
- frame->pict_type == FF_B_TYPE ? X264_TYPE_B :
+ frame->pict_type == AV_PICTURE_TYPE_I ? X264_TYPE_KEYFRAME :
+ frame->pict_type == AV_PICTURE_TYPE_P ? X264_TYPE_P :
+ frame->pict_type == AV_PICTURE_TYPE_B ? X264_TYPE_B :
X264_TYPE_AUTO;
if (x4->params.b_tff != frame->top_field_first) {
x4->params.b_tff = frame->top_field_first;
x264_encoder_reconfig(x4->enc, &x4->params);
}
+ if (x4->params.vui.i_sar_height != ctx->sample_aspect_ratio.den
+ || x4->params.vui.i_sar_width != ctx->sample_aspect_ratio.num) {
+ x4->params.vui.i_sar_height = ctx->sample_aspect_ratio.den;
+ x4->params.vui.i_sar_width = ctx->sample_aspect_ratio.num;
+ x264_encoder_reconfig(x4->enc, &x4->params);
+ }
}
do {
switch (pic_out.i_type) {
case X264_TYPE_IDR:
case X264_TYPE_I:
- x4->out_pic.pict_type = FF_I_TYPE;
+ x4->out_pic.pict_type = AV_PICTURE_TYPE_I;
break;
case X264_TYPE_P:
- x4->out_pic.pict_type = FF_P_TYPE;
+ x4->out_pic.pict_type = AV_PICTURE_TYPE_P;
break;
case X264_TYPE_B:
case X264_TYPE_BREF:
- x4->out_pic.pict_type = FF_B_TYPE;
+ x4->out_pic.pict_type = AV_PICTURE_TYPE_B;
break;
}
if (x4->enc)
x264_encoder_close(x4->enc);
+ av_free(x4->preset);
+ av_free(x4->tune);
+ av_free(x4->profile);
+ av_free(x4->level);
+ av_free(x4->stats);
+ av_free(x4->weightp);
+
return 0;
}
score += x4->params.analyse.inter == 0 && x4->params.analyse.i_subpel_refine == 8;
if (score >= 5) {
av_log(avctx, AV_LOG_ERROR, "Default settings detected, using medium profile\n");
- x4->preset = "medium";
+ x4->preset = av_strdup("medium");
if (avctx->bit_rate == 200*100)
avctx->crf = 23;
}
x4->params.analyse.i_direct_mv_pred = avctx->directpred;
x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED;
- x4->params.analyse.i_weighted_pred = avctx->weighted_p_pred;
if (avctx->me_method == ME_EPZS)
x4->params.analyse.i_me_method = X264_ME_DIA;
x4->params.p_log_private = avctx;
x4->params.i_log_level = X264_LOG_DEBUG;
+ OPT_STR("weightp", x4->weightp);
+
x4->params.b_intra_refresh = avctx->flags2 & CODEC_FLAG2_INTRA_REFRESH;
x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000;
OPT_STR("level", x4->level);
+ if(x4->x264opts){
+ const char *p= x4->x264opts;
+ while(p){
+ char param[256]={0}, val[256]={0};
+ sscanf(p, "%255[^:=]=%255[^:]", param, val);
+ OPT_STR(param, val);
+ p= strchr(p, ':');
+ p+=!!p;
+ }
+ }
+
if (x4->fastfirstpass)
x264_param_apply_fastfirstpass(&x4->params);
x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT;
+ x4->params.b_open_gop = !(avctx->flags & CODEC_FLAG_CLOSED_GOP);
+
x4->params.i_slice_count = avctx->slices;
x4->params.vui.b_fullrange = avctx->pix_fmt == PIX_FMT_YUVJ420P;
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
- {"preset", "Set the encoding preset", OFFSET(preset), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
- {"tune", "Tune the encoding params", OFFSET(tune), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
- {"fastfirstpass", "Use fast settings when encoding first pass", OFFSET(fastfirstpass), FF_OPT_TYPE_INT, 1, 0, 1, VE},
- {"profile", "Set profile restrictions", OFFSET(profile), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
- {"level", "Specify level (as defined by Annex A)", OFFSET(level), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
- {"passlogfile", "Filename for 2 pass stats", OFFSET(stats), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
+ {"preset", "Set the encoding preset", OFFSET(preset), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
+ {"tune", "Tune the encoding params", OFFSET(tune), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
+ {"fastfirstpass", "Use fast settings when encoding first pass", OFFSET(fastfirstpass), FF_OPT_TYPE_INT, {.dbl=1}, 0, 1, VE},
+ {"profile", "Set profile restrictions", OFFSET(profile), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
+ {"level", "Specify level (as defined by Annex A)", OFFSET(level), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
+ {"passlogfile", "Filename for 2 pass stats", OFFSET(stats), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
+ {"wpredp", "Weighted prediction for P-frames", OFFSET(weightp), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
+ {"x264opts", "x264 options", OFFSET(x264opts), FF_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},
{ NULL },
};