diff options
Diffstat (limited to 'libavcodec/libx264.c')
-rw-r--r-- | libavcodec/libx264.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 1a22fa360a..50de007302 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -77,6 +77,7 @@ typedef struct X264Context { char *stats; int nal_hrd; int motion_est; + int forced_idr; char *x264_params; } X264Context; @@ -235,11 +236,22 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, } x4->pic.i_pts = frame->pts; - x4->pic.i_type = - 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; + + switch (frame->pict_type) { + case AV_PICTURE_TYPE_I: + x4->pic.i_type = x4->forced_idr ? X264_TYPE_IDR + : X264_TYPE_KEYFRAME; + break; + case AV_PICTURE_TYPE_P: + x4->pic.i_type = X264_TYPE_P; + break; + case AV_PICTURE_TYPE_B: + x4->pic.i_type = X264_TYPE_B; + break; + default: + x4->pic.i_type = X264_TYPE_AUTO; + break; + } reconfig_encoder(ctx, frame); } do { @@ -696,6 +708,7 @@ static const AVOption options[] = { { "umh", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_UMH }, INT_MIN, INT_MAX, VE, "motion-est" }, { "esa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_ESA }, INT_MIN, INT_MAX, VE, "motion-est" }, { "tesa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_TESA }, INT_MIN, INT_MAX, VE, "motion-est" }, + { "forced-idr", "If forwarding iframes, require them to be IDR frames.", OFFSET(forced_idr), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, { "x264-params", "Override the x264 configuration using a :-separated list of key=value parameters", OFFSET(x264_params), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE }, { NULL }, }; |