[vlc-devel] [PATCH 1/1] -Squashed Commits

Diarmuid Collins diarmuid.m.collins at gmail.com
Wed May 8 15:09:42 CEST 2013


---
 modules/access/Modules.am |    6 ++
 modules/access/inetx.c    |  212 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 218 insertions(+)
 create mode 100755 modules/access/inetx.c

diff --git a/modules/access/Modules.am b/modules/access/Modules.am
index 8a571e7..ce67c87 100644
--- 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..1747b1b
--- /dev/null
+++ b/modules/access/inetx.c
@@ -0,0 +1,212 @@
+/*****************************************************************************
+ * inetx.c: raw iNetX input module
+ *****************************************************************************
+ * Copyright (C) 2013 Diarmuid Collins
+ * $Id$
+ *
+ * Authors: Diarmuid Collins <dcollins at curtisswright.com>
+ *
+ *
+ * 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 1472
+
+/*****************************************************************************
+ * 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 )
+
+    set_capability( "access", 0 )
+    add_shortcut( "inetx", "inetxstream" )
+
+    set_callbacks( Open, Close )
+vlc_module_end ()
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static block_t *Block( 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, Block, 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 );
+            }
+        }
+    }
+
+    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;
+}
+
+/*****************************************************************************
+ * Block:
+ *****************************************************************************/
+static block_t *Block( 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;
+
+    /* Read data */
+    p_block = block_Alloc( MTU - INETX_HDR_LEN );
+
+    len = net_Read( p_access, (intptr_t)p_sys, NULL,
+                    p_block->p_buffer, MTU, false );
+
+    // Offset the buffer by the iNetX header
+    p_block->p_buffer += INETX_HDR_LEN;
+    p_block->i_buffer -= INETX_HDR_LEN;
+
+
+    if( len < INETX_HDR_LEN)
+    {
+        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