gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
/* GStreamer
|
2008-11-25 18:03:02 +00:00
|
|
|
* Copyright (C) <2006> Wim Taymans <wim.taymans@gmail.com>
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
*
|
|
|
|
* 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
|
2012-11-04 00:07:18 +00:00
|
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2009-10-07 11:03:20 +00:00
|
|
|
#include <stdio.h>
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
#include <string.h>
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
#include <gst/base/gstbitreader.h>
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
#include <gst/rtp/gstrtpbuffer.h>
|
2015-08-04 09:25:46 +00:00
|
|
|
#include <gst/pbutils/pbutils.h>
|
2015-08-04 17:59:17 +00:00
|
|
|
#include <gst/video/video.h>
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
#include "gstrtph264depay.h"
|
2015-08-04 17:59:17 +00:00
|
|
|
#include "gstrtputils.h"
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
GST_DEBUG_CATEGORY_STATIC (rtph264depay_debug);
|
|
|
|
#define GST_CAT_DEFAULT (rtph264depay_debug)
|
|
|
|
|
2012-07-06 13:42:19 +00:00
|
|
|
/* This is what we'll default to when downstream hasn't
|
|
|
|
* expressed a restriction or preference via caps */
|
|
|
|
#define DEFAULT_BYTE_STREAM TRUE
|
|
|
|
#define DEFAULT_ACCESS_UNIT FALSE
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
|
2007-04-12 14:20:56 +00:00
|
|
|
/* 3 zero bytes syncword */
|
|
|
|
static const guint8 sync_bytes[] = { 0, 0, 0, 1 };
|
2007-02-16 12:30:22 +00:00
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
static GstStaticPadTemplate gst_rtp_h264_depay_src_template =
|
2012-02-08 20:58:04 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("src",
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
GST_PAD_SRC,
|
|
|
|
GST_PAD_ALWAYS,
|
2012-02-08 20:58:04 +00:00
|
|
|
GST_STATIC_CAPS ("video/x-h264, "
|
|
|
|
"stream-format = (string) avc, alignment = (string) au; "
|
|
|
|
"video/x-h264, "
|
|
|
|
"stream-format = (string) byte-stream, alignment = (string) { nal, au }")
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
static GstStaticPadTemplate gst_rtp_h264_depay_sink_template =
|
|
|
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS ("application/x-rtp, "
|
|
|
|
"media = (string) \"video\", "
|
2013-05-31 13:11:12 +00:00
|
|
|
"clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"")
|
2018-10-22 09:39:24 +00:00
|
|
|
/* optional parameters */
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
/* "profile-level-id = (string) ANY, " */
|
|
|
|
/* "max-mbps = (string) ANY, " */
|
|
|
|
/* "max-fs = (string) ANY, " */
|
|
|
|
/* "max-cpb = (string) ANY, " */
|
|
|
|
/* "max-dpb = (string) ANY, " */
|
|
|
|
/* "max-br = (string) ANY, " */
|
|
|
|
/* "redundant-pic-cap = (string) { \"0\", \"1\" }, " */
|
|
|
|
/* "sprop-parameter-sets = (string) ANY, " */
|
|
|
|
/* "parameter-add = (string) { \"0\", \"1\" }, " */
|
|
|
|
/* "packetization-mode = (string) { \"0\", \"1\", \"2\" }, " */
|
|
|
|
/* "sprop-interleaving-depth = (string) ANY, " */
|
|
|
|
/* "sprop-deint-buf-req = (string) ANY, " */
|
|
|
|
/* "deint-buf-cap = (string) ANY, " */
|
|
|
|
/* "sprop-init-buf-time = (string) ANY, " */
|
|
|
|
/* "sprop-max-don-diff = (string) ANY, " */
|
2013-05-31 13:11:12 +00:00
|
|
|
/* "max-rcmd-nalu-size = (string) ANY " */
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
);
|
|
|
|
|
2011-06-13 14:33:46 +00:00
|
|
|
#define gst_rtp_h264_depay_parent_class parent_class
|
|
|
|
G_DEFINE_TYPE (GstRtpH264Depay, gst_rtp_h264_depay,
|
2011-11-11 11:25:01 +00:00
|
|
|
GST_TYPE_RTP_BASE_DEPAYLOAD);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
static void gst_rtp_h264_depay_finalize (GObject * object);
|
|
|
|
|
|
|
|
static GstStateChangeReturn gst_rtp_h264_depay_change_state (GstElement *
|
|
|
|
element, GstStateChange transition);
|
|
|
|
|
2011-11-11 11:25:01 +00:00
|
|
|
static GstBuffer *gst_rtp_h264_depay_process (GstRTPBaseDepayload * depayload,
|
2015-07-12 13:27:15 +00:00
|
|
|
GstRTPBuffer * rtp);
|
2011-11-11 11:25:01 +00:00
|
|
|
static gboolean gst_rtp_h264_depay_setcaps (GstRTPBaseDepayload * filter,
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
GstCaps * caps);
|
2011-11-11 11:25:01 +00:00
|
|
|
static gboolean gst_rtp_h264_depay_handle_event (GstRTPBaseDepayload * depay,
|
2011-07-18 12:24:48 +00:00
|
|
|
GstEvent * event);
|
2018-12-17 21:48:53 +00:00
|
|
|
static GstBuffer *gst_rtp_h264_complete_au (GstRtpH264Depay * rtph264depay,
|
|
|
|
GstClockTime * out_timestamp, gboolean * out_keyframe);
|
|
|
|
static void gst_rtp_h264_depay_push (GstRtpH264Depay * rtph264depay,
|
|
|
|
GstBuffer * outbuf, gboolean keyframe, GstClockTime timestamp,
|
|
|
|
gboolean marker);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass)
|
|
|
|
{
|
|
|
|
GObjectClass *gobject_class;
|
|
|
|
GstElementClass *gstelement_class;
|
2011-11-11 11:25:01 +00:00
|
|
|
GstRTPBaseDepayloadClass *gstrtpbasedepayload_class;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gstelement_class = (GstElementClass *) klass;
|
2011-11-11 11:25:01 +00:00
|
|
|
gstrtpbasedepayload_class = (GstRTPBaseDepayloadClass *) klass;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
gobject_class->finalize = gst_rtp_h264_depay_finalize;
|
|
|
|
|
2016-03-04 01:30:12 +00:00
|
|
|
gst_element_class_add_static_pad_template (gstelement_class,
|
|
|
|
&gst_rtp_h264_depay_src_template);
|
|
|
|
gst_element_class_add_static_pad_template (gstelement_class,
|
|
|
|
&gst_rtp_h264_depay_sink_template);
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2012-04-09 23:51:41 +00:00
|
|
|
gst_element_class_set_static_metadata (gstelement_class,
|
2011-06-13 14:33:46 +00:00
|
|
|
"RTP H264 depayloader", "Codec/Depayloader/Network/RTP",
|
|
|
|
"Extracts H264 video from RTP packets (RFC 3984)",
|
|
|
|
"Wim Taymans <wim.taymans@gmail.com>");
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
gstelement_class->change_state = gst_rtp_h264_depay_change_state;
|
2007-02-16 12:30:22 +00:00
|
|
|
|
2015-07-12 13:27:15 +00:00
|
|
|
gstrtpbasedepayload_class->process_rtp_packet = gst_rtp_h264_depay_process;
|
2011-11-11 11:25:01 +00:00
|
|
|
gstrtpbasedepayload_class->set_caps = gst_rtp_h264_depay_setcaps;
|
|
|
|
gstrtpbasedepayload_class->handle_event = gst_rtp_h264_depay_handle_event;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-06-13 14:33:46 +00:00
|
|
|
gst_rtp_h264_depay_init (GstRtpH264Depay * rtph264depay)
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
{
|
|
|
|
rtph264depay->adapter = gst_adapter_new ();
|
2009-11-26 15:14:30 +00:00
|
|
|
rtph264depay->picture_adapter = gst_adapter_new ();
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
rtph264depay->byte_stream = DEFAULT_BYTE_STREAM;
|
2009-11-26 15:14:30 +00:00
|
|
|
rtph264depay->merge = DEFAULT_ACCESS_UNIT;
|
2011-07-14 20:23:49 +00:00
|
|
|
rtph264depay->sps = g_ptr_array_new_with_free_func (
|
|
|
|
(GDestroyNotify) gst_buffer_unref);
|
|
|
|
rtph264depay->pps = g_ptr_array_new_with_free_func (
|
|
|
|
(GDestroyNotify) gst_buffer_unref);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
|
2011-07-18 12:24:48 +00:00
|
|
|
static void
|
2017-06-02 20:27:40 +00:00
|
|
|
gst_rtp_h264_depay_reset (GstRtpH264Depay * rtph264depay, gboolean hard)
|
2011-07-18 12:24:48 +00:00
|
|
|
{
|
|
|
|
gst_adapter_clear (rtph264depay->adapter);
|
|
|
|
rtph264depay->wait_start = TRUE;
|
|
|
|
gst_adapter_clear (rtph264depay->picture_adapter);
|
|
|
|
rtph264depay->picture_start = FALSE;
|
|
|
|
rtph264depay->last_keyframe = FALSE;
|
|
|
|
rtph264depay->last_ts = 0;
|
2011-07-27 17:15:20 +00:00
|
|
|
rtph264depay->current_fu_type = 0;
|
2011-07-14 20:23:49 +00:00
|
|
|
rtph264depay->new_codec_data = FALSE;
|
|
|
|
g_ptr_array_set_size (rtph264depay->sps, 0);
|
|
|
|
g_ptr_array_set_size (rtph264depay->pps, 0);
|
2017-06-02 20:27:40 +00:00
|
|
|
|
|
|
|
if (hard) {
|
|
|
|
if (rtph264depay->allocator != NULL) {
|
|
|
|
gst_object_unref (rtph264depay->allocator);
|
|
|
|
rtph264depay->allocator = NULL;
|
|
|
|
}
|
|
|
|
gst_allocation_params_init (&rtph264depay->params);
|
|
|
|
}
|
2011-07-18 12:24:48 +00:00
|
|
|
}
|
|
|
|
|
2018-12-17 21:48:53 +00:00
|
|
|
static void
|
|
|
|
gst_rtp_h264_depay_drain (GstRtpH264Depay * rtph264depay)
|
|
|
|
{
|
|
|
|
GstClockTime timestamp;
|
|
|
|
gboolean keyframe;
|
|
|
|
GstBuffer *outbuf;
|
|
|
|
|
|
|
|
if (!rtph264depay->picture_start)
|
|
|
|
return;
|
|
|
|
|
|
|
|
outbuf = gst_rtp_h264_complete_au (rtph264depay, ×tamp, &keyframe);
|
|
|
|
if (outbuf)
|
|
|
|
gst_rtp_h264_depay_push (rtph264depay, outbuf, keyframe, timestamp, FALSE);
|
|
|
|
}
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
static void
|
|
|
|
gst_rtp_h264_depay_finalize (GObject * object)
|
|
|
|
{
|
|
|
|
GstRtpH264Depay *rtph264depay;
|
|
|
|
|
|
|
|
rtph264depay = GST_RTP_H264_DEPAY (object);
|
|
|
|
|
2007-04-10 17:06:05 +00:00
|
|
|
if (rtph264depay->codec_data)
|
|
|
|
gst_buffer_unref (rtph264depay->codec_data);
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
g_object_unref (rtph264depay->adapter);
|
2009-11-26 15:14:30 +00:00
|
|
|
g_object_unref (rtph264depay->picture_adapter);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
g_ptr_array_free (rtph264depay->sps, TRUE);
|
|
|
|
g_ptr_array_free (rtph264depay->pps, TRUE);
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
|
|
}
|
|
|
|
|
2010-12-17 14:38:15 +00:00
|
|
|
static void
|
|
|
|
gst_rtp_h264_depay_negotiate (GstRtpH264Depay * rtph264depay)
|
|
|
|
{
|
|
|
|
GstCaps *caps;
|
|
|
|
gint byte_stream = -1;
|
|
|
|
gint merge = -1;
|
|
|
|
|
|
|
|
caps =
|
2011-11-11 11:25:01 +00:00
|
|
|
gst_pad_get_allowed_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph264depay));
|
2010-12-17 14:38:15 +00:00
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "allowed caps: %" GST_PTR_FORMAT, caps);
|
|
|
|
|
|
|
|
if (caps) {
|
|
|
|
if (gst_caps_get_size (caps) > 0) {
|
|
|
|
GstStructure *s = gst_caps_get_structure (caps, 0);
|
|
|
|
const gchar *str = NULL;
|
|
|
|
|
|
|
|
if ((str = gst_structure_get_string (s, "stream-format"))) {
|
|
|
|
if (strcmp (str, "avc") == 0) {
|
|
|
|
byte_stream = FALSE;
|
|
|
|
} else if (strcmp (str, "byte-stream") == 0) {
|
|
|
|
byte_stream = TRUE;
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "unknown stream-format: %s", str);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((str = gst_structure_get_string (s, "alignment"))) {
|
|
|
|
if (strcmp (str, "au") == 0) {
|
|
|
|
merge = TRUE;
|
|
|
|
} else if (strcmp (str, "nal") == 0) {
|
|
|
|
merge = FALSE;
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "unknown alignment: %s", str);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gst_caps_unref (caps);
|
|
|
|
}
|
|
|
|
|
2012-07-06 13:42:19 +00:00
|
|
|
if (byte_stream != -1) {
|
2010-12-17 14:38:15 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "downstream requires byte-stream %d",
|
|
|
|
byte_stream);
|
2012-07-06 13:42:19 +00:00
|
|
|
rtph264depay->byte_stream = byte_stream;
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "defaulting to byte-stream %d",
|
|
|
|
DEFAULT_BYTE_STREAM);
|
|
|
|
rtph264depay->byte_stream = DEFAULT_BYTE_STREAM;
|
2010-12-17 14:38:15 +00:00
|
|
|
}
|
2012-07-06 13:42:19 +00:00
|
|
|
if (merge != -1) {
|
2010-12-17 14:38:15 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "downstream requires merge %d", merge);
|
2012-07-06 13:42:19 +00:00
|
|
|
rtph264depay->merge = merge;
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "defaulting to merge %d",
|
|
|
|
DEFAULT_ACCESS_UNIT);
|
|
|
|
rtph264depay->merge = DEFAULT_ACCESS_UNIT;
|
2010-12-17 14:38:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
static gboolean
|
|
|
|
parse_sps (GstMapInfo * map, guint32 * sps_id)
|
|
|
|
{
|
|
|
|
GstBitReader br = GST_BIT_READER_INIT (map->data + 4,
|
|
|
|
map->size - 4);
|
|
|
|
|
|
|
|
if (map->size < 5)
|
|
|
|
return FALSE;
|
|
|
|
|
2016-02-17 13:26:02 +00:00
|
|
|
if (!gst_rtp_read_golomb (&br, sps_id))
|
2011-07-14 20:23:49 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
parse_pps (GstMapInfo * map, guint32 * sps_id, guint32 * pps_id)
|
|
|
|
{
|
|
|
|
GstBitReader br = GST_BIT_READER_INIT (map->data + 1,
|
|
|
|
map->size - 1);
|
|
|
|
|
|
|
|
if (map->size < 2)
|
|
|
|
return FALSE;
|
|
|
|
|
2016-02-17 13:26:02 +00:00
|
|
|
if (!gst_rtp_read_golomb (&br, pps_id))
|
2011-07-14 20:23:49 +00:00
|
|
|
return FALSE;
|
2016-02-17 13:26:02 +00:00
|
|
|
if (!gst_rtp_read_golomb (&br, sps_id))
|
2011-07-14 20:23:49 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2017-06-02 20:27:40 +00:00
|
|
|
static gboolean
|
|
|
|
gst_rtp_h264_depay_set_output_caps (GstRtpH264Depay * rtph264depay,
|
|
|
|
GstCaps * caps)
|
|
|
|
{
|
|
|
|
GstAllocationParams params;
|
|
|
|
GstAllocator *allocator = NULL;
|
|
|
|
GstPad *srcpad;
|
|
|
|
gboolean res;
|
|
|
|
|
|
|
|
gst_allocation_params_init (¶ms);
|
|
|
|
|
|
|
|
srcpad = GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph264depay);
|
|
|
|
res = gst_pad_set_caps (srcpad, caps);
|
|
|
|
if (res) {
|
|
|
|
GstQuery *query;
|
|
|
|
|
|
|
|
query = gst_query_new_allocation (caps, TRUE);
|
|
|
|
if (!gst_pad_peer_query (srcpad, query)) {
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "downstream ALLOCATION query failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gst_query_get_n_allocation_params (query) > 0) {
|
|
|
|
gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms);
|
|
|
|
}
|
|
|
|
|
|
|
|
gst_query_unref (query);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rtph264depay->allocator)
|
|
|
|
gst_object_unref (rtph264depay->allocator);
|
|
|
|
|
|
|
|
rtph264depay->allocator = allocator;
|
|
|
|
rtph264depay->params = params;
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
2011-07-14 20:23:49 +00:00
|
|
|
|
|
|
|
static gboolean
|
|
|
|
gst_rtp_h264_set_src_caps (GstRtpH264Depay * rtph264depay)
|
|
|
|
{
|
2017-11-29 12:30:11 +00:00
|
|
|
gboolean res = TRUE;
|
gst/rtp/gstrtpL16depay.c: Check if clock-rate and channels are valid.
Original commit message from CVS:
* gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps),
(gst_rtp_L16_depay_process):
Check if clock-rate and channels are valid.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps),
(gst_rtp_ac3_depay_process):
Don't ignore the return value of set_caps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps),
(gst_rtp_amr_depay_process):
* gst/rtp/gstrtpamrdepay.h:
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set output caps on the buffers, the base class does that for
us.
The subclass will make sure we are negotiated.
* gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps),
(gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset):
* gst/rtp/gstrtpdvdepay.h:
Clean up caps negotiation.
The subclass will make sure we are negotiated.
* gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps),
(gst_rtp_g726_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init),
(gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process):
* gst/rtp/gstrtpg729depay.h:
The subclass will make sure we are negotiated.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps),
(gst_rtp_gsm_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps):
Clean up caps negotiation.
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps),
(gst_rtp_h263_depay_process):
Clean up caps negotiation.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps),
(gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer):
* gst/rtp/gstrtph263pay.h:
Don't ignore the return value of set_outcaps.
Do some more timestamps.
* gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps),
(gst_rtp_h263p_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init),
(gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush),
(gst_rtp_h263p_pay_handle_buffer):
* gst/rtp/gstrtph263ppay.h:
Don't ignore the return value of set_outcaps.
Do some more timestamps.
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
Fix possible caps leak.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps):
Add some more debug info.
* gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps),
(gst_rtp_ilbc_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps):
Clean up caps negotiation.
* gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps),
(gst_rtp_mp1s_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps),
(gst_rtp_mp2t_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps),
(gst_rtp_mp4a_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps),
(gst_rtp_mp4a_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps),
(gst_rtp_mp4g_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize),
(gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps),
(gst_rtp_mp4v_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps),
(gst_rtp_mp4v_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps),
(gst_rtp_mpa_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps),
(gst_rtp_mpv_depay_process):
Clean up caps negotiation.
Actually set output caps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps),
(gst_rtp_pcma_depay_process):
Clean up caps negotiation.
Set output buffer duration because we can.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps),
(gst_rtp_pcmu_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init),
(gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process):
Clean up caps negotiation.
Set output caps on the pad and header buffers.
Set duration on output buffers because we can.
* gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps),
(gst_rtp_sv3v_depay_process):
Clean up caps negotiation.
No need to validate the buffer, the base class does that for us.
No need to set caps out output buffers, subclass does that.
* gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps),
(gst_rtp_theora_depay_process):
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init),
(gst_rtp_theora_pay_flush_packet), (encode_base64),
(gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id),
(gst_rtp_theora_pay_handle_buffer):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps),
(gst_rtp_vorbis_depay_process):
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps):
Clean up caps negotiation, don't ignore setcaps return.
* gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps):
Don't ignore the return value of set_outcaps.
2008-10-27 11:03:53 +00:00
|
|
|
GstCaps *srccaps;
|
2015-12-16 12:40:39 +00:00
|
|
|
GstCaps *old_caps;
|
2017-06-02 19:54:20 +00:00
|
|
|
GstPad *srcpad;
|
2011-07-14 20:23:49 +00:00
|
|
|
|
|
|
|
if (!rtph264depay->byte_stream &&
|
|
|
|
(!rtph264depay->new_codec_data ||
|
|
|
|
rtph264depay->sps->len == 0 || rtph264depay->pps->len == 0))
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
srccaps = gst_caps_new_simple ("video/x-h264",
|
|
|
|
"stream-format", G_TYPE_STRING,
|
|
|
|
rtph264depay->byte_stream ? "byte-stream" : "avc",
|
|
|
|
"alignment", G_TYPE_STRING, rtph264depay->merge ? "au" : "nal", NULL);
|
|
|
|
|
|
|
|
if (!rtph264depay->byte_stream) {
|
|
|
|
GstBuffer *codec_data;
|
|
|
|
GstMapInfo map;
|
|
|
|
GstMapInfo nalmap;
|
|
|
|
guint8 *data;
|
|
|
|
guint len;
|
|
|
|
guint new_size;
|
|
|
|
guint i;
|
2015-08-04 09:25:46 +00:00
|
|
|
guchar level = 0;
|
|
|
|
guchar profile_compat = G_MAXUINT8;
|
2011-07-14 20:23:49 +00:00
|
|
|
|
|
|
|
/* start with 7 bytes header */
|
|
|
|
len = 7;
|
|
|
|
/* count sps & pps */
|
|
|
|
for (i = 0; i < rtph264depay->sps->len; i++)
|
|
|
|
len += 2 + gst_buffer_get_size (g_ptr_array_index (rtph264depay->sps, i));
|
|
|
|
for (i = 0; i < rtph264depay->pps->len; i++)
|
|
|
|
len += 2 + gst_buffer_get_size (g_ptr_array_index (rtph264depay->pps, i));
|
|
|
|
|
|
|
|
codec_data = gst_buffer_new_and_alloc (len);
|
|
|
|
gst_buffer_map (codec_data, &map, GST_MAP_READWRITE);
|
|
|
|
data = map.data;
|
|
|
|
|
|
|
|
/* 8 bits version == 1 */
|
|
|
|
*data++ = 1;
|
|
|
|
|
|
|
|
/* According to: ISO/IEC 14496-15:2004(E) section 5.2.4.1
|
|
|
|
* The level is the max level of all SPSes
|
|
|
|
* A profile compat bit can only be set if all SPSes include that bit
|
|
|
|
*/
|
|
|
|
for (i = 0; i < rtph264depay->sps->len; i++) {
|
|
|
|
gst_buffer_map (g_ptr_array_index (rtph264depay->sps, i), &nalmap,
|
|
|
|
GST_MAP_READ);
|
|
|
|
profile_compat &= nalmap.data[2];
|
|
|
|
level = MAX (level, nalmap.data[3]);
|
|
|
|
gst_buffer_unmap (g_ptr_array_index (rtph264depay->sps, i), &nalmap);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Assume all SPSes use the same profile, so extract from the first SPS */
|
|
|
|
gst_buffer_map (g_ptr_array_index (rtph264depay->sps, 0), &nalmap,
|
|
|
|
GST_MAP_READ);
|
|
|
|
*data++ = nalmap.data[1];
|
|
|
|
gst_buffer_unmap (g_ptr_array_index (rtph264depay->sps, 0), &nalmap);
|
|
|
|
*data++ = profile_compat;
|
|
|
|
*data++ = level;
|
|
|
|
|
|
|
|
/* 6 bits reserved | 2 bits lengthSizeMinusOn */
|
|
|
|
*data++ = 0xff;
|
|
|
|
/* 3 bits reserved | 5 bits numOfSequenceParameterSets */
|
|
|
|
*data++ = 0xe0 | (rtph264depay->sps->len & 0x1f);
|
|
|
|
|
|
|
|
/* copy all SPS */
|
|
|
|
for (i = 0; i < rtph264depay->sps->len; i++) {
|
|
|
|
gst_buffer_map (g_ptr_array_index (rtph264depay->sps, i), &nalmap,
|
|
|
|
GST_MAP_READ);
|
|
|
|
|
2012-05-31 21:39:25 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "copy SPS %d of length %u", i,
|
|
|
|
(guint) nalmap.size);
|
2011-07-14 20:23:49 +00:00
|
|
|
GST_WRITE_UINT16_BE (data, nalmap.size);
|
|
|
|
data += 2;
|
|
|
|
memcpy (data, nalmap.data, nalmap.size);
|
|
|
|
data += nalmap.size;
|
|
|
|
gst_buffer_unmap (g_ptr_array_index (rtph264depay->sps, i), &nalmap);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 8 bits numOfPictureParameterSets */
|
|
|
|
*data++ = rtph264depay->pps->len;
|
|
|
|
/* copy all PPS */
|
|
|
|
for (i = 0; i < rtph264depay->pps->len; i++) {
|
|
|
|
gst_buffer_map (g_ptr_array_index (rtph264depay->pps, i), &nalmap,
|
|
|
|
GST_MAP_READ);
|
|
|
|
|
2012-05-31 21:39:25 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "copy PPS %d of length %u", i,
|
|
|
|
(guint) nalmap.size);
|
2011-07-14 20:23:49 +00:00
|
|
|
GST_WRITE_UINT16_BE (data, nalmap.size);
|
|
|
|
data += 2;
|
|
|
|
memcpy (data, nalmap.data, nalmap.size);
|
|
|
|
data += nalmap.size;
|
|
|
|
gst_buffer_unmap (g_ptr_array_index (rtph264depay->pps, i), &nalmap);
|
|
|
|
}
|
|
|
|
|
|
|
|
new_size = data - map.data;
|
|
|
|
gst_buffer_unmap (codec_data, &map);
|
|
|
|
gst_buffer_set_size (codec_data, new_size);
|
|
|
|
|
|
|
|
gst_caps_set_simple (srccaps,
|
|
|
|
"codec_data", GST_TYPE_BUFFER, codec_data, NULL);
|
|
|
|
gst_buffer_unref (codec_data);
|
|
|
|
}
|
|
|
|
|
2015-08-04 09:25:46 +00:00
|
|
|
/* Set profile a level from SPS */
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
GstBuffer *max_level_sps = NULL;
|
|
|
|
gint level = 0;
|
|
|
|
GstMapInfo nalmap;
|
|
|
|
|
|
|
|
/* Get the SPS with the highest level. We assume
|
|
|
|
* all SPS have the same profile */
|
|
|
|
for (i = 0; i < rtph264depay->sps->len; i++) {
|
|
|
|
gst_buffer_map (g_ptr_array_index (rtph264depay->sps, i), &nalmap,
|
|
|
|
GST_MAP_READ);
|
|
|
|
if (level == 0 || level < nalmap.data[3]) {
|
|
|
|
max_level_sps = g_ptr_array_index (rtph264depay->sps, i);
|
|
|
|
level = nalmap.data[3];
|
|
|
|
}
|
|
|
|
gst_buffer_unmap (g_ptr_array_index (rtph264depay->sps, i), &nalmap);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (max_level_sps) {
|
|
|
|
gst_buffer_map (max_level_sps, &nalmap, GST_MAP_READ);
|
|
|
|
gst_codec_utils_h264_caps_set_level_and_profile (srccaps, nalmap.data + 1,
|
|
|
|
nalmap.size - 1);
|
|
|
|
gst_buffer_unmap (max_level_sps, &nalmap);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-02 19:54:20 +00:00
|
|
|
srcpad = GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph264depay);
|
2015-08-04 09:25:46 +00:00
|
|
|
|
2017-06-02 19:54:20 +00:00
|
|
|
old_caps = gst_pad_get_current_caps (srcpad);
|
2015-08-04 09:09:12 +00:00
|
|
|
|
2017-11-29 12:30:11 +00:00
|
|
|
if (old_caps == NULL || !gst_caps_is_equal (srccaps, old_caps)) {
|
2017-06-02 20:27:40 +00:00
|
|
|
res = gst_rtp_h264_depay_set_output_caps (rtph264depay, srccaps);
|
2015-08-04 09:09:12 +00:00
|
|
|
}
|
|
|
|
|
2019-03-06 17:33:23 +00:00
|
|
|
gst_clear_caps (&old_caps);
|
2011-07-14 20:23:49 +00:00
|
|
|
gst_caps_unref (srccaps);
|
|
|
|
|
2017-04-24 16:29:37 +00:00
|
|
|
/* Insert SPS and PPS into the stream on next opportunity (if bytestream) */
|
|
|
|
if (rtph264depay->byte_stream
|
|
|
|
&& (rtph264depay->sps->len > 0 || rtph264depay->pps->len > 0)) {
|
2015-08-03 14:55:01 +00:00
|
|
|
gint i;
|
|
|
|
GstBuffer *codec_data;
|
|
|
|
GstMapInfo map;
|
|
|
|
guint8 *data;
|
|
|
|
guint len = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < rtph264depay->sps->len; i++) {
|
|
|
|
len += 4 + gst_buffer_get_size (g_ptr_array_index (rtph264depay->sps, i));
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < rtph264depay->pps->len; i++) {
|
|
|
|
len += 4 + gst_buffer_get_size (g_ptr_array_index (rtph264depay->pps, i));
|
|
|
|
}
|
|
|
|
|
|
|
|
codec_data = gst_buffer_new_and_alloc (len);
|
|
|
|
gst_buffer_map (codec_data, &map, GST_MAP_WRITE);
|
|
|
|
data = map.data;
|
|
|
|
|
|
|
|
for (i = 0; i < rtph264depay->sps->len; i++) {
|
|
|
|
GstBuffer *sps_buf = g_ptr_array_index (rtph264depay->sps, i);
|
|
|
|
guint sps_size = gst_buffer_get_size (sps_buf);
|
|
|
|
|
|
|
|
if (rtph264depay->byte_stream)
|
|
|
|
memcpy (data, sync_bytes, sizeof (sync_bytes));
|
|
|
|
else
|
|
|
|
GST_WRITE_UINT32_BE (data, sps_size);
|
|
|
|
gst_buffer_extract (sps_buf, 0, data + 4, -1);
|
|
|
|
data += 4 + sps_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < rtph264depay->pps->len; i++) {
|
|
|
|
GstBuffer *pps_buf = g_ptr_array_index (rtph264depay->pps, i);
|
|
|
|
guint pps_size = gst_buffer_get_size (pps_buf);
|
|
|
|
|
|
|
|
if (rtph264depay->byte_stream)
|
|
|
|
memcpy (data, sync_bytes, sizeof (sync_bytes));
|
|
|
|
else
|
|
|
|
GST_WRITE_UINT32_BE (data, pps_size);
|
|
|
|
gst_buffer_extract (pps_buf, 0, data + 4, -1);
|
|
|
|
data += 4 + pps_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
gst_buffer_unmap (codec_data, &map);
|
|
|
|
if (rtph264depay->codec_data)
|
|
|
|
gst_buffer_unref (rtph264depay->codec_data);
|
|
|
|
rtph264depay->codec_data = codec_data;
|
|
|
|
}
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
if (res)
|
|
|
|
rtph264depay->new_codec_data = FALSE;
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2013-08-12 19:26:08 +00:00
|
|
|
gboolean
|
|
|
|
gst_rtp_h264_add_sps_pps (GstElement * rtph264, GPtrArray * sps_array,
|
|
|
|
GPtrArray * pps_array, GstBuffer * nal)
|
2011-07-14 20:23:49 +00:00
|
|
|
{
|
|
|
|
GstMapInfo map;
|
|
|
|
guchar type;
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
gst_buffer_map (nal, &map, GST_MAP_READ);
|
|
|
|
|
|
|
|
type = map.data[0] & 0x1f;
|
|
|
|
|
|
|
|
if (type == 7) {
|
|
|
|
guint32 sps_id;
|
|
|
|
|
|
|
|
if (!parse_sps (&map, &sps_id)) {
|
2013-08-12 19:26:08 +00:00
|
|
|
GST_WARNING_OBJECT (rtph264, "Invalid SPS,"
|
2011-07-14 20:23:49 +00:00
|
|
|
" can't parse seq_parameter_set_id");
|
|
|
|
goto drop;
|
|
|
|
}
|
|
|
|
|
2013-08-12 19:26:08 +00:00
|
|
|
for (i = 0; i < sps_array->len; i++) {
|
|
|
|
GstBuffer *sps = g_ptr_array_index (sps_array, i);
|
2011-07-14 20:23:49 +00:00
|
|
|
GstMapInfo spsmap;
|
|
|
|
guint32 tmp_sps_id;
|
|
|
|
|
|
|
|
gst_buffer_map (sps, &spsmap, GST_MAP_READ);
|
|
|
|
parse_sps (&spsmap, &tmp_sps_id);
|
|
|
|
|
|
|
|
if (sps_id == tmp_sps_id) {
|
|
|
|
if (map.size == spsmap.size &&
|
|
|
|
memcmp (map.data, spsmap.data, spsmap.size) == 0) {
|
2013-08-12 19:26:08 +00:00
|
|
|
GST_LOG_OBJECT (rtph264, "Unchanged SPS %u, not updating", sps_id);
|
2011-07-14 20:23:49 +00:00
|
|
|
gst_buffer_unmap (sps, &spsmap);
|
|
|
|
goto drop;
|
|
|
|
} else {
|
|
|
|
gst_buffer_unmap (sps, &spsmap);
|
2013-08-12 19:26:08 +00:00
|
|
|
g_ptr_array_remove_index_fast (sps_array, i);
|
|
|
|
g_ptr_array_add (sps_array, nal);
|
|
|
|
GST_LOG_OBJECT (rtph264, "Modified SPS %u, replacing", sps_id);
|
2011-07-14 20:23:49 +00:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gst_buffer_unmap (sps, &spsmap);
|
|
|
|
}
|
2013-08-12 19:26:08 +00:00
|
|
|
GST_LOG_OBJECT (rtph264, "Adding new SPS %u", sps_id);
|
|
|
|
g_ptr_array_add (sps_array, nal);
|
2011-07-14 20:23:49 +00:00
|
|
|
} else if (type == 8) {
|
|
|
|
guint32 sps_id;
|
|
|
|
guint32 pps_id;
|
|
|
|
|
|
|
|
if (!parse_pps (&map, &sps_id, &pps_id)) {
|
2013-08-12 19:26:08 +00:00
|
|
|
GST_WARNING_OBJECT (rtph264, "Invalid PPS,"
|
2011-07-14 20:23:49 +00:00
|
|
|
" can't parse seq_parameter_set_id or pic_parameter_set_id");
|
|
|
|
goto drop;
|
|
|
|
}
|
|
|
|
|
2013-08-12 19:26:08 +00:00
|
|
|
for (i = 0; i < pps_array->len; i++) {
|
|
|
|
GstBuffer *pps = g_ptr_array_index (pps_array, i);
|
2011-07-14 20:23:49 +00:00
|
|
|
GstMapInfo ppsmap;
|
|
|
|
guint32 tmp_sps_id;
|
|
|
|
guint32 tmp_pps_id;
|
|
|
|
|
|
|
|
|
|
|
|
gst_buffer_map (pps, &ppsmap, GST_MAP_READ);
|
|
|
|
parse_pps (&ppsmap, &tmp_sps_id, &tmp_pps_id);
|
|
|
|
|
2015-08-04 08:48:27 +00:00
|
|
|
if (pps_id == tmp_pps_id) {
|
2011-07-14 20:23:49 +00:00
|
|
|
if (map.size == ppsmap.size &&
|
|
|
|
memcmp (map.data, ppsmap.data, ppsmap.size) == 0) {
|
2013-08-12 19:26:08 +00:00
|
|
|
GST_LOG_OBJECT (rtph264, "Unchanged PPS %u:%u, not updating", sps_id,
|
|
|
|
pps_id);
|
2011-07-14 20:23:49 +00:00
|
|
|
gst_buffer_unmap (pps, &ppsmap);
|
|
|
|
goto drop;
|
|
|
|
} else {
|
|
|
|
gst_buffer_unmap (pps, &ppsmap);
|
2013-08-12 19:26:08 +00:00
|
|
|
g_ptr_array_remove_index_fast (pps_array, i);
|
|
|
|
g_ptr_array_add (pps_array, nal);
|
|
|
|
GST_LOG_OBJECT (rtph264, "Modified PPS %u:%u, replacing",
|
2011-07-14 20:23:49 +00:00
|
|
|
sps_id, pps_id);
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gst_buffer_unmap (pps, &ppsmap);
|
|
|
|
}
|
2013-08-12 19:26:08 +00:00
|
|
|
GST_LOG_OBJECT (rtph264, "Adding new PPS %u:%i", sps_id, pps_id);
|
|
|
|
g_ptr_array_add (pps_array, nal);
|
2011-07-14 20:23:49 +00:00
|
|
|
} else {
|
|
|
|
goto drop;
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
|
|
|
gst_buffer_unmap (nal, &map);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
drop:
|
|
|
|
gst_buffer_unmap (nal, &map);
|
|
|
|
gst_buffer_unref (nal);
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2013-08-12 19:26:08 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
gst_rtp_h264_depay_add_sps_pps (GstRtpH264Depay * rtph264depay, GstBuffer * nal)
|
|
|
|
{
|
|
|
|
if (gst_rtp_h264_add_sps_pps (GST_ELEMENT (rtph264depay),
|
|
|
|
rtph264depay->sps, rtph264depay->pps, nal))
|
|
|
|
rtph264depay->new_codec_data = TRUE;
|
|
|
|
}
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
static gboolean
|
|
|
|
gst_rtp_h264_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps)
|
|
|
|
{
|
gst/rtp/gstrtpL16depay.c: Check if clock-rate and channels are valid.
Original commit message from CVS:
* gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps),
(gst_rtp_L16_depay_process):
Check if clock-rate and channels are valid.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps),
(gst_rtp_ac3_depay_process):
Don't ignore the return value of set_caps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps),
(gst_rtp_amr_depay_process):
* gst/rtp/gstrtpamrdepay.h:
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set output caps on the buffers, the base class does that for
us.
The subclass will make sure we are negotiated.
* gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps),
(gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset):
* gst/rtp/gstrtpdvdepay.h:
Clean up caps negotiation.
The subclass will make sure we are negotiated.
* gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps),
(gst_rtp_g726_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init),
(gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process):
* gst/rtp/gstrtpg729depay.h:
The subclass will make sure we are negotiated.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps),
(gst_rtp_gsm_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps):
Clean up caps negotiation.
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps),
(gst_rtp_h263_depay_process):
Clean up caps negotiation.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps),
(gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer):
* gst/rtp/gstrtph263pay.h:
Don't ignore the return value of set_outcaps.
Do some more timestamps.
* gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps),
(gst_rtp_h263p_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init),
(gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush),
(gst_rtp_h263p_pay_handle_buffer):
* gst/rtp/gstrtph263ppay.h:
Don't ignore the return value of set_outcaps.
Do some more timestamps.
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
Fix possible caps leak.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps):
Add some more debug info.
* gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps),
(gst_rtp_ilbc_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps):
Clean up caps negotiation.
* gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps),
(gst_rtp_mp1s_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps),
(gst_rtp_mp2t_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps),
(gst_rtp_mp4a_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps),
(gst_rtp_mp4a_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps),
(gst_rtp_mp4g_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize),
(gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps),
(gst_rtp_mp4v_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps),
(gst_rtp_mp4v_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps),
(gst_rtp_mpa_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps),
(gst_rtp_mpv_depay_process):
Clean up caps negotiation.
Actually set output caps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps),
(gst_rtp_pcma_depay_process):
Clean up caps negotiation.
Set output buffer duration because we can.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps),
(gst_rtp_pcmu_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init),
(gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process):
Clean up caps negotiation.
Set output caps on the pad and header buffers.
Set duration on output buffers because we can.
* gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps),
(gst_rtp_sv3v_depay_process):
Clean up caps negotiation.
No need to validate the buffer, the base class does that for us.
No need to set caps out output buffers, subclass does that.
* gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps),
(gst_rtp_theora_depay_process):
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init),
(gst_rtp_theora_pay_flush_packet), (encode_base64),
(gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id),
(gst_rtp_theora_pay_handle_buffer):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps),
(gst_rtp_vorbis_depay_process):
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps):
Clean up caps negotiation, don't ignore setcaps return.
* gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps):
Don't ignore the return value of set_outcaps.
2008-10-27 11:03:53 +00:00
|
|
|
gint clock_rate;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
GstStructure *structure = gst_caps_get_structure (caps, 0);
|
2007-02-16 12:30:22 +00:00
|
|
|
GstRtpH264Depay *rtph264depay;
|
2011-07-14 20:23:49 +00:00
|
|
|
const gchar *ps;
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
GstBuffer *codec_data;
|
2012-01-23 16:25:37 +00:00
|
|
|
GstMapInfo map;
|
|
|
|
guint8 *ptr;
|
2007-02-16 12:30:22 +00:00
|
|
|
|
|
|
|
rtph264depay = GST_RTP_H264_DEPAY (depayload);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
gst/rtp/gstrtpL16depay.c: Check if clock-rate and channels are valid.
Original commit message from CVS:
* gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps),
(gst_rtp_L16_depay_process):
Check if clock-rate and channels are valid.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps),
(gst_rtp_ac3_depay_process):
Don't ignore the return value of set_caps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps),
(gst_rtp_amr_depay_process):
* gst/rtp/gstrtpamrdepay.h:
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set output caps on the buffers, the base class does that for
us.
The subclass will make sure we are negotiated.
* gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps),
(gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset):
* gst/rtp/gstrtpdvdepay.h:
Clean up caps negotiation.
The subclass will make sure we are negotiated.
* gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps),
(gst_rtp_g726_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init),
(gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process):
* gst/rtp/gstrtpg729depay.h:
The subclass will make sure we are negotiated.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps),
(gst_rtp_gsm_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps):
Clean up caps negotiation.
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps),
(gst_rtp_h263_depay_process):
Clean up caps negotiation.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps),
(gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer):
* gst/rtp/gstrtph263pay.h:
Don't ignore the return value of set_outcaps.
Do some more timestamps.
* gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps),
(gst_rtp_h263p_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init),
(gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush),
(gst_rtp_h263p_pay_handle_buffer):
* gst/rtp/gstrtph263ppay.h:
Don't ignore the return value of set_outcaps.
Do some more timestamps.
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
Fix possible caps leak.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps):
Add some more debug info.
* gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps),
(gst_rtp_ilbc_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps):
Clean up caps negotiation.
* gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps),
(gst_rtp_mp1s_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps),
(gst_rtp_mp2t_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps),
(gst_rtp_mp4a_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps),
(gst_rtp_mp4a_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps),
(gst_rtp_mp4g_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize),
(gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps),
(gst_rtp_mp4v_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
No need to set caps on buffers, subclass does that for us.
* gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps),
(gst_rtp_mp4v_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps),
(gst_rtp_mpa_depay_process):
Clean up caps negotiation.
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps),
(gst_rtp_mpv_depay_process):
Clean up caps negotiation.
Actually set output caps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps),
(gst_rtp_pcma_depay_process):
Clean up caps negotiation.
Set output buffer duration because we can.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps),
(gst_rtp_pcmu_depay_process):
Clean up caps negotiation.
Use the marker bit to set the DISCONT flag on outgoing buffers.
* gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init),
(gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process):
Clean up caps negotiation.
Set output caps on the pad and header buffers.
Set duration on output buffers because we can.
* gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps),
(gst_rtp_sv3v_depay_process):
Clean up caps negotiation.
No need to validate the buffer, the base class does that for us.
No need to set caps out output buffers, subclass does that.
* gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps),
(gst_rtp_theora_depay_process):
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init),
(gst_rtp_theora_pay_flush_packet), (encode_base64),
(gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id),
(gst_rtp_theora_pay_handle_buffer):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps),
(gst_rtp_vorbis_depay_process):
Don't ignore the return value of setcaps.
No need to validate the buffer, the base class does that for us.
* gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers):
Don't ignore the return value of set_outcaps.
* gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps):
Clean up caps negotiation, don't ignore setcaps return.
* gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps):
Don't ignore the return value of set_outcaps.
2008-10-27 11:03:53 +00:00
|
|
|
if (!gst_structure_get_int (structure, "clock-rate", &clock_rate))
|
|
|
|
clock_rate = 90000;
|
gst/rtp/: Added H264 payloader. Fixes #423782.
Original commit message from CVS:
Patch by: Laurent Glayal <spglegle at yahoo dot fr>
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_base_init),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property), (gst_rtp_h264_pay_change_state),
(gst_rtp_h264_pay_plugin_init):
* gst/rtp/gstrtph264pay.h:
Added H264 payloader. Fixes #423782.
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process):
Small fixes.
2007-03-29 08:08:49 +00:00
|
|
|
depayload->clock_rate = clock_rate;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
/* Base64 encoded, comma separated config NALs */
|
|
|
|
ps = gst_structure_get_string (structure, "sprop-parameter-sets");
|
|
|
|
|
2010-12-17 14:38:15 +00:00
|
|
|
/* negotiate with downstream w.r.t. output format and alignment */
|
|
|
|
gst_rtp_h264_depay_negotiate (rtph264depay);
|
|
|
|
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
if (rtph264depay->byte_stream && ps != NULL) {
|
|
|
|
/* for bytestream we only need the parameter sets but we don't error out
|
|
|
|
* when they are not there, we assume they are in the stream. */
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
gchar **params;
|
|
|
|
guint len, total;
|
|
|
|
gint i;
|
|
|
|
|
|
|
|
params = g_strsplit (ps, ",", 0);
|
|
|
|
|
2007-06-13 17:11:24 +00:00
|
|
|
/* count total number of bytes in base64. Also include the sync bytes in
|
|
|
|
* front of the params. */
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
len = 0;
|
|
|
|
for (i = 0; params[i]; i++) {
|
|
|
|
len += strlen (params[i]);
|
2007-06-13 17:11:24 +00:00
|
|
|
len += sizeof (sync_bytes);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
/* we seriously overshoot the length, but it's fine. */
|
|
|
|
codec_data = gst_buffer_new_and_alloc (len);
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_map (codec_data, &map, GST_MAP_WRITE);
|
|
|
|
ptr = map.data;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
total = 0;
|
|
|
|
for (i = 0; params[i]; i++) {
|
2009-03-18 13:50:17 +00:00
|
|
|
guint save = 0;
|
|
|
|
gint state = 0;
|
|
|
|
|
2009-03-19 12:25:57 +00:00
|
|
|
GST_DEBUG_OBJECT (depayload, "decoding param %d (%s)", i, params[i]);
|
2011-06-13 14:33:46 +00:00
|
|
|
memcpy (ptr, sync_bytes, sizeof (sync_bytes));
|
|
|
|
ptr += sizeof (sync_bytes);
|
2009-03-19 12:25:57 +00:00
|
|
|
len =
|
2011-06-13 14:33:46 +00:00
|
|
|
g_base64_decode_step (params[i], strlen (params[i]), ptr, &state,
|
2009-03-19 12:25:57 +00:00
|
|
|
&save);
|
|
|
|
GST_DEBUG_OBJECT (depayload, "decoded %d bytes", len);
|
2007-02-16 12:30:22 +00:00
|
|
|
total += len + sizeof (sync_bytes);
|
2011-06-13 14:33:46 +00:00
|
|
|
ptr += len;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_unmap (codec_data, &map);
|
|
|
|
gst_buffer_resize (codec_data, 0, total);
|
2007-11-15 17:01:32 +00:00
|
|
|
g_strfreev (params);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2007-04-10 17:06:05 +00:00
|
|
|
/* keep the codec_data, we need to send it as the first buffer. We cannot
|
|
|
|
* push it in the adapter because the adapter might be flushed on discont.
|
|
|
|
*/
|
|
|
|
if (rtph264depay->codec_data)
|
|
|
|
gst_buffer_unref (rtph264depay->codec_data);
|
|
|
|
rtph264depay->codec_data = codec_data;
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
} else if (!rtph264depay->byte_stream) {
|
|
|
|
gchar **params;
|
|
|
|
gint i;
|
|
|
|
|
2010-04-16 10:14:26 +00:00
|
|
|
if (ps == NULL)
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
goto incomplete_caps;
|
|
|
|
|
|
|
|
params = g_strsplit (ps, ",", 0);
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
GST_DEBUG_OBJECT (depayload, "we have %d params", g_strv_length (params));
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
|
|
|
|
/* start with 7 bytes header */
|
|
|
|
for (i = 0; params[i]; i++) {
|
2011-07-14 20:23:49 +00:00
|
|
|
GstBuffer *nal;
|
|
|
|
GstMapInfo nalmap;
|
2009-03-18 13:50:17 +00:00
|
|
|
gsize nal_len;
|
|
|
|
guint save = 0;
|
|
|
|
gint state = 0;
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
|
|
|
|
nal_len = strlen (params[i]);
|
2017-03-16 00:41:44 +00:00
|
|
|
if (nal_len == 0) {
|
|
|
|
GST_WARNING_OBJECT (depayload, "empty param '%s' (#%d)", params[i], i);
|
|
|
|
continue;
|
|
|
|
}
|
2011-07-14 20:23:49 +00:00
|
|
|
nal = gst_buffer_new_and_alloc (nal_len);
|
|
|
|
gst_buffer_map (nal, &nalmap, GST_MAP_READWRITE);
|
2009-03-18 13:50:17 +00:00
|
|
|
|
|
|
|
nal_len =
|
2011-07-14 20:23:49 +00:00
|
|
|
g_base64_decode_step (params[i], nal_len, nalmap.data, &state, &save);
|
2010-04-16 10:14:26 +00:00
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
GST_DEBUG_OBJECT (depayload, "adding param %d as %s", i,
|
|
|
|
((nalmap.data[0] & 0x1f) == 7) ? "SPS" : "PPS");
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
gst_buffer_unmap (nal, &nalmap);
|
|
|
|
gst_buffer_set_size (nal, nal_len);
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
|
2013-08-12 19:26:08 +00:00
|
|
|
gst_rtp_h264_depay_add_sps_pps (rtph264depay, nal);
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
}
|
2011-07-14 20:23:49 +00:00
|
|
|
g_strfreev (params);
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
if (rtph264depay->sps->len == 0 || rtph264depay->pps->len == 0)
|
|
|
|
goto incomplete_caps;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
return gst_rtp_h264_set_src_caps (rtph264depay);
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
incomplete_caps:
|
|
|
|
{
|
2011-07-14 20:23:49 +00:00
|
|
|
GST_DEBUG_OBJECT (depayload, "we have incomplete caps,"
|
|
|
|
" doing setcaps later");
|
|
|
|
return TRUE;
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
}
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
|
2017-06-02 23:58:05 +00:00
|
|
|
static GstBuffer *
|
|
|
|
gst_rtp_h264_depay_allocate_output_buffer (GstRtpH264Depay * depay, gsize size)
|
|
|
|
{
|
|
|
|
GstBuffer *buffer = NULL;
|
|
|
|
|
|
|
|
g_return_val_if_fail (size > 0, NULL);
|
|
|
|
|
|
|
|
GST_LOG_OBJECT (depay, "want output buffer of %u bytes", (guint) size);
|
|
|
|
|
|
|
|
buffer = gst_buffer_new_allocate (depay->allocator, size, &depay->params);
|
|
|
|
if (buffer == NULL) {
|
|
|
|
GST_INFO_OBJECT (depay, "couldn't allocate output buffer");
|
|
|
|
buffer = gst_buffer_new_allocate (NULL, size, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
2011-07-18 20:46:27 +00:00
|
|
|
static GstBuffer *
|
|
|
|
gst_rtp_h264_complete_au (GstRtpH264Depay * rtph264depay,
|
|
|
|
GstClockTime * out_timestamp, gboolean * out_keyframe)
|
|
|
|
{
|
2017-06-02 23:58:05 +00:00
|
|
|
GstBufferList *list;
|
|
|
|
GstMapInfo outmap;
|
2011-07-18 20:46:27 +00:00
|
|
|
GstBuffer *outbuf;
|
2017-06-02 23:58:05 +00:00
|
|
|
guint outsize, offset = 0;
|
|
|
|
gint b, n_bufs, m, n_mem;
|
2011-07-18 20:46:27 +00:00
|
|
|
|
|
|
|
/* we had a picture in the adapter and we completed it */
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "taking completed AU");
|
|
|
|
outsize = gst_adapter_available (rtph264depay->picture_adapter);
|
2017-06-02 23:58:05 +00:00
|
|
|
|
|
|
|
outbuf = gst_rtp_h264_depay_allocate_output_buffer (rtph264depay, outsize);
|
|
|
|
|
|
|
|
if (outbuf == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
list = gst_adapter_take_buffer_list (rtph264depay->picture_adapter, outsize);
|
|
|
|
|
|
|
|
n_bufs = gst_buffer_list_length (list);
|
|
|
|
for (b = 0; b < n_bufs; ++b) {
|
|
|
|
GstBuffer *buf = gst_buffer_list_get (list, b);
|
|
|
|
|
|
|
|
n_mem = gst_buffer_n_memory (buf);
|
|
|
|
for (m = 0; m < n_mem; ++m) {
|
|
|
|
GstMemory *mem = gst_buffer_peek_memory (buf, m);
|
|
|
|
gsize mem_size = gst_memory_get_sizes (mem, NULL, NULL);
|
|
|
|
GstMapInfo mem_map;
|
|
|
|
|
|
|
|
if (gst_memory_map (mem, &mem_map, GST_MAP_READ)) {
|
|
|
|
memcpy (outmap.data + offset, mem_map.data, mem_size);
|
|
|
|
gst_memory_unmap (mem, &mem_map);
|
|
|
|
} else {
|
|
|
|
memset (outmap.data + offset, 0, mem_size);
|
|
|
|
}
|
|
|
|
offset += mem_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
gst_rtp_copy_video_meta (rtph264depay, outbuf, buf);
|
|
|
|
}
|
|
|
|
gst_buffer_list_unref (list);
|
|
|
|
gst_buffer_unmap (outbuf, &outmap);
|
2011-07-18 20:46:27 +00:00
|
|
|
|
|
|
|
*out_timestamp = rtph264depay->last_ts;
|
|
|
|
*out_keyframe = rtph264depay->last_keyframe;
|
|
|
|
|
|
|
|
rtph264depay->last_keyframe = FALSE;
|
|
|
|
rtph264depay->picture_start = FALSE;
|
|
|
|
|
|
|
|
return outbuf;
|
|
|
|
}
|
|
|
|
|
2018-12-14 23:19:42 +00:00
|
|
|
static void
|
|
|
|
gst_rtp_h264_depay_push (GstRtpH264Depay * rtph264depay, GstBuffer * outbuf,
|
|
|
|
gboolean keyframe, GstClockTime timestamp, gboolean marker)
|
|
|
|
{
|
|
|
|
/* prepend codec_data */
|
|
|
|
if (rtph264depay->codec_data) {
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "prepending codec_data");
|
|
|
|
gst_rtp_copy_video_meta (rtph264depay, rtph264depay->codec_data, outbuf);
|
|
|
|
outbuf = gst_buffer_append (rtph264depay->codec_data, outbuf);
|
|
|
|
rtph264depay->codec_data = NULL;
|
|
|
|
keyframe = TRUE;
|
|
|
|
}
|
|
|
|
outbuf = gst_buffer_make_writable (outbuf);
|
|
|
|
|
|
|
|
gst_rtp_drop_non_video_meta (rtph264depay, outbuf);
|
|
|
|
|
|
|
|
GST_BUFFER_PTS (outbuf) = timestamp;
|
|
|
|
|
|
|
|
if (keyframe)
|
|
|
|
GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
|
|
|
|
else
|
|
|
|
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
|
|
|
|
|
|
|
|
if (marker)
|
|
|
|
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MARKER);
|
|
|
|
|
|
|
|
gst_rtp_base_depayload_push (GST_RTP_BASE_DEPAYLOAD (rtph264depay), outbuf);
|
|
|
|
}
|
|
|
|
|
2010-09-22 10:37:33 +00:00
|
|
|
/* SPS/PPS/IDR considered key, all others DELTA;
|
|
|
|
* so downstream waiting for keyframe can pick up at SPS/PPS/IDR */
|
|
|
|
#define NAL_TYPE_IS_KEY(nt) (((nt) == 5) || ((nt) == 7) || ((nt) == 8))
|
2010-04-15 10:21:56 +00:00
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
static void
|
2010-09-22 10:37:33 +00:00
|
|
|
gst_rtp_h264_depay_handle_nal (GstRtpH264Depay * rtph264depay, GstBuffer * nal,
|
2011-07-18 20:46:27 +00:00
|
|
|
GstClockTime in_timestamp, gboolean marker)
|
2009-11-26 15:14:30 +00:00
|
|
|
{
|
2011-11-11 11:25:01 +00:00
|
|
|
GstRTPBaseDepayload *depayload = GST_RTP_BASE_DEPAYLOAD (rtph264depay);
|
2009-11-26 15:14:30 +00:00
|
|
|
gint nal_type;
|
2012-01-23 16:25:37 +00:00
|
|
|
GstMapInfo map;
|
2009-11-26 15:14:30 +00:00
|
|
|
GstBuffer *outbuf = NULL;
|
2010-09-22 10:37:33 +00:00
|
|
|
GstClockTime out_timestamp;
|
2010-11-01 13:56:28 +00:00
|
|
|
gboolean keyframe, out_keyframe;
|
2010-09-22 10:37:33 +00:00
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_map (nal, &map, GST_MAP_READ);
|
|
|
|
if (G_UNLIKELY (map.size < 5))
|
2010-09-22 10:37:33 +00:00
|
|
|
goto short_nal;
|
2009-11-26 15:14:30 +00:00
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
nal_type = map.data[4] & 0x1f;
|
2010-09-22 10:37:33 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "handle NAL type %d", nal_type);
|
|
|
|
|
2010-11-01 13:56:28 +00:00
|
|
|
keyframe = NAL_TYPE_IS_KEY (nal_type);
|
2010-09-22 10:37:33 +00:00
|
|
|
|
2010-11-01 13:56:28 +00:00
|
|
|
out_keyframe = keyframe;
|
2010-09-22 10:37:33 +00:00
|
|
|
out_timestamp = in_timestamp;
|
|
|
|
|
2011-07-14 20:23:49 +00:00
|
|
|
if (!rtph264depay->byte_stream) {
|
|
|
|
if (nal_type == 7 || nal_type == 8) {
|
2013-08-12 19:26:08 +00:00
|
|
|
gst_rtp_h264_depay_add_sps_pps (rtph264depay,
|
2011-07-14 20:23:49 +00:00
|
|
|
gst_buffer_copy_region (nal, GST_BUFFER_COPY_ALL,
|
|
|
|
4, gst_buffer_get_size (nal) - 4));
|
|
|
|
gst_buffer_unmap (nal, &map);
|
|
|
|
gst_buffer_unref (nal);
|
2017-05-26 15:30:06 +00:00
|
|
|
return;
|
2011-07-14 20:23:49 +00:00
|
|
|
} else if (rtph264depay->sps->len == 0 || rtph264depay->pps->len == 0) {
|
|
|
|
/* Down push down any buffer in non-bytestream mode if the SPS/PPS haven't
|
|
|
|
* go through yet
|
|
|
|
*/
|
|
|
|
gst_pad_push_event (GST_RTP_BASE_DEPAYLOAD_SINKPAD (depayload),
|
|
|
|
gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM,
|
|
|
|
gst_structure_new ("GstForceKeyUnit",
|
|
|
|
"all-headers", G_TYPE_BOOLEAN, TRUE, NULL)));
|
|
|
|
gst_buffer_unmap (nal, &map);
|
|
|
|
gst_buffer_unref (nal);
|
2017-05-26 15:30:06 +00:00
|
|
|
return;
|
2011-07-14 20:23:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (rtph264depay->new_codec_data &&
|
|
|
|
rtph264depay->sps->len > 0 && rtph264depay->pps->len > 0)
|
|
|
|
gst_rtp_h264_set_src_caps (rtph264depay);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-09-22 10:37:33 +00:00
|
|
|
if (rtph264depay->merge) {
|
|
|
|
gboolean start = FALSE, complete = FALSE;
|
|
|
|
|
2014-04-11 16:19:49 +00:00
|
|
|
/* marker bit isn't mandatory so in the following code we try to guess
|
|
|
|
* an AU boundary by detecting a new picture start */
|
|
|
|
if (!marker) {
|
|
|
|
/* consider a coded slices (IDR or not) to start a picture,
|
|
|
|
* (so ending the previous one) if first_mb_in_slice == 0
|
|
|
|
* (non-0 is part of previous one) */
|
|
|
|
/* NOTE this is not entirely according to Access Unit specs in 7.4.1.2.4,
|
|
|
|
* but in practice it works in sane cases, needs not much parsing,
|
|
|
|
* and also works with broken frame_num in NAL (where spec-wise would fail) */
|
|
|
|
/* FIXME: this code isn't correct for interlaced content as AUs should be
|
|
|
|
* constructed with pairs of fields and the guess here will just push out
|
|
|
|
* AUs with a single field in it */
|
|
|
|
if (nal_type == 1 || nal_type == 2 || nal_type == 5) {
|
|
|
|
/* we have a picture start */
|
|
|
|
start = TRUE;
|
|
|
|
if (map.data[5] & 0x80) {
|
|
|
|
/* first_mb_in_slice == 0 completes a picture */
|
|
|
|
complete = TRUE;
|
|
|
|
}
|
|
|
|
} else if (nal_type >= 6 && nal_type <= 9) {
|
|
|
|
/* SEI, SPS, PPS, AU terminate picture */
|
2010-09-22 10:37:33 +00:00
|
|
|
complete = TRUE;
|
2009-11-26 15:14:30 +00:00
|
|
|
}
|
2014-04-11 16:19:49 +00:00
|
|
|
GST_DEBUG_OBJECT (depayload, "start %d, complete %d", start, complete);
|
2010-09-22 10:37:33 +00:00
|
|
|
|
2014-04-11 16:19:49 +00:00
|
|
|
if (complete && rtph264depay->picture_start)
|
|
|
|
outbuf = gst_rtp_h264_complete_au (rtph264depay, &out_timestamp,
|
|
|
|
&out_keyframe);
|
|
|
|
}
|
2010-09-22 10:37:33 +00:00
|
|
|
/* add to adapter */
|
2012-03-13 16:27:32 +00:00
|
|
|
gst_buffer_unmap (nal, &map);
|
|
|
|
|
2010-09-22 10:37:33 +00:00
|
|
|
GST_DEBUG_OBJECT (depayload, "adding NAL to picture adapter");
|
|
|
|
gst_adapter_push (rtph264depay->picture_adapter, nal);
|
|
|
|
rtph264depay->last_ts = in_timestamp;
|
2010-11-01 13:56:28 +00:00
|
|
|
rtph264depay->last_keyframe |= keyframe;
|
2010-09-22 10:37:33 +00:00
|
|
|
rtph264depay->picture_start |= start;
|
2011-07-18 20:46:27 +00:00
|
|
|
|
|
|
|
if (marker)
|
|
|
|
outbuf = gst_rtp_h264_complete_au (rtph264depay, &out_timestamp,
|
|
|
|
&out_keyframe);
|
2010-09-22 10:37:33 +00:00
|
|
|
} else {
|
|
|
|
/* no merge, output is input nal */
|
|
|
|
GST_DEBUG_OBJECT (depayload, "using NAL as output");
|
|
|
|
outbuf = nal;
|
2012-03-13 16:27:32 +00:00
|
|
|
gst_buffer_unmap (nal, &map);
|
2010-09-22 10:37:33 +00:00
|
|
|
}
|
2009-11-26 15:14:30 +00:00
|
|
|
|
2010-09-22 10:37:33 +00:00
|
|
|
if (outbuf) {
|
2018-12-14 23:19:42 +00:00
|
|
|
gst_rtp_h264_depay_push (rtph264depay, outbuf, out_keyframe, out_timestamp,
|
|
|
|
marker);
|
2009-11-26 15:14:30 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
return;
|
2009-11-26 15:14:30 +00:00
|
|
|
|
2010-09-22 10:37:33 +00:00
|
|
|
/* ERRORS */
|
|
|
|
short_nal:
|
|
|
|
{
|
|
|
|
GST_WARNING_OBJECT (depayload, "dropping short NAL");
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_unmap (nal, &map);
|
2010-09-22 10:37:33 +00:00
|
|
|
gst_buffer_unref (nal);
|
2017-05-26 15:30:06 +00:00
|
|
|
return;
|
2010-09-22 10:37:33 +00:00
|
|
|
}
|
2009-11-26 15:14:30 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
static void
|
|
|
|
gst_rtp_h264_finish_fragmentation_unit (GstRtpH264Depay * rtph264depay)
|
2011-07-27 17:15:20 +00:00
|
|
|
{
|
|
|
|
guint outsize;
|
2012-01-23 16:25:37 +00:00
|
|
|
GstMapInfo map;
|
2011-07-27 17:15:20 +00:00
|
|
|
GstBuffer *outbuf;
|
|
|
|
|
|
|
|
outsize = gst_adapter_available (rtph264depay->adapter);
|
|
|
|
outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize);
|
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
|
2011-07-27 17:15:20 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize);
|
|
|
|
|
|
|
|
if (rtph264depay->byte_stream) {
|
2012-01-23 16:25:37 +00:00
|
|
|
memcpy (map.data, sync_bytes, sizeof (sync_bytes));
|
2011-07-27 17:15:20 +00:00
|
|
|
} else {
|
|
|
|
outsize -= 4;
|
2012-01-23 16:25:37 +00:00
|
|
|
map.data[0] = (outsize >> 24);
|
|
|
|
map.data[1] = (outsize >> 16);
|
|
|
|
map.data[2] = (outsize >> 8);
|
|
|
|
map.data[3] = (outsize);
|
2011-07-27 17:15:20 +00:00
|
|
|
}
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_unmap (outbuf, &map);
|
2011-07-27 17:15:20 +00:00
|
|
|
|
|
|
|
rtph264depay->current_fu_type = 0;
|
2011-09-20 11:38:53 +00:00
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf,
|
2012-07-25 10:49:07 +00:00
|
|
|
rtph264depay->fu_timestamp, rtph264depay->fu_marker);
|
2011-07-27 17:15:20 +00:00
|
|
|
}
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
static GstBuffer *
|
2015-07-12 13:27:15 +00:00
|
|
|
gst_rtp_h264_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp)
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
{
|
|
|
|
GstRtpH264Depay *rtph264depay;
|
2011-09-20 11:38:53 +00:00
|
|
|
GstBuffer *outbuf = NULL;
|
2007-02-16 12:30:22 +00:00
|
|
|
guint8 nal_unit_type;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
rtph264depay = GST_RTP_H264_DEPAY (depayload);
|
|
|
|
|
2007-03-29 14:40:35 +00:00
|
|
|
/* flush remaining data on discont */
|
2015-07-12 13:27:15 +00:00
|
|
|
if (GST_BUFFER_IS_DISCONT (rtp->buffer)) {
|
2007-03-29 14:40:35 +00:00
|
|
|
gst_adapter_clear (rtph264depay->adapter);
|
|
|
|
rtph264depay->wait_start = TRUE;
|
2011-07-27 17:15:20 +00:00
|
|
|
rtph264depay->current_fu_type = 0;
|
2020-09-18 06:09:20 +00:00
|
|
|
rtph264depay->last_fu_seqnum = 0;
|
2007-03-29 14:40:35 +00:00
|
|
|
}
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
{
|
|
|
|
gint payload_len;
|
|
|
|
guint8 *payload;
|
|
|
|
guint header_len;
|
2007-02-16 12:30:22 +00:00
|
|
|
guint8 nal_ref_idc;
|
2012-01-23 16:25:37 +00:00
|
|
|
GstMapInfo map;
|
2007-02-16 12:30:22 +00:00
|
|
|
guint outsize, nalu_size;
|
2010-09-22 10:37:33 +00:00
|
|
|
GstClockTime timestamp;
|
2011-07-18 20:46:27 +00:00
|
|
|
gboolean marker;
|
2009-11-26 15:14:30 +00:00
|
|
|
|
2015-07-12 13:27:15 +00:00
|
|
|
timestamp = GST_BUFFER_PTS (rtp->buffer);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2015-07-12 13:27:15 +00:00
|
|
|
payload_len = gst_rtp_buffer_get_payload_len (rtp);
|
|
|
|
payload = gst_rtp_buffer_get_payload (rtp);
|
|
|
|
marker = gst_rtp_buffer_get_marker (rtp);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "receiving %d bytes", payload_len);
|
|
|
|
|
2010-11-26 14:00:29 +00:00
|
|
|
if (payload_len == 0)
|
2012-03-13 18:26:23 +00:00
|
|
|
goto empty_packet;
|
2010-11-26 14:00:29 +00:00
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
/* +---------------+
|
|
|
|
* |0|1|2|3|4|5|6|7|
|
|
|
|
* +-+-+-+-+-+-+-+-+
|
|
|
|
* |F|NRI| Type |
|
|
|
|
* +---------------+
|
|
|
|
*
|
|
|
|
* F must be 0.
|
|
|
|
*/
|
|
|
|
nal_ref_idc = (payload[0] & 0x60) >> 5;
|
|
|
|
nal_unit_type = payload[0] & 0x1f;
|
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
/* at least one byte header with type */
|
|
|
|
header_len = 1;
|
|
|
|
|
2018-09-24 19:27:41 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "NRI %d, Type %d %s", nal_ref_idc,
|
|
|
|
nal_unit_type, marker ? "marker" : "");
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2011-07-27 17:15:20 +00:00
|
|
|
/* If FU unit was being processed, but the current nal is of a different
|
|
|
|
* type. Assume that the remote payloader is buggy (didn't set the end bit
|
|
|
|
* when the FU ended) and send out what we gathered thusfar */
|
|
|
|
if (G_UNLIKELY (rtph264depay->current_fu_type != 0 &&
|
|
|
|
nal_unit_type != rtph264depay->current_fu_type))
|
2017-05-26 15:30:06 +00:00
|
|
|
gst_rtp_h264_finish_fragmentation_unit (rtph264depay);
|
2011-07-27 17:15:20 +00:00
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
switch (nal_unit_type) {
|
|
|
|
case 0:
|
|
|
|
case 30:
|
|
|
|
case 31:
|
|
|
|
/* undefined */
|
|
|
|
goto undefined_type;
|
|
|
|
case 25:
|
|
|
|
/* STAP-B Single-time aggregation packet 5.7.1 */
|
2007-02-16 12:30:22 +00:00
|
|
|
/* 2 byte extra header for DON */
|
|
|
|
header_len += 2;
|
|
|
|
/* fallthrough */
|
|
|
|
case 24:
|
|
|
|
{
|
|
|
|
/* strip headers */
|
|
|
|
payload += header_len;
|
|
|
|
payload_len -= header_len;
|
|
|
|
|
2007-03-29 14:40:35 +00:00
|
|
|
rtph264depay->wait_start = FALSE;
|
|
|
|
|
2007-04-10 17:06:05 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
/* STAP-A Single-time aggregation packet 5.7.1 */
|
|
|
|
while (payload_len > 2) {
|
2019-01-27 02:01:08 +00:00
|
|
|
gboolean last = FALSE;
|
|
|
|
|
2016-02-17 13:26:02 +00:00
|
|
|
/* 1
|
|
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
|
2007-02-16 12:30:22 +00:00
|
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
* | NALU Size |
|
|
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
*/
|
|
|
|
nalu_size = (payload[0] << 8) | payload[1];
|
|
|
|
|
2019-09-02 12:27:35 +00:00
|
|
|
/* don't include nalu_size */
|
2010-06-11 06:36:33 +00:00
|
|
|
if (nalu_size > (payload_len - 2))
|
|
|
|
nalu_size = payload_len - 2;
|
2007-02-16 12:30:22 +00:00
|
|
|
|
|
|
|
outsize = nalu_size + sizeof (sync_bytes);
|
|
|
|
outbuf = gst_buffer_new_and_alloc (outsize);
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
if (rtph264depay->byte_stream) {
|
2012-01-23 16:25:37 +00:00
|
|
|
memcpy (map.data, sync_bytes, sizeof (sync_bytes));
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
} else {
|
2012-01-23 16:25:37 +00:00
|
|
|
map.data[0] = map.data[1] = 0;
|
|
|
|
map.data[2] = payload[0];
|
|
|
|
map.data[3] = payload[1];
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* strip NALU size */
|
|
|
|
payload += 2;
|
|
|
|
payload_len -= 2;
|
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
memcpy (map.data + sizeof (sync_bytes), payload, nalu_size);
|
|
|
|
gst_buffer_unmap (outbuf, &map);
|
2007-02-16 12:30:22 +00:00
|
|
|
|
2017-05-24 11:57:10 +00:00
|
|
|
gst_rtp_copy_video_meta (rtph264depay, outbuf, rtp->buffer);
|
2015-08-04 17:59:17 +00:00
|
|
|
|
2019-01-27 02:01:08 +00:00
|
|
|
if (payload_len - nalu_size <= 2)
|
|
|
|
last = TRUE;
|
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, timestamp,
|
2019-01-27 02:01:08 +00:00
|
|
|
marker && last);
|
2007-02-16 12:30:22 +00:00
|
|
|
|
|
|
|
payload += nalu_size;
|
|
|
|
payload_len -= nalu_size;
|
|
|
|
}
|
2010-04-07 13:06:54 +00:00
|
|
|
break;
|
2007-02-16 12:30:22 +00:00
|
|
|
}
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
case 26:
|
|
|
|
/* MTAP16 Multi-time aggregation packet 5.7.2 */
|
2015-03-09 16:22:29 +00:00
|
|
|
// header_len = 5;
|
2008-05-14 18:28:46 +00:00
|
|
|
/* fallthrough, not implemented */
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
case 27:
|
|
|
|
/* MTAP24 Multi-time aggregation packet 5.7.2 */
|
2015-03-09 16:22:29 +00:00
|
|
|
// header_len = 6;
|
2006-08-17 15:47:28 +00:00
|
|
|
goto not_implemented;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
break;
|
|
|
|
case 28:
|
|
|
|
case 29:
|
|
|
|
{
|
|
|
|
/* FU-A Fragmentation unit 5.8 */
|
|
|
|
/* FU-B Fragmentation unit 5.8 */
|
|
|
|
gboolean S, E;
|
|
|
|
|
|
|
|
/* +---------------+
|
|
|
|
* |0|1|2|3|4|5|6|7|
|
|
|
|
* +-+-+-+-+-+-+-+-+
|
|
|
|
* |S|E|R| Type |
|
|
|
|
* +---------------+
|
|
|
|
*
|
|
|
|
* R is reserved and always 0
|
|
|
|
*/
|
|
|
|
S = (payload[1] & 0x80) == 0x80;
|
|
|
|
E = (payload[1] & 0x40) == 0x40;
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "S %d, E %d", S, E);
|
|
|
|
|
2007-03-29 14:40:35 +00:00
|
|
|
if (rtph264depay->wait_start && !S)
|
|
|
|
goto waiting_start;
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
if (S) {
|
|
|
|
/* NAL unit starts here */
|
2007-02-16 12:30:22 +00:00
|
|
|
guint8 nal_header;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2011-07-27 17:15:20 +00:00
|
|
|
/* If a new FU unit started, while still processing an older one.
|
|
|
|
* Assume that the remote payloader is buggy (doesn't set the end
|
|
|
|
* bit) and send out what we've gathered thusfar */
|
|
|
|
if (G_UNLIKELY (rtph264depay->current_fu_type != 0))
|
2017-05-26 15:30:06 +00:00
|
|
|
gst_rtp_h264_finish_fragmentation_unit (rtph264depay);
|
2011-07-27 17:15:20 +00:00
|
|
|
|
|
|
|
rtph264depay->current_fu_type = nal_unit_type;
|
|
|
|
rtph264depay->fu_timestamp = timestamp;
|
2020-09-18 06:09:20 +00:00
|
|
|
rtph264depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
|
2011-07-27 17:15:20 +00:00
|
|
|
|
2007-03-29 14:40:35 +00:00
|
|
|
rtph264depay->wait_start = FALSE;
|
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
/* reconstruct NAL header */
|
|
|
|
nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f);
|
|
|
|
|
|
|
|
/* strip type header, keep FU header, we'll reuse it to reconstruct
|
|
|
|
* the NAL header. */
|
|
|
|
payload += 1;
|
|
|
|
payload_len -= 1;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
nalu_size = payload_len;
|
|
|
|
outsize = nalu_size + sizeof (sync_bytes);
|
|
|
|
outbuf = gst_buffer_new_and_alloc (outsize);
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
|
|
|
|
memcpy (map.data + sizeof (sync_bytes), payload, nalu_size);
|
|
|
|
map.data[sizeof (sync_bytes)] = nal_header;
|
|
|
|
gst_buffer_unmap (outbuf, &map);
|
2007-02-16 12:30:22 +00:00
|
|
|
|
2017-05-24 11:57:10 +00:00
|
|
|
gst_rtp_copy_video_meta (rtph264depay, outbuf, rtp->buffer);
|
2015-08-04 17:59:17 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
/* and assemble in the adapter */
|
|
|
|
gst_adapter_push (rtph264depay->adapter, outbuf);
|
|
|
|
} else {
|
2020-09-18 06:09:20 +00:00
|
|
|
if (rtph264depay->current_fu_type == 0) {
|
|
|
|
/* previous FU packet missing start bit? */
|
|
|
|
GST_WARNING_OBJECT (rtph264depay, "missing FU start bit on an "
|
|
|
|
"earlier packet. Dropping.");
|
|
|
|
gst_adapter_clear (rtph264depay->adapter);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (gst_rtp_buffer_compare_seqnum (rtph264depay->last_fu_seqnum,
|
|
|
|
gst_rtp_buffer_get_seq (rtp)) != 1) {
|
|
|
|
/* jump in sequence numbers within an FU is cause for discarding */
|
|
|
|
GST_WARNING_OBJECT (rtph264depay, "Jump in sequence numbers from "
|
|
|
|
"%u to %u within Fragmentation Unit. Data was lost, dropping "
|
|
|
|
"stored.", rtph264depay->last_fu_seqnum,
|
|
|
|
gst_rtp_buffer_get_seq (rtp));
|
|
|
|
gst_adapter_clear (rtph264depay->adapter);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
rtph264depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
|
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
/* strip off FU indicator and FU header bytes */
|
|
|
|
payload += 2;
|
|
|
|
payload_len -= 2;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
outsize = payload_len;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
outbuf = gst_buffer_new_and_alloc (outsize);
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_fill (outbuf, 0, payload, outsize);
|
2007-02-16 12:30:22 +00:00
|
|
|
|
2017-05-24 11:57:10 +00:00
|
|
|
gst_rtp_copy_video_meta (rtph264depay, outbuf, rtp->buffer);
|
2015-08-04 17:59:17 +00:00
|
|
|
|
2007-02-16 12:30:22 +00:00
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
/* and assemble in the adapter */
|
|
|
|
gst_adapter_push (rtph264depay->adapter, outbuf);
|
|
|
|
}
|
|
|
|
|
2011-09-20 11:38:53 +00:00
|
|
|
outbuf = NULL;
|
2011-07-27 17:15:20 +00:00
|
|
|
rtph264depay->fu_marker = marker;
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2011-07-27 17:15:20 +00:00
|
|
|
/* if NAL unit ends, flush the adapter */
|
|
|
|
if (E)
|
2017-05-26 15:30:06 +00:00
|
|
|
gst_rtp_h264_finish_fragmentation_unit (rtph264depay);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
2007-03-29 14:40:35 +00:00
|
|
|
rtph264depay->wait_start = FALSE;
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
/* 1-23 NAL unit Single NAL unit packet per H.264 5.6 */
|
|
|
|
/* the entire payload is the output buffer */
|
2007-02-16 12:30:22 +00:00
|
|
|
nalu_size = payload_len;
|
|
|
|
outsize = nalu_size + sizeof (sync_bytes);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
outbuf = gst_buffer_new_and_alloc (outsize);
|
2011-06-13 14:33:46 +00:00
|
|
|
|
2012-01-23 16:25:37 +00:00
|
|
|
gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
if (rtph264depay->byte_stream) {
|
2012-01-23 16:25:37 +00:00
|
|
|
memcpy (map.data, sync_bytes, sizeof (sync_bytes));
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
} else {
|
2012-01-23 16:25:37 +00:00
|
|
|
map.data[0] = map.data[1] = 0;
|
|
|
|
map.data[2] = nalu_size >> 8;
|
|
|
|
map.data[3] = nalu_size & 0xff;
|
gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist...
Original commit message from CVS:
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init),
(gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps),
(gst_rtp_h264_depay_process):
* gst/rtp/gstrtph264depay.h:
Add experimental support for outputting quicktime-like AVC output in
addition to the existing bytestream output.
* gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type),
(gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init),
(gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal),
(gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property),
(gst_rtp_h264_pay_get_property):
* gst/rtp/gstrtph264pay.h:
Make the parsing mode configurable, for some inputs we don't need to
scan every byte for start codes.
Only set the marker bit on ACCESS units.
2008-05-20 11:33:05 +00:00
|
|
|
}
|
2012-01-23 16:25:37 +00:00
|
|
|
memcpy (map.data + sizeof (sync_bytes), payload, nalu_size);
|
|
|
|
gst_buffer_unmap (outbuf, &map);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
2017-05-24 11:57:10 +00:00
|
|
|
gst_rtp_copy_video_meta (rtph264depay, outbuf, rtp->buffer);
|
2015-08-04 17:59:17 +00:00
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, timestamp, marker);
|
2010-09-22 10:37:33 +00:00
|
|
|
break;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-26 15:30:06 +00:00
|
|
|
return NULL;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
2012-03-13 18:26:23 +00:00
|
|
|
empty_packet:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "empty packet");
|
|
|
|
return NULL;
|
|
|
|
}
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
undefined_type:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE,
|
2007-02-16 12:30:22 +00:00
|
|
|
(NULL), ("Undefined packet type"));
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2007-03-29 14:40:35 +00:00
|
|
|
waiting_start:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (rtph264depay, "waiting for start");
|
|
|
|
return NULL;
|
|
|
|
}
|
2006-08-17 15:47:28 +00:00
|
|
|
not_implemented:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (rtph264depay, STREAM, FORMAT,
|
2007-02-16 12:30:22 +00:00
|
|
|
(NULL), ("NAL unit type %d not supported yet", nal_unit_type));
|
2006-08-17 15:47:28 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|
|
|
|
|
2011-07-18 12:24:48 +00:00
|
|
|
static gboolean
|
2011-11-11 11:25:01 +00:00
|
|
|
gst_rtp_h264_depay_handle_event (GstRTPBaseDepayload * depay, GstEvent * event)
|
2011-07-18 12:24:48 +00:00
|
|
|
{
|
|
|
|
GstRtpH264Depay *rtph264depay;
|
|
|
|
|
|
|
|
rtph264depay = GST_RTP_H264_DEPAY (depay);
|
|
|
|
|
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
2017-06-02 20:27:40 +00:00
|
|
|
gst_rtp_h264_depay_reset (rtph264depay, FALSE);
|
2011-07-18 12:24:48 +00:00
|
|
|
break;
|
2018-12-17 21:48:53 +00:00
|
|
|
case GST_EVENT_EOS:
|
|
|
|
gst_rtp_h264_depay_drain (rtph264depay);
|
|
|
|
break;
|
2011-07-18 12:24:48 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
2011-11-11 11:25:01 +00:00
|
|
|
GST_RTP_BASE_DEPAYLOAD_CLASS (parent_class)->handle_event (depay, event);
|
2011-07-18 12:24:48 +00:00
|
|
|
}
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
static GstStateChangeReturn
|
|
|
|
gst_rtp_h264_depay_change_state (GstElement * element,
|
|
|
|
GstStateChange transition)
|
|
|
|
{
|
|
|
|
GstRtpH264Depay *rtph264depay;
|
|
|
|
GstStateChangeReturn ret;
|
|
|
|
|
|
|
|
rtph264depay = GST_RTP_H264_DEPAY (element);
|
|
|
|
|
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
|
|
|
break;
|
|
|
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
2017-06-02 20:27:40 +00:00
|
|
|
gst_rtp_h264_depay_reset (rtph264depay, TRUE);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
|
|
|
|
|
|
|
switch (transition) {
|
2017-06-02 20:27:40 +00:00
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
|
|
|
gst_rtp_h264_depay_reset (rtph264depay, TRUE);
|
|
|
|
break;
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
gst_rtp_h264_depay_plugin_init (GstPlugin * plugin)
|
|
|
|
{
|
2013-08-16 15:10:31 +00:00
|
|
|
GST_DEBUG_CATEGORY_INIT (rtph264depay_debug, "rtph264depay", 0,
|
|
|
|
"H264 Video RTP Depayloader");
|
|
|
|
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
return gst_element_register (plugin, "rtph264depay",
|
2010-12-21 15:49:28 +00:00
|
|
|
GST_RANK_SECONDARY, GST_TYPE_RTP_H264_DEPAY);
|
gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP.
Original commit message from CVS:
* gst/rtp/gstrtpamrdepay.c:
* gst/rtp/gstrtpmp4gdepay.c:
Caps extra properties must be defined as strings for
depayloaders because they are generated from an SDP.
* gst/rtp/Makefile.am:
* gst/rtp/gstrtp.c: (plugin_init):
* gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init),
(gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init),
(gst_rtp_h264_depay_finalize), (decode_base64),
(gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process),
(gst_rtp_h264_depay_set_property),
(gst_rtp_h264_depay_get_property),
(gst_rtp_h264_depay_change_state),
(gst_rtp_h264_depay_plugin_init):
* gst/rtp/gstrtph264depay.h:
Added basic, not completely functional RFC 3984 H264 depayloader.
2006-08-16 10:05:00 +00:00
|
|
|
}
|