gstreamer/subprojects/gst-plugins-good/gst/rtpmanager/gstrtpbin.h
Sebastian Dröge 8bfba72ea4 rtpbin: Add new never/ntp RTCP sync modes
Never is useful for some RTSP servers that report plain garbage both via
RTCP SR and RTP-Info, for example.

NTP is useful if synchronization should only ever happen based on RTCP
SR or NTP-64 RTP header extension.

Also slightly change the behaviour of always/initial to take RTP-Info
based synchronization into account too. It's supposed to give the same
values as the RTCP SR and is available earlier, so will generally cause
fewer synchronization glitches if it's made use of.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6543>
2024-05-28 11:52:30 +00:00

195 lines
6.9 KiB
C

/* GStreamer
* Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef __GST_RTP_BIN_H__
#define __GST_RTP_BIN_H__
#include <gst/gst.h>
#include "rtpsession.h"
#include "gstrtpsession.h"
#include "rtpjitterbuffer.h"
#define GST_TYPE_RTP_BIN \
(gst_rtp_bin_get_type())
#define GST_RTP_BIN(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BIN,GstRtpBin))
#define GST_RTP_BIN_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BIN,GstRtpBinClass))
#define GST_IS_RTP_BIN(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BIN))
#define GST_IS_RTP_BIN_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BIN))
/**
* GstRTCPSync:
* @GST_RTP_BIN_RTCP_SYNC_ALWAYS: Always do inter-stream synchronization based
* on RTP-Info or RTCP SR or inband NTP-64 header extension.
* @GST_RTP_BIN_RTCP_SYNC_INITIAL: Only do inter-stream synchronization once based
* on RTP-Info or RTCP SR or inband NTP-64 header extension.
* @GST_RTP_BIN_RTCP_SYNC_RTP_INFO: Only do inter-stream synchronization based
* on RTP-Info.
* @GST_RTP_BIN_RTCP_SYNC_NTP: Only do inter-stream synchronization based on
* RTCP SR or inband NTP-64 header extension. (Since 1.26)
* @GST_RTP_BIN_RTCP_SYNC_NEVER: Never do inter-stream synchronization. (Since 1.26)
*/
typedef enum
{
GST_RTP_BIN_RTCP_SYNC_ALWAYS,
GST_RTP_BIN_RTCP_SYNC_INITIAL,
GST_RTP_BIN_RTCP_SYNC_RTP_INFO,
/**
* GstRTCPSync::ntp:
*
* Only do inter-stream synchronization based on RTCP SR or inband NTP-64
* header extension.
*
* Since: 1.26
*/
GST_RTP_BIN_RTCP_SYNC_NTP,
/**
* GstRTCPSync::never:
*
* Never do inter-stream synchronization.
*
* Since: 1.26
*/
GST_RTP_BIN_RTCP_SYNC_NEVER
} GstRTCPSync;
typedef struct _GstRtpBin GstRtpBin;
typedef struct _GstRtpBinClass GstRtpBinClass;
typedef struct _GstRtpBinPrivate GstRtpBinPrivate;
struct _GstRtpBin {
GstBin bin;
/*< private >*/
/* default latency for sessions */
guint latency_ms;
guint64 latency_ns;
gboolean drop_on_latency;
gboolean do_lost;
gboolean ignore_pt;
gboolean ntp_sync;
gint rtcp_sync;
guint rtcp_sync_interval;
RTPJitterBufferMode buffer_mode;
gboolean buffering;
gboolean use_pipeline_clock;
GstRtpNtpTimeSource ntp_time_source;
gboolean send_sync_event;
GstClockTime buffer_start;
gboolean do_retransmission;
GstRTPProfile rtp_profile;
gboolean rtcp_sync_send_time;
gint max_rtcp_rtp_time_diff;
guint32 max_dropout_time;
guint32 max_misorder_time;
gboolean rfc7273_sync;
gboolean add_reference_timestamp_meta;
guint max_streams;
guint64 max_ts_offset_adjustment;
gint64 max_ts_offset;
gboolean max_ts_offset_is_set;
guint64 min_ts_offset;
gboolean min_ts_offset_is_set;
guint ts_offset_smoothing_factor;
/* a list of session */
GSList *sessions;
/* a list of clients, these are streams with the same CNAME */
GSList *clients;
/* the default SDES items for sessions */
GstStructure *sdes;
/* the default FEC decoder factories for sessions */
GstStructure *fec_decoders;
/* the default FEC encoder factories for sessions */
GstStructure *fec_encoders;
gboolean update_ntp64_header_ext;
gboolean timeout_inactive_sources;
/*< private >*/
GstRtpBinPrivate *priv;
};
struct _GstRtpBinClass {
GstBinClass parent_class;
/* get the caps for pt */
GstCaps* (*request_pt_map) (GstRtpBin *rtpbin, guint session, guint pt);
void (*payload_type_change) (GstRtpBin *rtpbin, guint session, guint pt);
void (*new_jitterbuffer) (GstRtpBin *rtpbin, GstElement *jitterbuffer, guint session, guint32 ssrc);
void (*new_storage) (GstRtpBin *rtpbin, GstElement *jitterbuffer, guint session);
/* action signals */
void (*clear_pt_map) (GstRtpBin *rtpbin);
void (*reset_sync) (GstRtpBin *rtpbin);
GstElement* (*get_session) (GstRtpBin *rtpbin, guint session);
RTPSession* (*get_internal_session) (GstRtpBin *rtpbin, guint session);
GstElement* (*get_storage) (GstRtpBin *rtpbin, guint session);
GObject* (*get_internal_storage) (GstRtpBin *rtpbin, guint session);
void (*clear_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
/* session manager signals */
void (*on_new_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_ssrc_collision) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_ssrc_validated) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_ssrc_active) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_ssrc_sdes) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_bye_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_bye_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_sender_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_npt_stop) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
GstElement* (*request_rtp_encoder) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_rtp_decoder) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_rtcp_encoder) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_rtcp_decoder) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_aux_sender) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_aux_receiver) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_fec_encoder) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_fec_decoder) (GstRtpBin *rtpbin, guint session);
GstElement* (*request_jitterbuffer) (GstRtpBin *rtpbin, guint session);
void (*on_new_sender_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
void (*on_sender_ssrc_active) (GstRtpBin *rtpbin, guint session, guint32 ssrc);
};
GType gst_rtp_bin_get_type (void);
GST_ELEMENT_REGISTER_DECLARE (rtpbin);
#endif /* __GST_RTP_BIN_H__ */