gstreamer/gst/rtp/gstrtph264depay.h
Matthew Waters ea61714c70 rtph26*depay: drop FU's without a corresponding start bit
If we have not received a FU with a start bit set, any subsequent FU
data is not useful at all and would result in an invalid stream.

This case is constructed from multiple requirements in
RFC 3984 Section 5.8 and RFC 7798 Section 4.4.3.  Following are excerpts
from RFC 3984 but RFC 7798 contains similar language.

The FU in a single FU case is forbidden:

   A fragmented NAL unit MUST NOT be transmitted in one FU; i.e., the
   Start bit and End bit MUST NOT both be set to one in the same FU
   header.

and dropping is possible:

   If a fragmentation unit is lost, the receiver SHOULD discard all
   following fragmentation units in transmission order corresponding to
   the same fragmented NAL unit.

The jump in seqnum case is supported by this from the specification
instead of implementing the forbidden_zero_bit mangling:

   If a fragmentation unit is lost, the receiver SHOULD discard all
   following fragmentation units in transmission order corresponding to
   the same fragmented NAL unit.

   A receiver in an endpoint or in a MANE MAY aggregate the first n-1
   fragments of a NAL unit to an (incomplete) NAL unit, even if fragment
   n of that NAL unit is not received.  In this case, the
   forbidden_zero_bit of the NAL unit MUST be set to one to indicate a
   syntax violation.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/730>
2020-09-21 08:08:38 +00:00

90 lines
2.5 KiB
C

/* GStreamer
* Copyright (C) <2006> 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_H264_DEPAY_H__
#define __GST_RTP_H264_DEPAY_H__
#include <gst/gst.h>
#include <gst/base/gstadapter.h>
#include <gst/rtp/gstrtpbasedepayload.h>
G_BEGIN_DECLS
#define GST_TYPE_RTP_H264_DEPAY \
(gst_rtp_h264_depay_get_type())
#define GST_RTP_H264_DEPAY(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_DEPAY,GstRtpH264Depay))
#define GST_RTP_H264_DEPAY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_DEPAY,GstRtpH264DepayClass))
#define GST_IS_RTP_H264_DEPAY(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_DEPAY))
#define GST_IS_RTP_H264_DEPAY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_DEPAY))
typedef struct _GstRtpH264Depay GstRtpH264Depay;
typedef struct _GstRtpH264DepayClass GstRtpH264DepayClass;
struct _GstRtpH264Depay
{
GstRTPBaseDepayload depayload;
gboolean byte_stream;
GstBuffer *codec_data;
GstAdapter *adapter;
gboolean wait_start;
/* nal merging */
gboolean merge;
GstAdapter *picture_adapter;
gboolean picture_start;
GstClockTime last_ts;
gboolean last_keyframe;
/* Work around broken payloaders wrt. FU-A & FU-B */
guint8 current_fu_type;
guint16 last_fu_seqnum;
GstClockTime fu_timestamp;
gboolean fu_marker;
/* misc */
GPtrArray *sps;
GPtrArray *pps;
gboolean new_codec_data;
/* downstream allocator */
GstAllocator *allocator;
GstAllocationParams params;
};
struct _GstRtpH264DepayClass
{
GstRTPBaseDepayloadClass parent_class;
};
GType gst_rtp_h264_depay_get_type (void);
gboolean gst_rtp_h264_depay_plugin_init (GstPlugin * plugin);
gboolean gst_rtp_h264_add_sps_pps (GstElement * rtph264, GPtrArray * sps,
GPtrArray * pps, GstBuffer * nal);
G_END_DECLS
#endif /* __GST_RTP_H264_DEPAY_H__ */