-add pmt parse to scanSDT

git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@860 e54a6e83-5905-42d5-8d5c-058d10e6a962
This commit is contained in:
satbaby
2010-10-25 07:03:32 +00:00
parent bf0498b25a
commit 0708f61d9a
6 changed files with 140 additions and 7 deletions

View File

@@ -21,9 +21,8 @@
#ifndef __zapit_pat_h__
#define __zapit_pat_h__
#include "channel.h"
int parse_pat(CZapitChannel * const channel);
int scan_parse_pat( std::vector<std::pair<int,int> > &sidpmt );
#endif /* __zapit_pat_h__ */

View File

@@ -28,5 +28,6 @@
int parse_pmt(CZapitChannel * const channel);
int pmt_set_update_filter(CZapitChannel * const channel, int * fd);
int pmt_stop_update_filter(int * fd);
int scan_parse_pmt(int pmtpid, int service_id );
#endif /* __zapit_pmt_h__ */

View File

@@ -76,6 +76,47 @@ if(buffer[7]) printf("[PAT] ****************************************************
return -1;
}
int scan_parse_pat( std::vector<std::pair<int,int> > &sidpmt )
{
cDemux * dmx = new cDemux();
dmx->Open(DMX_PSI_CHANNEL);
/* buffer for program association table */
unsigned char buffer[PAT_SIZE];
/* current positon in buffer */
unsigned short i;
unsigned char filter[DMX_FILTER_SIZE];
unsigned char mask[DMX_FILTER_SIZE];
memset(filter, 0x00, DMX_FILTER_SIZE);
memset(mask, 0x00, DMX_FILTER_SIZE);
mask[0] = 0xFF;
mask[4] = 0xFF;
do {
/* set filter for program association section */
/* read section */
if ((dmx->sectionFilter(0, filter, mask, 5) < 0) || (i = dmx->Read(buffer, PAT_SIZE) < 0))
{
delete dmx;
printf("[%s] dmx read failed\n",__FILE__);
return -1;
}
dmx->Stop();
for (i = 8; i < (((buffer[1] & 0x0F) << 8) | buffer[2]) + 3; i += 4) {
int service_id = ((buffer[i] << 8) | buffer[i+1]);
if (service_id != 0)
sidpmt.push_back(std::make_pair( service_id , (((buffer[i+2] & 0x1F) << 8) | buffer[i+3]) ) );
}
} while (filter[4]++ != buffer[7]);
delete dmx;
return -1;
}
static unsigned char pbuffer[PAT_SIZE];
int parse_pat()
{

View File

@@ -589,6 +589,83 @@ int parse_pmt(CZapitChannel * const channel)
return 0;
}
int scan_parse_pmt(int pmtpid, int service_id )
{
if(pmtpid < 1 )
return -1;
if(curpmtpid == pmtpid ){
for(int i=0;i<11;i++){
if(pmt_caids[0][i] > 0)
return 1;
}
return 0;
}
int pmtlen;
int ia, dpmtlen, pos;
unsigned char descriptor_length=0;
const short pmt_size = 1024;
unsigned char buffer[pmt_size];
unsigned char filter[DMX_FILTER_SIZE];
unsigned char mask[DMX_FILTER_SIZE];
cDemux * dmx = new cDemux();
dmx->Open(DMX_PSI_CHANNEL);
memset(filter, 0x00, DMX_FILTER_SIZE);
memset(mask, 0x00, DMX_FILTER_SIZE);
filter[0] = 0x02; /* table_id */
filter[1] = service_id >> 8;
filter[2] = service_id;
filter[3] = 0x01; /* current_next_indicator */
filter[4] = 0x00; /* section_number */
mask[0] = 0xFF;
mask[1] = 0xFF;
mask[2] = 0xFF;
mask[3] = 0x01;
mask[4] = 0xFF;
if ((dmx->sectionFilter(pmtpid, filter, mask, 5) < 0) || (dmx->Read(buffer, pmt_size) < 0)) {
delete dmx;
return -1;
}
delete dmx;
pmtlen= ((buffer[1]&0xf)<<8) + buffer[2] +3;
dpmtlen=0;
pos=10;
while(pos+2<pmtlen) {
dpmtlen=((buffer[pos] & 0x0f) << 8) | buffer[pos+1];
for ( ia=pos+2;ia<(dpmtlen+pos+2);ia +=descriptor_length+2 ) {
descriptor_length = buffer[ia+1];
if ( ia < pmtlen - 4 )
if(buffer[ia]==0x09 && buffer[ia+1]>0) {
switch(buffer[ia+2]) {
case 0x06:
case 0x17:
case 0x01:
case 0x05:
case 0x18:
case 0x0B:
case 0x0D:
case 0x09:
case 0x26:
case 0x4a:
case 0x0E:
return 1;
} //switch
} // if
} // for
pos+=dpmtlen+5;
} // while
return 0;
}
#ifndef DMX_SET_NEGFILTER_MASK
#define DMX_SET_NEGFILTER_MASK _IOW('o',48,uint8_t *)
#endif

