From 465d5868d96ec7c839bfdb4a3e17f33a8bae1206 Mon Sep 17 00:00:00 2001 From: Hyunjun Ko Date: Fri, 9 Jun 2017 14:47:16 +0900 Subject: [PATCH] libs: encoder: h264: set the frame as IDR if forced key unit GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME() is a flag usually used to manage the `frame-lost` event in the case of streaming, such as RTP. In case of this event, it is needed to start new GOP rather than just produce an I-frame. https://bugzilla.gnome.org/show_bug.cgi?id=776712 --- gst-libs/gst/vaapi/gstvaapiencoder_h264.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c index c5e33fd1a9..3ae4430ac7 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c @@ -2790,12 +2790,14 @@ gst_vaapi_encoder_h264_reordering (GstVaapiEncoder * base_encoder, g_queue_foreach (&reorder_pool->reorder_frame_list, (GFunc) set_b_frame, encoder); ++reorder_pool->cur_frame_num; - set_key_frame (picture, encoder, is_idr); + set_key_frame (picture, encoder, + is_idr | GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)); g_queue_push_tail (&reorder_pool->reorder_frame_list, picture); picture = p_pic; reorder_pool->reorder_state = GST_VAAPI_ENC_H264_REORD_DUMP_FRAMES; } else { /* no b frames in queue */ - set_key_frame (picture, encoder, is_idr); + set_key_frame (picture, encoder, + is_idr | GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)); g_assert (g_queue_is_empty (&reorder_pool->reorder_frame_list)); if (encoder->num_bframes) reorder_pool->reorder_state = GST_VAAPI_ENC_H264_REORD_WAIT_FRAMES;