aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/libx264.c
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2015-08-31 15:34:54 +0200
committerLuca Barbato <lu_zero@gentoo.org>2015-10-01 14:27:45 +0200
commit380146924ecad2e05e9dcc5c3c2e1b5ba47c51e8 (patch)
tree8a2215aff1d22991e3b3bc4ad9b9f8c7e95534c3 /libavcodec/libx264.c
parenteb02387add350f2b34a3e61539fe25ec6213eb18 (diff)
downloadffmpeg-380146924ecad2e05e9dcc5c3c2e1b5ba47c51e8.tar.gz
x264: Add option to force IDR frames
When forwarding the frame type information, by default x264 can decide which kind of keyframe output, add an option to force it to output IDR frames in to support use-cases such as preparing the content for segmented streams formats.
Diffstat (limited to 'libavcodec/libx264.c')
-rw-r--r--libavcodec/libx264.c23
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 },
};