mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-27 07:24:51 +00:00
rtpvp8depay: expose request-keyframe property
When set, the depayloader will request new keyframes on packet loss Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/834>
This commit is contained in:
parent
69a43dd00b
commit
20fc6da913
2 changed files with 29 additions and 1 deletions
|
@ -64,11 +64,13 @@ GST_STATIC_PAD_TEMPLATE ("sink",
|
|||
"encoding-name = (string) { \"VP8\", \"VP8-DRAFT-IETF-01\" }"));
|
||||
|
||||
#define DEFAULT_WAIT_FOR_KEYFRAME FALSE
|
||||
#define DEFAULT_REQUEST_KEYFRAME FALSE
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_WAIT_FOR_KEYFRAME
|
||||
PROP_WAIT_FOR_KEYFRAME,
|
||||
PROP_REQUEST_KEYFRAME,
|
||||
};
|
||||
|
||||
#define PICTURE_ID_NONE (UINT_MAX)
|
||||
|
@ -80,6 +82,7 @@ gst_rtp_vp8_depay_init (GstRtpVP8Depay * self)
|
|||
self->adapter = gst_adapter_new ();
|
||||
self->started = FALSE;
|
||||
self->wait_for_keyframe = DEFAULT_WAIT_FOR_KEYFRAME;
|
||||
self->request_keyframe = DEFAULT_REQUEST_KEYFRAME;
|
||||
self->last_pushed_was_lost_event = FALSE;
|
||||
}
|
||||
|
||||
|
@ -111,6 +114,19 @@ gst_rtp_vp8_depay_class_init (GstRtpVP8DepayClass * gst_rtp_vp8_depay_class)
|
|||
DEFAULT_WAIT_FOR_KEYFRAME,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
/**
|
||||
* GstRtpVP8Depay:request-keyframe:
|
||||
*
|
||||
* Request new keyframe when packet loss is detected
|
||||
*
|
||||
* Since: 1.20
|
||||
*/
|
||||
g_object_class_install_property (object_class, PROP_REQUEST_KEYFRAME,
|
||||
g_param_spec_boolean ("request-keyframe", "Request Keyframe",
|
||||
"Request new keyframe when packet loss is detected",
|
||||
DEFAULT_REQUEST_KEYFRAME,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
element_class->change_state = gst_rtp_vp8_depay_change_state;
|
||||
|
||||
depay_class->process_rtp_packet = gst_rtp_vp8_depay_process;
|
||||
|
@ -146,6 +162,9 @@ gst_rtp_vp8_depay_set_property (GObject * object, guint prop_id,
|
|||
case PROP_WAIT_FOR_KEYFRAME:
|
||||
self->wait_for_keyframe = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_REQUEST_KEYFRAME:
|
||||
self->request_keyframe = g_value_get_boolean (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
@ -162,6 +181,9 @@ gst_rtp_vp8_depay_get_property (GObject * object, guint prop_id,
|
|||
case PROP_WAIT_FOR_KEYFRAME:
|
||||
g_value_set_boolean (value, self->wait_for_keyframe);
|
||||
break;
|
||||
case PROP_REQUEST_KEYFRAME:
|
||||
g_value_set_boolean (value, self->request_keyframe);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
@ -276,6 +298,11 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp)
|
|||
|
||||
if (self->wait_for_keyframe)
|
||||
self->waiting_for_keyframe = TRUE;
|
||||
|
||||
if (self->request_keyframe)
|
||||
gst_pad_push_event (GST_RTP_BASE_DEPAYLOAD_SINKPAD (depay),
|
||||
gst_video_event_new_upstream_force_key_unit (GST_CLOCK_TIME_NONE,
|
||||
TRUE, 0));
|
||||
}
|
||||
|
||||
/* At least one header and one vp8 byte */
|
||||
|
|
|
@ -70,6 +70,7 @@ struct _GstRtpVP8Depay
|
|||
guint last_picture_id;
|
||||
|
||||
gboolean wait_for_keyframe;
|
||||
gboolean request_keyframe;
|
||||
gboolean last_pushed_was_lost_event;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue