X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fdvb%2Fen50221.c;h=ccd435383ffcef835c0518c5fcd24b8a0f0ec61b;hb=4cb13ccc3af1336f3e0b570ce58cb714ffa51f77;hp=153295bcccd46f9b029195a1767156bce968797a;hpb=552e595131c5f1d66eba8e3c22c2b1c509be5153;p=vlc diff --git a/modules/access/dvb/en50221.c b/modules/access/dvb/en50221.c index 153295bccc..ccd435383f 100644 --- a/modules/access/dvb/en50221.c +++ b/modules/access/dvb/en50221.c @@ -22,7 +22,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include #include @@ -35,6 +39,7 @@ #include #include #include +#include /* DVB Card Drivers */ #include @@ -50,6 +55,8 @@ # include # include # include +# include +# include #else # include "dvbpsi.h" # include "descriptor.h" @@ -57,10 +64,12 @@ # include "tables/pmt.h" # include "descriptors/dr.h" # include "psi.h" +# include "demux.h" +# include "tables/sdt.h" #endif #ifdef ENABLE_HTTPD -# include "vlc_httpd.h" +# include #endif #include "dvb.h" @@ -76,7 +85,6 @@ static void ApplicationInformationOpen( access_t * p_access, int i_session_id ); static void ConditionalAccessOpen( access_t * p_access, int i_session_id ); static void DateTimeOpen( access_t * p_access, int i_session_id ); static void MMIOpen( access_t * p_access, int i_session_id ); -static char *dvbsi_to_utf8( char *psz_instring, size_t i_length ); /***************************************************************************** * Utility functions @@ -143,7 +151,7 @@ static uint8_t *SetLength( uint8_t *p_data, int i_length ) * Transport layer */ -#define MAX_TPDU_SIZE 2048 +#define MAX_TPDU_SIZE 4096 #define MAX_TPDU_DATA (MAX_TPDU_SIZE - 4) #define DATA_INDICATOR 0x80 @@ -160,7 +168,7 @@ static uint8_t *SetLength( uint8_t *p_data, int i_length ) #define T_DATA_LAST 0xA0 #define T_DATA_MORE 0xA1 -static void Dump( vlc_bool_t b_outgoing, uint8_t *p_data, int i_size ) +static void Dump( bool b_outgoing, uint8_t *p_data, int i_size ) { #ifdef DEBUG_TPDU int i; @@ -169,6 +177,8 @@ static void Dump( vlc_bool_t b_outgoing, uint8_t *p_data, int i_size ) for ( i = 0; i < i_size && i < MAX_DUMP; i++) fprintf(stderr, "%02X ", p_data[i]); fprintf(stderr, "%s\n", i_size >= MAX_DUMP ? "..." : ""); +#else + VLC_UNUSED(b_outgoing); VLC_UNUSED(p_data); VLC_UNUSED(i_size); #endif } @@ -226,7 +236,7 @@ static int TPDUSend( access_t * p_access, uint8_t i_slot, uint8_t i_tag, default: break; } - Dump( VLC_TRUE, p_data, i_size ); + Dump( true, p_data, i_size ); if ( write( p_sys->i_ca_handle, p_data, i_size ) != i_size ) { @@ -275,6 +285,8 @@ static int TPDURecv( access_t * p_access, uint8_t i_slot, uint8_t *pi_tag, if ( i_size < 5 ) { msg_Err( p_access, "cannot read from CAM device (%d:%m)", i_size ); + if( pi_size == NULL ) + free( p_data ); return VLC_EGENERIC; } @@ -282,6 +294,8 @@ static int TPDURecv( access_t * p_access, uint8_t i_slot, uint8_t *pi_tag, { msg_Err( p_access, "invalid read from CAM device (%d instead of %d)", p_data[1], i_tcid ); + if( pi_size == NULL ) + free( p_data ); return VLC_EGENERIC; } @@ -290,9 +304,9 @@ static int TPDURecv( access_t * p_access, uint8_t i_slot, uint8_t *pi_tag, && p_data[i_size - 4] == T_SB && p_data[i_size - 3] == 2 && (p_data[i_size - 1] & DATA_INDICATOR)) - ? VLC_TRUE : VLC_FALSE; + ? true : false; - Dump( VLC_FALSE, p_data, i_size ); + Dump( false, p_data, i_size ); if ( pi_size == NULL ) free( p_data ); @@ -401,6 +415,8 @@ static int SPDUSend( access_t * p_access, int i_session_id, static void SessionOpen( access_t * p_access, uint8_t i_slot, uint8_t *p_spdu, int i_size ) { + VLC_UNUSED( i_size ); + access_sys_t *p_sys = p_access->p_sys; int i_session_id; int i_resource_id = ResourceIdToInt( &p_spdu[2] ); @@ -413,7 +429,7 @@ static void SessionOpen( access_t * p_access, uint8_t i_slot, if ( !p_sys->p_sessions[i_session_id - 1].i_resource_id ) break; } - if ( i_session_id == MAX_SESSIONS ) + if ( i_session_id > MAX_SESSIONS ) { msg_Err( p_access, "too many sessions !" ); return; @@ -535,6 +551,9 @@ static void SessionCreate( access_t * p_access, int i_slot, int i_resource_id ) static void SessionCreateResponse( access_t * p_access, uint8_t i_slot, uint8_t *p_spdu, int i_size ) { + VLC_UNUSED( i_size ); + VLC_UNUSED( i_slot ); + access_sys_t *p_sys = p_access->p_sys; int i_status = p_spdu[2]; int i_resource_id = ResourceIdToInt( &p_spdu[3] ); @@ -805,10 +824,8 @@ static int APDUSend( access_t * p_access, int i_session_id, int i_tag, } else { - char *psz_hex; ca_msg.length = i_size + p - p_apdu; if ( i_size == 0 ) ca_msg.length=3; - psz_hex = (char*)malloc( ca_msg.length*3 + 1); memcpy( ca_msg.msg, p_apdu, i_size + p - p_apdu ); i_ret = ioctl(p_sys->i_ca_handle, CA_SEND_MSG, &ca_msg ); if ( i_ret < 0 ) @@ -887,7 +904,7 @@ static void ApplicationInformationEnterMenu( access_t * p_access, msg_Dbg( p_access, "entering MMI menus on session %d", i_session_id ); APDUSend( p_access, i_session_id, AOT_ENTER_MENU, NULL, 0 ); - p_sys->pb_slot_mmi_expected[i_slot] = VLC_TRUE; + p_sys->pb_slot_mmi_expected[i_slot] = true; } /***************************************************************************** @@ -896,6 +913,7 @@ static void ApplicationInformationEnterMenu( access_t * p_access, static void ApplicationInformationHandle( access_t * p_access, int i_session_id, uint8_t *p_apdu, int i_size ) { + VLC_UNUSED(i_session_id); int i_tag = APDUGetTag( p_apdu, i_size ); switch ( i_tag ) @@ -952,25 +970,25 @@ typedef struct uint16_t pi_system_ids[MAX_CASYSTEM_IDS + 1]; } system_ids_t; -static vlc_bool_t CheckSystemID( system_ids_t *p_ids, uint16_t i_id ) +static bool CheckSystemID( system_ids_t *p_ids, uint16_t i_id ) { int i = 0; - if( !p_ids ) return VLC_TRUE; + if( !p_ids ) return true; while ( p_ids->pi_system_ids[i] ) { if ( p_ids->pi_system_ids[i] == i_id ) - return VLC_TRUE; + return true; i++; } - return VLC_FALSE; + return false; } /***************************************************************************** * CAPMTNeedsDescrambling *****************************************************************************/ -static vlc_bool_t CAPMTNeedsDescrambling( dvbpsi_pmt_t *p_pmt ) +static bool CAPMTNeedsDescrambling( dvbpsi_pmt_t *p_pmt ) { dvbpsi_descriptor_t *p_dr; dvbpsi_pmt_es_t *p_es; @@ -979,7 +997,7 @@ static vlc_bool_t CAPMTNeedsDescrambling( dvbpsi_pmt_t *p_pmt ) { if( p_dr->i_tag == 0x9 ) { - return VLC_TRUE; + return true; } } @@ -990,12 +1008,12 @@ static vlc_bool_t CAPMTNeedsDescrambling( dvbpsi_pmt_t *p_pmt ) { if( p_dr->i_tag == 0x9 ) { - return VLC_TRUE; + return true; } } } - return VLC_FALSE; + return false; } /***************************************************************************** @@ -1196,8 +1214,11 @@ static void CAPMTFirst( access_t * p_access, int i_session_id, 0x3 /* only */, 0x1 /* ok_descrambling */, &i_capmt_size ); - if ( i_capmt_size ) + if( i_capmt_size ) + { APDUSend( p_access, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size ); + free( p_capmt ); + } } /***************************************************************************** @@ -1230,8 +1251,11 @@ static void CAPMTAdd( access_t * p_access, int i_session_id, 0x4 /* add */, 0x1 /* ok_descrambling */, &i_capmt_size ); - if ( i_capmt_size ) + if( i_capmt_size ) + { APDUSend( p_access, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size ); + free( p_capmt ); + } } /***************************************************************************** @@ -1250,8 +1274,11 @@ static void CAPMTUpdate( access_t * p_access, int i_session_id, 0x5 /* update */, 0x1 /* ok_descrambling */, &i_capmt_size ); - if ( i_capmt_size ) + if( i_capmt_size ) + { APDUSend( p_access, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size ); + free( p_capmt ); + } } /***************************************************************************** @@ -1271,8 +1298,11 @@ static void CAPMTDelete( access_t * p_access, int i_session_id, 0x5 /* update */, 0x4 /* not selected */, &i_capmt_size ); - if ( i_capmt_size ) + if( i_capmt_size ) + { APDUSend( p_access, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size ); + free( p_capmt ); + } } /***************************************************************************** @@ -1344,9 +1374,7 @@ static void ConditionalAccessOpen( access_t * p_access, int i_session_id ) p_sys->p_sessions[i_session_id - 1].pf_handle = ConditionalAccessHandle; p_sys->p_sessions[i_session_id - 1].pf_close = ConditionalAccessClose; - p_sys->p_sessions[i_session_id - 1].p_sys = malloc(sizeof(system_ids_t)); - memset( p_sys->p_sessions[i_session_id - 1].p_sys, 0, - sizeof(system_ids_t) ); + p_sys->p_sessions[i_session_id - 1].p_sys = calloc( 1, sizeof(system_ids_t) ); APDUSend( p_access, i_session_id, AOT_CA_INFO_ENQ, NULL, 0 ); } @@ -1476,8 +1504,7 @@ static void DateTimeOpen( access_t * p_access, int i_session_id ) p_sys->p_sessions[i_session_id - 1].pf_handle = DateTimeHandle; p_sys->p_sessions[i_session_id - 1].pf_manage = DateTimeManage; p_sys->p_sessions[i_session_id - 1].pf_close = DateTimeClose; - p_sys->p_sessions[i_session_id - 1].p_sys = malloc(sizeof(date_time_t)); - memset( p_sys->p_sessions[i_session_id - 1].p_sys, 0, sizeof(date_time_t) ); + p_sys->p_sessions[i_session_id - 1].p_sys = calloc( 1, sizeof(date_time_t) ); DateTimeSend( p_access, i_session_id ); } @@ -1542,7 +1569,7 @@ static void MMISendObject( access_t *p_access, int i_session_id, i_tag = AOT_ANSW; i_size = 1 + strlen( p_object->u.answ.psz_answ ); p_data = malloc( i_size ); - p_data[0] = (p_object->u.answ.b_ok == VLC_TRUE) ? 0x1 : 0x0; + p_data[0] = (p_object->u.answ.b_ok == true) ? 0x1 : 0x0; strncpy( (char *)&p_data[1], p_object->u.answ.psz_answ, i_size - 1 ); break; @@ -1561,7 +1588,7 @@ static void MMISendObject( access_t *p_access, int i_session_id, APDUSend( p_access, i_session_id, i_tag, p_data, i_size ); free( p_data ); - p_sys->pb_slot_mmi_expected[i_slot] = VLC_TRUE; + p_sys->pb_slot_mmi_expected[i_slot] = true; } /***************************************************************************** @@ -1574,7 +1601,7 @@ static void MMISendClose( access_t *p_access, int i_session_id ) APDUSend( p_access, i_session_id, AOT_CLOSE_MMI, NULL, 0 ); - p_sys->pb_slot_mmi_expected[i_slot] = VLC_TRUE; + p_sys->pb_slot_mmi_expected[i_slot] = true; } /***************************************************************************** @@ -1622,6 +1649,8 @@ static char *MMIGetText( access_t *p_access, uint8_t **pp_apdu, int *pi_size ) static void MMIHandleEnq( access_t *p_access, int i_session_id, uint8_t *p_apdu, int i_size ) { + VLC_UNUSED( i_size ); + access_sys_t *p_sys = p_access->p_sys; mmi_t *p_mmi = (mmi_t *)p_sys->p_sessions[i_session_id - 1].p_sys; int i_slot = p_sys->p_sessions[i_session_id - 1].i_slot; @@ -1630,7 +1659,7 @@ static void MMIHandleEnq( access_t *p_access, int i_session_id, en50221_MMIFree( &p_mmi->last_object ); p_mmi->last_object.i_object_type = EN50221_MMI_ENQ; - p_mmi->last_object.u.enq.b_blind = (*d & 0x1) ? VLC_TRUE : VLC_FALSE; + p_mmi->last_object.u.enq.b_blind = (*d & 0x1) ? true : false; d += 2; /* skip answer_text_length because it is not mandatory */ l -= 2; p_mmi->last_object.u.enq.psz_text = malloc( l + 1 ); @@ -1638,9 +1667,9 @@ static void MMIHandleEnq( access_t *p_access, int i_session_id, p_mmi->last_object.u.enq.psz_text[l] = '\0'; msg_Dbg( p_access, "MMI enq: %s%s", p_mmi->last_object.u.enq.psz_text, - p_mmi->last_object.u.enq.b_blind == VLC_TRUE ? " (blind)" : "" ); - p_sys->pb_slot_mmi_expected[i_slot] = VLC_FALSE; - p_sys->pb_slot_mmi_undisplayed[i_slot] = VLC_TRUE; + p_mmi->last_object.u.enq.b_blind == true ? " (blind)" : "" ); + p_sys->pb_slot_mmi_expected[i_slot] = false; + p_sys->pb_slot_mmi_undisplayed[i_slot] = true; } /***************************************************************************** @@ -1649,6 +1678,7 @@ static void MMIHandleEnq( access_t *p_access, int i_session_id, static void MMIHandleMenu( access_t *p_access, int i_session_id, int i_tag, uint8_t *p_apdu, int i_size ) { + VLC_UNUSED(i_size); access_sys_t *p_sys = p_access->p_sys; mmi_t *p_mmi = (mmi_t *)p_sys->p_sessions[i_session_id - 1].p_sys; int i_slot = p_sys->p_sessions[i_session_id - 1].i_slot; @@ -1688,8 +1718,8 @@ static void MMIHandleMenu( access_t *p_access, int i_session_id, int i_tag, msg_Dbg( p_access, "MMI choice: %s", psz_text ); } } - p_sys->pb_slot_mmi_expected[i_slot] = VLC_FALSE; - p_sys->pb_slot_mmi_undisplayed[i_slot] = VLC_TRUE; + p_sys->pb_slot_mmi_expected[i_slot] = false; + p_sys->pb_slot_mmi_undisplayed[i_slot] = true; } /***************************************************************************** @@ -1758,8 +1788,8 @@ static void MMIClose( access_t *p_access, int i_session_id ) free( p_sys->p_sessions[i_session_id - 1].p_sys ); msg_Dbg( p_access, "closing MMI session (%d)", i_session_id ); - p_sys->pb_slot_mmi_expected[i_slot] = VLC_FALSE; - p_sys->pb_slot_mmi_undisplayed[i_slot] = VLC_TRUE; + p_sys->pb_slot_mmi_expected[i_slot] = false; + p_sys->pb_slot_mmi_undisplayed[i_slot] = true; } /***************************************************************************** @@ -1809,7 +1839,7 @@ static int InitSlot( access_t * p_access, int i_slot ) if ( TPDURecv( p_access, i_slot, &i_tag, NULL, NULL ) == VLC_SUCCESS && i_tag == T_CTC_REPLY ) { - p_sys->pb_active_slot[i_slot] = VLC_TRUE; + p_sys->pb_active_slot[i_slot] = true; break; } @@ -1840,7 +1870,7 @@ static int InitSlot( access_t * p_access, int i_slot ) /***************************************************************************** * en50221_Init : Initialize the CAM for en50221 *****************************************************************************/ -int E_(en50221_Init)( access_t * p_access ) +int en50221_Init( access_t * p_access ) { access_sys_t *p_sys = p_access->p_sys; @@ -1905,7 +1935,7 @@ int E_(en50221_Init)( access_t * p_access ) #if HLCI_WAIT_CAM_READY while( ca_msg.msg[8] == 0xff && ca_msg.msg[9] == 0xff ) { - if( p_access->b_die ) return VLC_EGENERIC; + if( !vlc_object_alive (p_access) ) return VLC_EGENERIC; msleep(1); msg_Dbg( p_access, "CAM: please wait" ); APDUSend( p_access, 1, AOT_APPLICATION_INFO_ENQ, NULL, 0 ); @@ -1937,7 +1967,7 @@ int E_(en50221_Init)( access_t * p_access ) /***************************************************************************** * en50221_Poll : Poll the CAM for TPDUs *****************************************************************************/ -int E_(en50221_Poll)( access_t * p_access ) +int en50221_Poll( access_t * p_access ) { access_sys_t *p_sys = p_access->p_sys; int i_slot; @@ -1962,9 +1992,9 @@ int E_(en50221_Poll)( access_t * p_access ) { msg_Dbg( p_access, "en50221_Poll: slot %d has been removed", i_slot ); - p_sys->pb_active_slot[i_slot] = VLC_FALSE; - p_sys->pb_slot_mmi_expected[i_slot] = VLC_FALSE; - p_sys->pb_slot_mmi_undisplayed[i_slot] = VLC_FALSE; + p_sys->pb_active_slot[i_slot] = false; + p_sys->pb_slot_mmi_expected[i_slot] = false; + p_sys->pb_slot_mmi_undisplayed[i_slot] = false; /* Close all sessions for this slot. */ for ( i_session_id = 1; i_session_id <= MAX_SESSIONS; @@ -2084,12 +2114,12 @@ int E_(en50221_Poll)( access_t * p_access ) /***************************************************************************** * en50221_SetCAPMT : *****************************************************************************/ -int E_(en50221_SetCAPMT)( access_t * p_access, dvbpsi_pmt_t *p_pmt ) +int en50221_SetCAPMT( access_t * p_access, dvbpsi_pmt_t *p_pmt ) { access_sys_t *p_sys = p_access->p_sys; int i, i_session_id; - vlc_bool_t b_update = VLC_FALSE; - vlc_bool_t b_needs_descrambling = CAPMTNeedsDescrambling( p_pmt ); + bool b_update = false; + bool b_needs_descrambling = CAPMTNeedsDescrambling( p_pmt ); for ( i = 0; i < MAX_PROGRAMS; i++ ) { @@ -2097,7 +2127,7 @@ int E_(en50221_SetCAPMT)( access_t * p_access, dvbpsi_pmt_t *p_pmt ) && p_sys->pp_selected_programs[i]->i_program_number == p_pmt->i_program_number ) { - b_update = VLC_TRUE; + b_update = true; if ( !b_needs_descrambling ) { @@ -2155,7 +2185,7 @@ int E_(en50221_SetCAPMT)( access_t * p_access, dvbpsi_pmt_t *p_pmt ) /***************************************************************************** * en50221_OpenMMI : *****************************************************************************/ -int E_(en50221_OpenMMI)( access_t * p_access, int i_slot ) +int en50221_OpenMMI( access_t * p_access, int i_slot ) { access_sys_t *p_sys = p_access->p_sys; @@ -2198,7 +2228,7 @@ int E_(en50221_OpenMMI)( access_t * p_access, int i_slot ) /***************************************************************************** * en50221_CloseMMI : *****************************************************************************/ -int E_(en50221_CloseMMI)( access_t * p_access, int i_slot ) +int en50221_CloseMMI( access_t * p_access, int i_slot ) { access_sys_t *p_sys = p_access->p_sys; @@ -2229,13 +2259,13 @@ int E_(en50221_CloseMMI)( access_t * p_access, int i_slot ) /***************************************************************************** * en50221_GetMMIObject : *****************************************************************************/ -en50221_mmi_object_t *E_(en50221_GetMMIObject)( access_t * p_access, +en50221_mmi_object_t *en50221_GetMMIObject( access_t * p_access, int i_slot ) { access_sys_t *p_sys = p_access->p_sys; int i_session_id; - if ( p_sys->pb_slot_mmi_expected[i_slot] == VLC_TRUE ) + if ( p_sys->pb_slot_mmi_expected[i_slot] == true ) return NULL; /* should not happen */ for ( i_session_id = 1; i_session_id <= MAX_SESSIONS; i_session_id++ ) @@ -2258,7 +2288,7 @@ en50221_mmi_object_t *E_(en50221_GetMMIObject)( access_t * p_access, /***************************************************************************** * en50221_SendMMIObject : *****************************************************************************/ -void E_(en50221_SendMMIObject)( access_t * p_access, int i_slot, +void en50221_SendMMIObject( access_t * p_access, int i_slot, en50221_mmi_object_t *p_object ) { access_sys_t *p_sys = p_access->p_sys; @@ -2280,7 +2310,7 @@ void E_(en50221_SendMMIObject)( access_t * p_access, int i_slot, /***************************************************************************** * en50221_End : *****************************************************************************/ -void E_(en50221_End)( access_t * p_access ) +void en50221_End( access_t * p_access ) { access_sys_t *p_sys = p_access->p_sys; int i_session_id, i; @@ -2313,10 +2343,10 @@ static inline void *FixUTF8( char *p ) return p; } -static char *dvbsi_to_utf8( char *psz_instring, size_t i_length ) +char *dvbsi_to_utf8( const char *psz_instring, size_t i_length ) { - const char *psz_encoding; - char *psz_stringstart, *psz_outstring, *psz_tmp; + const char *psz_encoding, *psz_stringstart; + char *psz_outstring, *psz_tmp; char psz_encbuf[12]; size_t i_in, i_out; vlc_iconv_t iconv_handle; @@ -2405,7 +2435,7 @@ static char *dvbsi_to_utf8( char *psz_instring, size_t i_length ) iconv_handle = vlc_iconv_open( "UTF-8", psz_encoding ); i_in = i_length - (psz_stringstart - psz_instring ); i_out = i_in * 6; - psz_outstring = psz_tmp = (char*)malloc( i_out * sizeof(char) + 1 ); + psz_outstring = psz_tmp = (char*)malloc( i_out + 1 ); vlc_iconv( iconv_handle, &psz_stringstart, &i_in, &psz_tmp, &i_out ); vlc_iconv_close( iconv_handle ); *psz_tmp = '\0';