static void SDTCallBack( scan_session_t *p_session, dvbpsi_sdt_t *p_sdt ) { vlc_object_t *p_obj = p_session->p_obj; msg_Dbg( p_obj, "SDTCallBack" ); if( p_session->p_sdt && p_session->p_sdt->b_current_next ) { dvbpsi_DeleteSDT( p_session->p_sdt ); p_session->p_sdt = NULL; } if( p_session->p_sdt ) { dvbpsi_DeleteSDT( p_sdt ); return; } /* */ p_session->p_sdt = p_sdt; /* */ msg_Dbg( p_obj, "new SDT ts_id=%d version=%d current_next=%d network_id=%d", p_sdt->i_ts_id, p_sdt->i_version, p_sdt->b_current_next, p_sdt->i_network_id ); dvbpsi_sdt_service_t *p_srv; for( p_srv = p_sdt->p_first_service; p_srv; p_srv = p_srv->p_next ) { dvbpsi_descriptor_t *p_dr; msg_Dbg( p_obj, " * service id=%d eit schedule=%d present=%d running=%d free_ca=%d", p_srv->i_service_id, p_srv->b_eit_schedule, p_srv->b_eit_present, p_srv->i_running_status, p_srv->b_free_ca ); for( p_dr = p_srv->p_first_descriptor; p_dr; p_dr = p_dr->p_next ) { if( p_dr->i_tag == 0x48 ) { dvbpsi_service_dr_t *pD = dvbpsi_DecodeServiceDr( p_dr ); char str2[257]; memcpy( str2, pD->i_service_name, pD->i_service_name_length ); str2[pD->i_service_name_length] = '\0'; msg_Dbg( p_obj, " - type=%d name=%s", pD->i_service_type, str2 ); } else { msg_Dbg( p_obj, " * dsc 0x%x", p_dr->i_tag ); } } } }
/***************************************************************************** * DumpSDT *****************************************************************************/ static void DumpSDT(void* p_zero, dvbpsi_sdt_t* p_sdt) { dvbpsi_sdt_service_t* p_service = p_sdt->p_first_service; printf( "\n"); printf( "New active SDT\n"); printf( " ts_id : %d\n", p_sdt->i_ts_id); printf( " version_number : %d\n", p_sdt->i_version); printf( " network_id : %d\n", p_sdt->i_network_id); printf( " | service_id \n"); while(p_service) { printf(" | 0x%02x \n", p_service->i_service_id); DumpDescriptors(" | ]", p_service->p_first_descriptor); p_service = p_service->p_next; } dvbpsi_DeleteSDT(p_sdt); }
void scan_session_Clean( scan_t *p_scan, scan_session_t *p_session ) { const int i_service_start = p_scan->i_service; dvbpsi_pat_t *p_pat = p_session->p_pat; dvbpsi_sdt_t *p_sdt = p_session->p_sdt; #ifdef DVBPSI_USE_NIT dvbpsi_nit_t *p_nit = p_session->p_nit; #endif if( p_pat ) { /* Parse PAT */ dvbpsi_pat_program_t *p_program; for( p_program = p_pat->p_first_program; p_program != NULL; p_program = p_program->p_next ) { if( p_program->i_number == 0 ) /* NIT */ continue; scan_service_t *s = scan_service_New( p_program->i_number, &p_session->cfg ); TAB_APPEND( p_scan->i_service, p_scan->pp_service, s ); } } /* Parse SDT */ if( p_pat && p_sdt ) { dvbpsi_sdt_service_t *p_srv; for( p_srv = p_sdt->p_first_service; p_srv; p_srv = p_srv->p_next ) { scan_service_t *s = ScanFindService( p_scan, i_service_start, p_srv->i_service_id ); dvbpsi_descriptor_t *p_dr; if( s ) s->b_crypted = p_srv->b_free_ca; for( p_dr = p_srv->p_first_descriptor; p_dr; p_dr = p_dr->p_next ) { if( p_dr->i_tag == 0x48 ) { dvbpsi_service_dr_t *pD = dvbpsi_DecodeServiceDr( p_dr ); if( s ) { if( !s->psz_name ) s->psz_name = dvbsi_to_utf8( pD->i_service_name, pD->i_service_name_length ); if( s->type == SERVICE_UNKNOWN ) { switch( pD->i_service_type ) { case 0x01: s->type = SERVICE_DIGITAL_TELEVISION; break; case 0x02: s->type = SERVICE_DIGITAL_RADIO; break; case 0x16: s->type = SERVICE_DIGITAL_TELEVISION_AC_SD; break; case 0x19: s->type = SERVICE_DIGITAL_TELEVISION_AC_HD; break; } } } } } } } #ifdef DVBPSI_USE_NIT /* Parse NIT */ if( p_pat && p_nit ) { dvbpsi_nit_ts_t *p_ts; for( p_ts = p_nit->p_first_ts; p_ts != NULL; p_ts = p_ts->p_next ) { uint32_t i_private_data_id = 0; dvbpsi_descriptor_t *p_dsc; if( p_ts->i_orig_network_id != p_nit->i_network_id || p_ts->i_ts_id != p_pat->i_ts_id ) continue; for( p_dsc = p_ts->p_first_descriptor; p_dsc != NULL; p_dsc = p_dsc->p_next ) { if( p_dsc->i_tag == 0x5f ) { i_private_data_id = GetDWBE( &p_dsc->p_data[0] ); } else if( i_private_data_id == 0x28 && p_dsc->i_tag == 0x83 ) { for( int i = 0; i < p_dsc->i_length/4; i++ ) { uint16_t i_service_id = GetWBE( &p_dsc->p_data[4*i+0] ); int i_channel_number = GetWBE( &p_dsc->p_data[4*i+2] ) & 0x3ff; scan_service_t *s = ScanFindService( p_scan, i_service_start, i_service_id ); if( s && s->i_channel < 0 ) s->i_channel = i_channel_number; } } } } } #endif /* */ for( int i = i_service_start; i < p_scan->i_service; i++ ) { scan_service_t *p_srv = p_scan->pp_service[i]; p_srv->i_snr = p_session->i_snr; if( p_sdt ) p_srv->i_sdt_version = p_sdt->i_version; #ifdef DVBPSI_USE_NIT if( p_nit ) { p_srv->i_network_id = p_nit->i_network_id; p_srv->i_nit_version = p_nit->i_version; } #endif } /* */ if( p_session->pat ) dvbpsi_DetachPAT( p_session->pat ); if( p_session->p_pat ) dvbpsi_DeletePAT( p_session->p_pat ); if( p_session->sdt ) dvbpsi_DetachDemux( p_session->sdt ); if( p_session->p_sdt ) dvbpsi_DeleteSDT( p_session->p_sdt ); #ifdef DVBPSI_USE_NIT if( p_session->nit ) dvbpsi_DetachDemux( p_session->nit ); if( p_session->p_nit ) dvbpsi_DeleteNIT( p_session->p_nit ); #endif }