From: Derek Buitenhuis <[email protected]>
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.
---
libavcodec/libx264.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 1a22fa3..2067288 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,21 @@ 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 > 0) ? 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;
+ }
reconfig_encoder(ctx, frame);
}
do {
@@ -696,6 +707,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 = -1 }, -1, 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 },
};
--
2.5.0
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel