[dvblast-devel] [Git][videolan/dvblast][master] 2 commits: Support DVB CI cards to descramble udp input

Christophe Massiot (@cmassiot) gitlab at videolan.org
Tue Jan 21 11:06:25 UTC 2025



Christophe Massiot pushed to branch master at VideoLAN / dvblast


Commits:
1a0474b7 by Arnaud de Turckheim at 2025-01-14T16:01:20+01:00
Support DVB CI cards to descramble udp input

- - - - -
405917e7 by Christophe Massiot at 2025-01-21T12:06:08+01:00
Merge branch 'quarium-dvb-ci'

- - - - -


5 changed files:

- comm.c
- dvb.c
- dvblast.c
- dvblast.h
- udp.c


Changes:

=====================================
comm.c
=====================================
@@ -121,6 +121,16 @@ static void comm_Read(struct ev_loop *loop, struct ev_io *w, int revents)
         switch ( i_command )
         {
             case CMD_FRONTEND_STATUS:
+                i_answer = RET_NODATA;
+                i_answer_size = 0;
+                goto return_answer;
+        }
+    }
+
+    if ( i_frequency == 0 && i_secnum < 0 )
+    {
+        switch ( i_command )
+        {
             case CMD_MMI_STATUS:
             case CMD_MMI_SLOT_STATUS:
             case CMD_MMI_OPEN:


=====================================
dvb.c
=====================================
@@ -72,7 +72,7 @@
 
 int i_dvr_buffer_size = DVR_BUFFER_SIZE;
 
-static int i_frontend, i_dvr;
+static int i_frontend, i_dvr, i_sec;
 static struct ev_io frontend_watcher, dvr_watcher;
 static struct ev_timer lock_watcher, mute_watcher, print_watcher;
 static fe_status_t i_last_status;
@@ -87,6 +87,59 @@ static void FrontendRead(struct ev_loop *loop, struct ev_io *w, int revents);
 static void FrontendLockCb(struct ev_loop *loop, struct ev_timer *w, int revents);
 static void FrontendSet( bool b_reset );
 
+/*****************************************************************************
+ * dvb_OpenDvr
+ *****************************************************************************/
+void dvb_OpenDvr( void )
+{
+    char psz_tmp[128];
+
+    sprintf( psz_tmp, "/dev/dvb/adapter%d/dvr%d", i_adapter, i_fenum );
+    if( (i_dvr = open(psz_tmp, O_RDONLY | O_NONBLOCK)) < 0 )
+    {
+        msg_Info(NULL, "opening device %s failed (%s), fallback on sec device",
+                 psz_tmp, strerror(errno));
+
+        /* try to read from sec device */
+        sprintf(psz_tmp, "/dev/dvb/adapter%d/sec%d", i_adapter, i_fenum);
+        if ( (i_dvr = open(psz_tmp, O_RDONLY | O_NONBLOCK)) < 0 )
+        {
+            msg_Err(NULL, "opening device %s failed (%s)", psz_tmp,
+                    strerror(errno));
+            exit(1);
+        }
+    }
+
+    if ( ioctl( i_dvr, DMX_SET_BUFFER_SIZE, i_dvr_buffer_size ) < 0 )
+    {
+        msg_Warn( NULL, "couldn't set %s buffer size (%s)", psz_tmp,
+                 strerror(errno) );
+    }
+
+    ev_io_init(&dvr_watcher, DVRRead, i_dvr, EV_READ);
+    ev_io_start(event_loop, &dvr_watcher);
+}
+
+/*****************************************************************************
+ * dvb_OpenSec
+ *****************************************************************************/
+void dvb_OpenSec( void )
+{
+    char psz_tmp[128];
+
+    msg_Dbg( NULL, "compiled with DVB API version %d.%d", DVB_API_VERSION, DVB_API_VERSION_MINOR );
+
+    i_frontend = -1;
+
+    sprintf( psz_tmp, "/dev/dvb/adapter%d/sec%d", i_adapter, i_secnum );
+    if( (i_sec = open(psz_tmp, O_WRONLY)) < 0 )
+    {
+        msg_Err(NULL, "opening device %s failed (%s)", psz_tmp,
+                strerror(errno));
+        exit(1);
+    }
+}
+
 /*****************************************************************************
  * dvb_Open
  *****************************************************************************/
@@ -113,23 +166,7 @@ void dvb_Open( void )
         i_frontend = -1;
     }
 
-    sprintf( psz_tmp, "/dev/dvb/adapter%d/dvr%d", i_adapter, i_fenum );
-
-    if( (i_dvr = open(psz_tmp, O_RDONLY | O_NONBLOCK)) < 0 )
-    {
-        msg_Err( NULL, "opening device %s failed (%s)", psz_tmp,
-                 strerror(errno) );
-        exit(1);
-    }
-
-    if ( ioctl( i_dvr, DMX_SET_BUFFER_SIZE, i_dvr_buffer_size ) < 0 )
-    {
-        msg_Warn( NULL, "couldn't set %s buffer size (%s)", psz_tmp,
-                 strerror(errno) );
-    }
-
-    ev_io_init(&dvr_watcher, DVRRead, i_dvr, EV_READ);
-    ev_io_start(event_loop, &dvr_watcher);
+    dvb_OpenDvr();
 
     if ( i_frontend != -1 )
     {
@@ -271,6 +308,33 @@ void dvb_UnsetFilter( int i_fd, uint16_t i_pid )
     close( i_fd );
 }
 
+/*****************************************************************************
+ * dvb_WriteSec: write data to sec device
+ *****************************************************************************/
+void dvb_WriteSec( block_t *p_ts )
+{
+    int i_iov = 0;
+
+    for (block_t *p_b = p_ts; p_b; p_b = p_b->p_next)
+        i_iov++;
+
+    struct iovec p_iov[i_iov];
+    struct iovec *p_current = &p_iov[0];
+    for (block_t *p_b = p_ts; p_b; p_b = p_b->p_next)
+    {
+        p_current->iov_base = p_b->p_ts;
+        p_current->iov_len = TS_SIZE;
+        p_current++;
+    }
+
+    int i_len;
+    if ( (i_len = writev( i_sec, p_iov, i_iov )) < 0 )
+    {
+        msg_Err( NULL, "couldn't write to DVB sec (%s)", strerror(errno) );
+    }
+
+    block_DeleteChain( p_ts );
+}
 
 /*
  * Frontend


=====================================
dvblast.c
=====================================
@@ -65,6 +65,7 @@ static int i_priority = -1;
 int i_adapter = 0;
 int i_fenum = 0;
 int i_canum = 0;
+int i_secnum = -1;
 char *psz_delsys = NULL;
 int i_frequency = 0;
 char *psz_lnb_type = "universal";
@@ -661,6 +662,7 @@ void usage()
     msg_Raw( NULL, "    DVB-T  qam_16|qam_32|qam_64|qam_128|qam_256 (default qam_auto)" );
     msg_Raw( NULL, "    DVB-S2 qpsk|psk_8|apsk_16|apsk_32 (default legacy DVB-S)" );
     msg_Raw( NULL, "  -n --frontend-number <frontend number>" );
+    msg_Raw( NULL, "     --sec-number <sec number>" );
     msg_Raw( NULL, "  -p --force-pulse      force 22kHz pulses for high-band selection (DVB-S)" );
     msg_Raw( NULL, "  -P --pilot            DVB-S2 Pilot (-1 auto, 0 off, 1 on)" );
     msg_Raw( NULL, "  -R --rolloff          DVB-S2 Rolloff value" );
@@ -753,6 +755,7 @@ int main( int i_argc, char **pp_argv )
         { "priority",        required_argument, NULL, 'i' },
         { "adapter",         required_argument, NULL, 'a' },
         { "frontend-number", required_argument, NULL, 'n' },
+        { "sec-number",      required_argument, NULL, 0x100004 },
         { "delsys",          required_argument, NULL, '5' },
         { "dvb-plp-id",      required_argument, NULL, '9' },
         { "frequency",       required_argument, NULL, 'f' },
@@ -880,6 +883,10 @@ int main( int i_argc, char **pp_argv )
             i_fenum = strtol( optarg, NULL, 0 );
             break;
 
+        case 0x100004:
+            i_secnum = strtol( optarg, NULL, 0 );
+            break;
+
         case 'y':
             i_canum = strtol( optarg, NULL, 0 );
             break;


=====================================
dvblast.h
=====================================
@@ -218,6 +218,7 @@ extern char *psz_srv_socket;
 extern int i_adapter;
 extern int i_fenum;
 extern int i_canum;
+extern int i_secnum;
 extern char *psz_delsys;
 extern int i_dvr_buffer_size;
 extern int i_frequency;
@@ -319,6 +320,9 @@ void dvb_Open( void );
 void dvb_Reset( void );
 int dvb_SetFilter( uint16_t i_pid );
 void dvb_UnsetFilter( int i_fd, uint16_t i_pid );
+void dvb_OpenDvr( void );
+void dvb_OpenSec( void );
+void dvb_WriteSec( block_t *p_ts );
 uint8_t dvb_FrontendStatus( uint8_t *p_answer, ssize_t *pi_size );
 
 void udp_Open( void );


=====================================
udp.c
=====================================
@@ -44,6 +44,7 @@
 #include <bitstream/ietf/rtp.h>
 
 #include "dvblast.h"
+#include "en50221.h"
 
 /*****************************************************************************
  * Local declarations
@@ -279,6 +280,13 @@ void udp_Open( void )
     ev_timer_init(&mute_watcher, udp_MuteCb,
                   i_udp_lock_timeout / 1000000., i_udp_lock_timeout / 1000000.);
     memset(&last_addr, 0, sizeof(last_addr));
+
+    if ( i_secnum >= 0 )
+    {
+        dvb_OpenDvr();
+        dvb_OpenSec();
+        en50221_Init();
+    }
 }
 
 /*****************************************************************************
@@ -431,7 +439,10 @@ err:
     block_DeleteChain( *pp_current );
     *pp_current = NULL;
 
-    demux_Run( p_ts );
+    if ( i_secnum < 0 )
+        demux_Run(p_ts);
+    else
+        dvb_WriteSec(p_ts);
 }
 
 static void udp_MuteCb(struct ev_loop *loop, struct ev_timer *w, int revents)



View it on GitLab: https://code.videolan.org/videolan/dvblast/-/compare/bca0be676f33889e38a9a63a0b7b498663e1bdc0...405917e77f0f08b4c130ae4611c3ca6cf82119c1

-- 
View it on GitLab: https://code.videolan.org/videolan/dvblast/-/compare/bca0be676f33889e38a9a63a0b7b498663e1bdc0...405917e77f0f08b4c130ae4611c3ca6cf82119c1
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the dvblast-devel mailing list