View File

@@ -26,6 +26,9 @@
#include <zapit/descriptors.h>
#include <zapit/debug.h>
#include <zapit/sdt.h>
#include <zapit/pmt.h>
#include <zapit/pat.h>
#include <zapit/settings.h> // DEMUX_DEVICE
#include <zapit/types.h>
#include <zapit/bouquets.h>
@@ -367,7 +370,6 @@ _repeat:
return 0;
}
extern tallchans curchans;
int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const t_original_network_id p_original_network_id,
t_satellite_position satellitePosition, freq_id_t freq)
{
@@ -392,11 +394,10 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const
bool EIT_schedule_flag;
bool EIT_present_following_flag;
bool free_CA_mode;
int tmp_free_CA_mode = -1;
unsigned char filter[DMX_FILTER_SIZE];
unsigned char mask[DMX_FILTER_SIZE];
curchans.clear();
filter[0] = 0x42;
filter[1] = (p_transport_stream_id >> 8) & 0xff;
filter[2] = p_transport_stream_id & 0xff;
@@ -417,6 +418,9 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const
mask[7] = 0xFF;
memset(&mask[8], 0x00, 8);
std::vector<std::pair<int,int> > sidpmt;
scan_parse_pat( sidpmt );
do {
if ((dmx->sectionFilter(0x11, filter, mask, 8) < 0) || (dmx->Read(buffer, SDT_SIZE) < 0)) {
delete dmx;
@@ -433,7 +437,16 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const
EIT_schedule_flag = buffer[pos + 2] & 0x02;
EIT_present_following_flag = buffer[pos + 2] & 0x01;
running_status = buffer [pos + 3] & 0xE0;
free_CA_mode = buffer [pos + 3] & 0x10;
for (unsigned short i=0; i<sidpmt.size(); i++){
if(sidpmt[i].first == service_id){
tmp_free_CA_mode = scan_parse_pmt( sidpmt[i].second, sidpmt[i].first );
}
}
if(tmp_free_CA_mode == -1)
free_CA_mode = buffer [pos + 3] & 0x10;
else
free_CA_mode = tmp_free_CA_mode;
descriptors_loop_length = ((buffer[pos + 3] & 0x0F) << 8) | buffer[pos + 4];
for (pos2 = pos + 5; pos2 < pos + descriptors_loop_length + 5; pos2 += buffer[pos2 + 1] + 2) {
@@ -452,6 +465,7 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const
break;
}
}
free_CA_mode = -1;
}
}
while (filter[4]++ != buffer[7]);

View File

@@ -2413,7 +2413,7 @@ printf("[zapit] sdt monitor started\n");
printf("[sdt monitor] wakeup...\n");
wtime = 0;
if(scan_runs)
if(scan_runs || (currentMode & RECORD_MODE))
continue;
updated = 0;
@@ -2437,6 +2437,7 @@ printf("[sdt monitor] wakeup...\n");
printf("[sdt monitor] TP already updated.\n");
continue;
}
curchans.clear();
ret = parse_current_sdt(transport_stream_id, original_network_id, satellitePosition, freq);
if(ret)
continue;