mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-09 13:48:55 +00:00
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>
90 lines
2.5 KiB
C
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__ */
|