]> git.sesse.net Git - vlc/blob - modules/access/sdi.c
Add missing option sdi-caching.
[vlc] / modules / access / sdi.c
1 /* BlackMagic SDI driver */
2
3 #ifdef HAVE_CONFIG_H
4 # include "config.h"
5 #endif
6
7 #include <vlc_common.h>
8 #include <vlc_plugin.h>
9 #include <vlc_input.h>
10 #include <vlc_demux.h>
11 #include <vlc_access.h>
12 #include <vlc_picture.h>
13 #include <vlc_charset.h>
14 #include <vlc_fs.h>
15
16 static int  Open ( vlc_object_t * );
17 static void Close( vlc_object_t * );
18
19 #define CACHING_TEXT N_("Caching value in ms")
20 #define CACHING_LONGTEXT N_( \
21     "Caching value for SDI captures. This " \
22     "value should be set in milliseconds." )
23
24 vlc_module_begin ()
25     set_shortname( N_("SDI") )
26     set_description( N_("BlackMagic SDI input") )
27     set_category( CAT_INPUT )
28     set_subcategory( SUBCAT_INPUT_ACCESS )
29
30     add_integer( "sdi-caching", DEFAULT_PTS_DELAY / 1000, NULL,
31                  CACHING_TEXT, CACHING_LONGTEXT, true )
32
33     add_shortcut( "sdi" )
34     set_capability( "access_demux", 10 )
35     set_callbacks( Open, Close )
36 vlc_module_end ()
37
38 static int Demux  ( demux_t * );
39 static int Control( demux_t *, int, va_list );
40
41 struct demux_sys_t
42 {
43     es_out_id_t  *p_es;
44 };
45
46 static int Open( vlc_object_t *p_this )
47 {
48     demux_t     *p_demux = (demux_t*)p_this;
49     demux_sys_t *p_sys;
50
51     /* Only when selected */
52     if( *p_demux->psz_access == '\0' )
53         return VLC_EGENERIC;
54
55     /* Set up p_demux */
56     p_demux->pf_demux = Demux;
57     p_demux->pf_control = Control;
58     p_demux->info.i_update = 0;
59     p_demux->info.i_title = 0;
60     p_demux->info.i_seekpoint = 0;
61     p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) );
62     if( !p_sys )
63         return VLC_ENOMEM;
64
65     msg_Dbg( p_demux, "hello world" );
66
67     /* Declare elementary streams */
68     es_format_t fmt;
69     es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_YUYV );
70     fmt.video.i_width = 720;
71     fmt.video.i_height = 576;
72     fmt.video.i_sar_num = 1;
73     fmt.video.i_sar_den = 1;
74
75     msg_Dbg( p_demux, "added new video es %4.4s %dx%d",
76              (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height );
77     p_sys->p_es = es_out_Add( p_demux->out, &fmt );
78
79     /* Update default_pts to a suitable value for access */
80     var_Create( p_demux, "sdi-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
81
82     return VLC_SUCCESS;
83 }
84
85 static void Close( vlc_object_t *p_this )
86 {
87     demux_t     *p_demux = (demux_t *)p_this;
88     demux_sys_t *p_sys   = p_demux->p_sys;
89
90     free( p_sys );
91 }
92
93 static int Control( demux_t *p_demux, int i_query, va_list args )
94 {
95     bool *pb;
96     int64_t    *pi64;
97
98     switch( i_query )
99     {
100         /* Special for access_demux */
101         case DEMUX_CAN_PAUSE:
102         case DEMUX_CAN_SEEK:
103         case DEMUX_CAN_CONTROL_PACE:
104             pb = (bool*)va_arg( args, bool * );
105             *pb = false;
106             return VLC_SUCCESS;
107
108         case DEMUX_GET_PTS_DELAY:
109             pi64 = (int64_t*)va_arg( args, int64_t * );
110             *pi64 = var_GetInteger( p_demux, "sdi-caching" ) * 1000;
111             return VLC_SUCCESS;
112
113         case DEMUX_GET_TIME:
114             pi64 = (int64_t*)va_arg( args, int64_t * );
115             *pi64 = mdate();  // FIXME
116             return VLC_SUCCESS;
117
118         /* TODO implement others */
119         default:
120             return VLC_EGENERIC;
121     }
122
123     return VLC_EGENERIC;
124 }
125
126 static int Demux( demux_t *p_demux )
127 {
128     demux_sys_t *p_sys = p_demux->p_sys;
129
130     // FIXME
131
132     return 1;
133 }
134