--- /dev/null
+/* BlackMagic SDI driver */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_input.h>
+#include <vlc_demux.h>
+#include <vlc_access.h>
+#include <vlc_picture.h>
+#include <vlc_charset.h>
+#include <vlc_fs.h>
+
+static int Open ( vlc_object_t * );
+static void Close( vlc_object_t * );
+
+#define CACHING_TEXT N_("Caching value in ms")
+#define CACHING_LONGTEXT N_( \
+ "Caching value for SDI captures. This " \
+ "value should be set in milliseconds." )
+
+vlc_module_begin ()
+ set_shortname( N_("SDI") )
+ set_description( N_("BlackMagic SDI input") )
+ set_category( CAT_INPUT )
+ set_subcategory( SUBCAT_INPUT_ACCESS )
+
+ add_shortcut( "sdi" )
+ set_capability( "access_demux", 10 )
+ set_callbacks( Open, Close )
+vlc_module_end ()
+
+static int Demux ( demux_t * );
+static int Control( demux_t *, int, va_list );
+
+struct demux_sys_t
+{
+};
+
+static int Open( vlc_object_t *p_this )
+{
+ demux_t *p_demux = (demux_t*)p_this;
+ demux_sys_t *p_sys;
+
+ /* Only when selected */
+ if( *p_demux->psz_access == '\0' )
+ return VLC_EGENERIC;
+
+ /* Set up p_demux */
+ p_demux->pf_demux = Demux;
+ p_demux->pf_control = Control;
+ p_demux->info.i_update = 0;
+ p_demux->info.i_title = 0;
+ p_demux->info.i_seekpoint = 0;
+ p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) );
+ if( !p_sys )
+ return VLC_ENOMEM;
+
+ msg_Debug( p_demux, "hello world" );
+
+ /* Declare elementary streams */
+ es_format_t fmt;
+ es_format_Init( &fmt, VIDEO_ES, p_sys->i_fourcc );
+ fmt.video.i_width = 720;
+ fmt.video.i_height = 576;
+ fmt.video.i_sar_num = 1;
+ fmt.video.i_sar_den = 1;
+
+ msg_Dbg( p_demux, "added new video es %4.4s %dx%d",
+ (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height );
+ p_sys->p_es = es_out_Add( p_demux->out, &fmt );
+
+ /* Update default_pts to a suitable value for access */
+ var_Create( p_demux, "sdi-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+
+ return VLC_SUCCESS;
+}
+
+static void Close( vlc_object_t *p_this )
+{
+ demux_t *p_demux = (demux_t *)p_this;
+ demux_sys_t *p_sys = p_demux->p_sys;
+
+ free( p_sys );
+}
+
+static int Control( demux_t *p_demux, int i_query, va_list args )
+{
+ bool *pb;
+ int64_t *pi64;
+
+ switch( i_query )
+ {
+ /* Special for access_demux */
+ case DEMUX_CAN_PAUSE:
+ case DEMUX_CAN_SEEK:
+ case DEMUX_CAN_CONTROL_PACE:
+ pb = (bool*)va_arg( args, bool * );
+ *pb = false;
+ return VLC_SUCCESS;
+
+ case DEMUX_GET_PTS_DELAY:
+ pi64 = (int64_t*)va_arg( args, int64_t * );
+ *pi64 = var_GetInteger( p_demux, "sdi-caching" ) * 1000;
+ return VLC_SUCCESS;
+
+ case DEMUX_GET_TIME:
+ pi64 = (int64_t*)va_arg( args, int64_t * );
+ *pi64 = mdate(); // FIXME
+ return VLC_SUCCESS;
+
+ /* TODO implement others */
+ default:
+ return VLC_EGENERIC;
+ }
+
+ return VLC_EGENERIC;
+}
+
+static int Demux( demux_t *p_demux )
+{
+ demux_sys_t *p_sys = p_demux->p_sys;
+
+ // FIXME
+
+ return 1;
+}
+