[vlc-devel] [PATCH 1/2] Added a simple module heavily based upon the udp access module It decoms MPEG TS over iNet-X which is used in the FTI networks
Diarmuid Collins
diarmuid.m.collins at gmail.com
Mon Apr 29 16:41:07 CEST 2013
From: Diarmuid Collins <dcollins at curtisswright.com>
---
modules/access/Modules.am | 6 ++
modules/access/inetx.c | 242 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 248 insertions(+)
mode change 100644 => 100755 modules/access/Modules.am
create mode 100755 modules/access/inetx.c
diff --git a/modules/access/Modules.am b/modules/access/Modules.am
old mode 100644
new mode 100755
index 8a571e7..ce67c87
--- a/modules/access/Modules.am
+++ b/modules/access/Modules.am
@@ -322,3 +322,9 @@ libaccess_realrtsp_plugin_la_CFLAGS = $(AM_CFLAGS)
libaccess_realrtsp_plugin_la_LIBADD = $(AM_LIBADD) $(SOCKET_LIBS)
libvlc_LTLIBRARIES += $(LTLIBaccess_realrtsp)
EXTRA_LTLIBRARIES += libaccess_realrtsp_plugin.la
+
+libaccess_inetx_plugin_la_SOURCES = \
+ inetx.c
+libaccess_inetx_plugin_la_CFLAGS = $(AM_CFLAGS)
+libaccess_inetx_plugin_la_LIBADD = $(AM_LIBADD) $(SOCKET_LIBS)
+libvlc_LTLIBRARIES += libaccess_inetx_plugin.la
\ No newline at end of file
diff --git a/modules/access/inetx.c b/modules/access/inetx.c
new file mode 100755
index 0000000..f3211c9
--- /dev/null
+++ b/modules/access/inetx.c
@@ -0,0 +1,242 @@
+/*****************************************************************************
+ * inetx.c: raw iNetX input module
+ *****************************************************************************
+ * Copyright (C) 2001-2005 VLC authors and VideoLAN
+ * Copyright (C) 2007 Remi Denis-Courmont
+ * Copyright (C) 2013 Diarmuid Collins
+ * $Id$
+ *
+ * Authors: Christophe Massiot <massiot at via.ecp.fr>
+ * Tristan Leteurtre <tooney at via.ecp.fr>
+ * Laurent Aimar <fenrir at via.ecp.fr>
+ * Jean-Paul Saman <jpsaman #_at_# m2x dot nl>
+ * Remi Denis-Courmont
+ * Diarmuid Collins <dcollins at curtisswright.com>
+ *
+ * Reviewed: 23 October 2003, Jean-Paul Saman <jpsaman _at_ videolan _dot_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+ /*****************************************************************************
+ * This module is very heavily based upon the UDP module as the starting point
+ * iNETX is a protocol for use in networked data acquisition systems. MPEG can
+ * be carried over this protocol
+ * http://en.wikipedia.org/wiki/Bus_monitoring#Packetizer_bus_monitor
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_access.h>
+#include <vlc_network.h>
+
+#define MTU 65535
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+static int Open ( vlc_object_t * );
+static void Close( vlc_object_t * );
+
+vlc_module_begin ()
+ set_shortname( N_("INETX" ) )
+ set_description( N_("iNet-X input") )
+ set_category( CAT_INPUT )
+ set_subcategory( SUBCAT_INPUT_ACCESS )
+
+ add_obsolete_integer( "server-port" ) /* since 2.0.0 */
+
+ set_capability( "access", 0 )
+ add_shortcut( "inetx", "inetxstream" )
+
+ set_callbacks( Open, Close )
+vlc_module_end ()
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static block_t *BlockINETX( access_t * );
+static int Control( access_t *, int, va_list );
+
+/*****************************************************************************
+ * Open: open the socket
+ *****************************************************************************/
+static int Open( vlc_object_t *p_this )
+{
+ access_t *p_access = (access_t*)p_this;
+
+ char *psz_name = strdup( p_access->psz_location );
+ char *psz_parser;
+ const char *psz_server_addr, *psz_bind_addr = "";
+ int i_bind_port = 1234, i_server_port = 0;
+ int fd;
+
+ /* Set up p_access */
+ access_InitFields( p_access );
+ ACCESS_SET_CALLBACKS( NULL, BlockINETX, Control, NULL );
+
+ /* Parse psz_name syntax :
+ * [serveraddr[:serverport]][@[bindaddr]:[bindport]] */
+ psz_parser = strchr( psz_name, '@' );
+ if( psz_parser != NULL )
+ {
+ /* Found bind address and/or bind port */
+ *psz_parser++ = '\0';
+ psz_bind_addr = psz_parser;
+
+ if( psz_bind_addr[0] == '[' )
+ /* skips bracket'd IPv6 address */
+ psz_parser = strchr( psz_parser, ']' );
+
+ if( psz_parser != NULL )
+ {
+ psz_parser = strchr( psz_parser, ':' );
+ if( psz_parser != NULL )
+ {
+ *psz_parser++ = '\0';
+ i_bind_port = atoi( psz_parser );
+ }
+ }
+ }
+
+ psz_server_addr = psz_name;
+ psz_parser = ( psz_server_addr[0] == '[' )
+ ? strchr( psz_name, ']' ) /* skips bracket'd IPv6 address */
+ : psz_name;
+
+ if( psz_parser != NULL )
+ {
+ psz_parser = strchr( psz_parser, ':' );
+ if( psz_parser != NULL )
+ {
+ *psz_parser++ = '\0';
+ i_server_port = atoi( psz_parser );
+ }
+ }
+
+ msg_Dbg( p_access, "opening server=%s:%d local=%s:%d",
+ psz_server_addr, i_server_port, psz_bind_addr, i_bind_port );
+
+ fd = net_OpenDgram( p_access, psz_bind_addr, i_bind_port,
+ psz_server_addr, i_server_port, IPPROTO_UDP );
+ free (psz_name);
+ if( fd == -1 )
+ {
+ msg_Err( p_access, "cannot open socket" );
+ return VLC_EGENERIC;
+ }
+ p_access->p_sys = (void *)(intptr_t)fd;
+
+ return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * Close: free unused data structures
+ *****************************************************************************/
+static void Close( vlc_object_t *p_this )
+{
+ access_t *p_access = (access_t*)p_this;
+
+ net_Close( (intptr_t)p_access->p_sys );
+}
+
+/*****************************************************************************
+ * Control:
+ *****************************************************************************/
+static int Control( access_t *p_access, int i_query, va_list args )
+{
+ bool *pb_bool;
+ int64_t *pi_64;
+
+ switch( i_query )
+ {
+ /* */
+ case ACCESS_CAN_SEEK:
+ case ACCESS_CAN_FASTSEEK:
+ case ACCESS_CAN_PAUSE:
+ case ACCESS_CAN_CONTROL_PACE:
+ pb_bool = (bool*)va_arg( args, bool* );
+ *pb_bool = false;
+ break;
+ /* */
+ case ACCESS_GET_PTS_DELAY:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = INT64_C(1000)
+ * var_InheritInteger(p_access, "network-caching");
+ break;
+
+ /* */
+ case ACCESS_SET_PAUSE_STATE:
+ case ACCESS_GET_TITLE_INFO:
+ case ACCESS_SET_TITLE:
+ case ACCESS_SET_SEEKPOINT:
+ case ACCESS_SET_PRIVATE_ID_STATE:
+ case ACCESS_GET_CONTENT_TYPE:
+ return VLC_EGENERIC;
+
+ default:
+ msg_Warn( p_access, "unimplemented query in control" );
+ return VLC_EGENERIC;
+
+ }
+ return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * BlockINETX:
+ *****************************************************************************/
+static block_t *BlockINETX( access_t *p_access )
+{
+ access_sys_t *p_sys = p_access->p_sys;
+ block_t *p_block;
+ ssize_t len;
+
+ /* The iNET-X header contains stream ids, sequence numbers and PTP timestamps*
+ * For the moment these headers will be ignore and we pick out the raw MPEG ts
+ * which is offset INETX_HDR_LEN bytes into the UDP payload
+ */
+ const int INETX_HDR_LEN = 28;
+
+ if( p_access->info.b_eof )
+ return NULL;
+
+ /* Read data */
+ p_block = block_Alloc( MTU - INETX_HDR_LEN );
+ char * temp = malloc(MTU);
+ len = net_Read( p_access, (intptr_t)p_sys, NULL,
+ temp, MTU, false );
+
+ for (int i = INETX_HDR_LEN ; i < MTU ; ++i)
+ {
+ // strip out the first INETX_HDR_LEN bytes from the UDP payload
+ p_block->p_buffer[i - INETX_HDR_LEN] = temp[i];
+ }
+ free(temp);
+
+ if( len < 0 )
+ {
+ block_Release( p_block );
+ return NULL;
+ }
+ return block_Realloc( p_block, 0, len-INETX_HDR_LEN );
+}
--
1.7.9.5
More information about the vlc-devel
mailing list