gstreamer/gst/rtp/gstrtpvp9depay.h
Mikhail Fludkov 346b077ae0 rtpvp*depay: possibly forward might-have-been-fec PacketLost events
This is ad adaptation of a Pexip patch for dealing with spurious
GstRTPPacketLost events caused by lost ulpfec packets: as FEC packets
under that scheme are spliced in the same sequence domain as the media
packets, it is not generally possible to determine whether a lost packet
was a FEC packet or a media packet.

When upstreaming pexip's ulpfec patches, we decided to drop all lost
events at the base depayloader level, and where the original patch
from pexip was making use of picture ids and marker bits to determine
whether a packet should be forwarded, this patch makes use of those
to determine whether they should be dropped instead (by removing their
might-have-been-fec field).

Spurious lost events coming out of the depayloader can cause the
decoder to stop decoding until the next keyframe and / or request a new
keyframe, and while this is not desirable it makes sense to forward
that information when we have other means to determine whether a lost
packet was indeed a FEC packet, as is the case with VP8 / VP9 payloads
when they carry a picture id.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/769>
2020-10-29 19:56:07 +01:00

80 lines
2.6 KiB
C

/*
* gstrtpvp9depay.h - Header for GstRtpVP9Depay
* Copyright (C) 2011 Sjoerd Simons <sjoerd@luon.net>
* Copyright (C) 2015 Stian Selnes <stian@pexip.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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_VP9_DEPAY_H__
#define __GST_RTP_VP9_DEPAY_H__
#include <gst/base/gstadapter.h>
#include <gst/rtp/gstrtpbasedepayload.h>
G_BEGIN_DECLS
#define GST_TYPE_RTP_VP9_DEPAY \
(gst_rtp_vp9_depay_get_type())
#define GST_RTP_VP9_DEPAY(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_RTP_VP9_DEPAY, GstRtpVP9Depay))
#define GST_RTP_VP9_DEPAY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_RTP_VP9_DEPAY, \
GstRtpVP9DepayClass))
#define GST_IS_RTP_VP9_DEPAY(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_RTP_VP9_DEPAY))
#define GST_IS_RTP_VP9_DEPAY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_RTP_VP9_DEPAY))
#define GST_RTP_VP9_DEPAY_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_RTP_VP9_DEPAY, \
GstRtpVP9DepayClass))
typedef struct _GstRtpVP9Depay GstRtpVP9Depay;
typedef struct _GstRtpVP9DepayClass GstRtpVP9DepayClass;
struct _GstRtpVP9DepayClass
{
GstRTPBaseDepayloadClass parent_class;
};
struct _GstRtpVP9Depay
{
GstRTPBaseDepayload parent;
GstAdapter *adapter;
gboolean started;
gint ss_width;
gint ss_height;
gint last_width;
gint last_height;
guint last_picture_id;
GstEvent *last_lost_event;
gboolean caps_sent;
/* In between pictures, we might store GstRTPPacketLost events instead
* of forwarding them immediately, we check upon reception of a new
* picture id whether a gap was introduced, in which case we do forward
* the event. This is to avoid forwarding spurious lost events for FEC
* packets.
*/
gboolean stop_lost_events;
};
GType gst_rtp_vp9_depay_get_type (void);
gboolean gst_rtp_vp9_depay_plugin_init (GstPlugin * plugin);
G_END_DECLS
#endif /* #ifndef __GST_RTP_VP9_DEPAY_H__ */