On Thu, Oct 1, 2015 at 2:41 PM, Luca Barbato <[email protected]> wrote: > 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. > --- > > Updated according Vittorio's feedback. > > libavcodec/libx264.c | 23 ++++++++++++++++++----- > 1 file changed, 18 insertions(+), 5 deletions(-) > > diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c > index 1a22fa3..50de007 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 }, > }; > --
lgtm -- Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
