gstreamer/gst/rtp/gstrtp.c
Stian Selnes ef8d630a59 rtp: add H.261 RTP payloader and depayloader
Implementation according to RFC 4587.

Payloader create fragments on MB boundaries in order to match MTU size
the best it can. Some decoders/depayloaders in the wild are very strict
about receiving a continuous bit-stream (e.g. no no-op bits between
frames), so the payloader will shift the compressed bit-stream of a
frame to align with the last significant bit of the previous frame.

Depayloader does not try to be fancy in case of packet loss. It simply
drops all packets for a frame if there is a loss, keeping it simple.

https://bugzilla.gnome.org/show_bug.cgi?id=751886
2015-07-03 11:48:41 +01:00

351 lines
8.3 KiB
C

/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/tag/tag.h>
#include "gstrtpac3depay.h"
#include "gstrtpac3pay.h"
#include "gstrtpbvdepay.h"
#include "gstrtpbvpay.h"
#include "gstrtpceltdepay.h"
#include "gstrtpceltpay.h"
#include "gstrtpdvdepay.h"
#include "gstrtpdvpay.h"
#include "gstrtpgstdepay.h"
#include "gstrtpgstpay.h"
#include "gstrtpilbcdepay.h"
#include "gstrtpilbcpay.h"
#include "gstrtppcmupay.h"
#include "gstrtppcmapay.h"
#include "gstrtppcmadepay.h"
#include "gstrtppcmudepay.h"
#include "gstrtpg722depay.h"
#include "gstrtpg722pay.h"
#include "gstrtpg723depay.h"
#include "gstrtpg723pay.h"
#include "gstrtpg726depay.h"
#include "gstrtpg726pay.h"
#include "gstrtpg729depay.h"
#include "gstrtpg729pay.h"
#include "gstrtpgsmpay.h"
#include "gstrtpgsmdepay.h"
#include "gstrtpamrpay.h"
#include "gstrtpamrdepay.h"
#include "gstrtpmpapay.h"
#include "gstrtpmpadepay.h"
#include "gstrtpmparobustdepay.h"
#include "gstrtpmpvdepay.h"
#include "gstrtpmpvpay.h"
#include "gstrtph261pay.h"
#include "gstrtph261depay.h"
#include "gstrtph263pdepay.h"
#include "gstrtph263ppay.h"
#include "gstrtph263depay.h"
#include "gstrtph263pay.h"
#include "gstrtph264depay.h"
#include "gstrtph264pay.h"
#include "gstrtpj2kdepay.h"
#include "gstrtpj2kpay.h"
#include "gstrtpjpegdepay.h"
#include "gstrtpjpegpay.h"
#include "gstrtpL16depay.h"
#include "gstrtpL16pay.h"
#include "gstrtpL24depay.h"
#include "gstrtpL24pay.h"
#include "gstasteriskh263.h"
#include "gstrtpmp1sdepay.h"
#include "gstrtpmp2tdepay.h"
#include "gstrtpmp2tpay.h"
#include "gstrtpmp4vdepay.h"
#include "gstrtpmp4vpay.h"
#include "gstrtpmp4adepay.h"
#include "gstrtpmp4apay.h"
#include "gstrtpmp4gdepay.h"
#include "gstrtpmp4gpay.h"
#include "gstrtpqcelpdepay.h"
#include "gstrtpqdmdepay.h"
#include "gstrtpsbcdepay.h"
#include "gstrtpsbcpay.h"
#include "gstrtpsirenpay.h"
#include "gstrtpsirendepay.h"
#include "gstrtpspeexpay.h"
#include "gstrtpspeexdepay.h"
#include "gstrtpsv3vdepay.h"
#include "gstrtptheoradepay.h"
#include "gstrtptheorapay.h"
#include "gstrtpvorbisdepay.h"
#include "gstrtpvorbispay.h"
#include "gstrtpvp8depay.h"
#include "gstrtpvp8pay.h"
#include "gstrtpvrawdepay.h"
#include "gstrtpvrawpay.h"
#include "gstrtpstreampay.h"
#include "gstrtpstreamdepay.h"
static gboolean
plugin_init (GstPlugin * plugin)
{
gst_tag_image_type_get_type ();
if (!gst_rtp_ac3_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_ac3_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_bv_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_bv_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_celt_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_celt_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_dv_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_dv_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_gst_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_gst_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_ilbc_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_ilbc_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g722_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g722_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g723_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g723_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g726_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g726_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g729_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_g729_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_gsm_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_gsm_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_amr_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_amr_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_pcma_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_pcmu_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_pcmu_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_pcma_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mpa_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mpa_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mpa_robust_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mpv_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mpv_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h261_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h261_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h263p_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h263p_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h263_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h263_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h264_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_h264_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_j2k_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_j2k_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_jpeg_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_jpeg_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_L16_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_L16_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_L24_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_L24_depay_plugin_init (plugin))
return FALSE;
if (!gst_asteriskh263_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp1s_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp2t_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp2t_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp4v_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp4v_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp4a_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp4a_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp4g_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_mp4g_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_qcelp_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_qdm2_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_sbc_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_sbc_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_siren_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_siren_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_speex_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_speex_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_sv3v_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_theora_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_theora_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_vorbis_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_vorbis_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_vp8_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_vp8_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_vraw_depay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_vraw_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_stream_pay_plugin_init (plugin))
return FALSE;
if (!gst_rtp_stream_depay_plugin_init (plugin))
return FALSE;
return TRUE;
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
rtp,
"Real-time protocol plugins",
plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);