summaryrefslogtreecommitdiff
path: root/gst/rtp/gstrtpvp8pay.c
diff options
context:
space:
mode:
authorMikhail Fludkov <misha@pexip.com>2017-03-16 15:23:28 +0100
committerTim-Philipp Müller <tim@centricular.com>2020-10-16 09:25:10 +0000
commit543b7e502469453b30bf97b8be71aed19042dd22 (patch)
treee9ea8c729283abfef704b3fdb5af70d2bd8101d3 /gst/rtp/gstrtpvp8pay.c
parentba4b9971e93e269bd99e1be0f54cd1b3d9471c37 (diff)
rtpvp8pay: move duplicate code to separate functions
Two new functions to modify picture id: gst_rtp_vp8_pay_picture_id_reset - picks random picture id of appropriate bitsize gst_rtp_vp8_pay_picture_id_increment - increments picture id taking care of wrapping Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/728>
Diffstat (limited to 'gst/rtp/gstrtpvp8pay.c')
-rw-r--r--gst/rtp/gstrtpvp8pay.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/gst/rtp/gstrtpvp8pay.c b/gst/rtp/gstrtpvp8pay.c
index d286029b7..7012e3ae5 100644
--- a/gst/rtp/gstrtpvp8pay.c
+++ b/gst/rtp/gstrtpvp8pay.c
@@ -92,14 +92,40 @@ GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("video/x-vp8"));
+static gint
+picture_id_bitsize_from_mode (PictureIDMode mode)
+{
+ if (VP8_PAY_NO_PICTURE_ID == mode)
+ return 0;
+ if (VP8_PAY_PICTURE_ID_7BITS == mode)
+ return 7;
+ return 15;
+}
+
+static void
+gst_rtp_vp8_pay_picture_id_reset (GstRtpVP8Pay * obj)
+{
+ gint picture_id_bitsize = picture_id_bitsize_from_mode (obj->picture_id_mode);
+ if (0 == picture_id_bitsize)
+ return;
+ obj->picture_id = g_random_int_range (0, 1 << picture_id_bitsize);
+}
+
+static void
+gst_rtp_vp8_pay_picture_id_increment (GstRtpVP8Pay * obj)
+{
+ gint picture_id_bitsize = picture_id_bitsize_from_mode (obj->picture_id_mode);
+ if (0 == picture_id_bitsize)
+ return;
+ ++obj->picture_id;
+ obj->picture_id &= (1 << picture_id_bitsize) - 1;
+}
+
static void
gst_rtp_vp8_pay_init (GstRtpVP8Pay * obj)
{
obj->picture_id_mode = DEFAULT_PICTURE_ID_MODE;
- if (obj->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS)
- obj->picture_id = g_random_int_range (0, G_MAXUINT8) & 0x7F;
- else if (obj->picture_id_mode == VP8_PAY_PICTURE_ID_15BITS)
- obj->picture_id = g_random_int_range (0, G_MAXUINT16) & 0x7FFF;
+ gst_rtp_vp8_pay_picture_id_reset (obj);
}
static void
@@ -147,10 +173,7 @@ gst_rtp_vp8_pay_set_property (GObject * object,
switch (prop_id) {
case PROP_PICTURE_ID_MODE:
rtpvp8pay->picture_id_mode = g_value_get_enum (value);
- if (rtpvp8pay->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS)
- rtpvp8pay->picture_id = g_random_int_range (0, G_MAXUINT8) & 0x7F;
- else if (rtpvp8pay->picture_id_mode == VP8_PAY_PICTURE_ID_15BITS)
- rtpvp8pay->picture_id = g_random_int_range (0, G_MAXUINT16) & 0x7FFF;
+ gst_rtp_vp8_pay_picture_id_reset (rtpvp8pay);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -485,12 +508,7 @@ gst_rtp_vp8_pay_handle_buffer (GstRTPBasePayload * payload, GstBuffer * buffer)
ret = gst_rtp_base_payload_push_list (payload, list);
- /* Incremenent and wrap the picture id if it overflows */
- if ((self->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS &&
- ++self->picture_id >= 0x80) ||
- (self->picture_id_mode == VP8_PAY_PICTURE_ID_15BITS &&
- ++self->picture_id >= 0x8000))
- self->picture_id = 0;
+ gst_rtp_vp8_pay_picture_id_increment (self);
gst_buffer_unref (buffer);
@@ -503,10 +521,7 @@ gst_rtp_vp8_pay_sink_event (GstRTPBasePayload * payload, GstEvent * event)
GstRtpVP8Pay *self = GST_RTP_VP8_PAY (payload);
if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_START) {
- if (self->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS)
- self->picture_id = g_random_int_range (0, G_MAXUINT8) & 0x7F;
- else if (self->picture_id_mode == VP8_PAY_PICTURE_ID_15BITS)
- self->picture_id = g_random_int_range (0, G_MAXUINT16) & 0x7FFF;
+ gst_rtp_vp8_pay_picture_id_reset (self);
}
return GST_RTP_BASE_PAYLOAD_CLASS (gst_rtp_vp8_pay_parent_class)->sink_event