📄 dvbtune.c
字号:
} j += 2+buf[i+j+1]; } break; case IRDETO_CA_SYSTEM: case BETA_CA_SYSTEM: pid = ((buf[i+2] & 0x1f) << 8) | buf[i+3]; printf("<ca_system_descriptor type=\"irdeto\" system_id=\"0x%04x\" ecm_pid=\"%d\">\n",k,pid); break; case NAGRA_CA_SYSTEM: pid = ((buf[i+2] & 0x1f) << 8) | buf[i+3]; printf("<ca_system_descriptor type=\"nagra\" system_id=\"0x%04x\" ecm_pid=\"%d\">\n",k,pid); break; case CONAX_CA_SYSTEM: pid = ((buf[i+2] & 0x1f) << 8) | buf[i+3]; printf("<ca_system_descriptor type=\"conax\" system_id=\"0x%04x\" ecm_pid=\"%d\">\n",k,pid); break; case VIDEOGUARD_CA_SYSTEM: pid = ((buf[i+2] & 0x1f) << 8) | buf[i+3]; printf("<ca_system_descriptor type=\"videoguard\" system_id=\"0x%04x\" ecm_pid=\"%d\">\n",k,pid); break; default: pid = ((buf[i+2] & 0x1f) << 8) | buf[i+3]; printf("<ca_system_descriptor type=\"unknown\" system_id=\"0x%04x\">\n",k); break; } i+=descriptor_length; descriptor_length=0; break; case 0x40: // network_name// printf("<network_name tag=\"0x40\">"); j=descriptor_length; while(j > 0) {// printf("%c",buf[i++]); j--; } descriptor_length=0;// printf("</network_name>\n"); break; case 0x41: // service_list// printf("<services tag=\"0x41\" n=\"%d\">\n",descriptor_length/3); while (descriptor_length > 0) {// printf("<service id=\"%d\" type=\"%d\" />\n",(buf[i]<<8)|buf[i+1],buf[i+2]); i+=3; descriptor_length-=3; }// printf("</services>\n"); break; case 0x43: // satellite_delivery_system freq=(unsigned int)(buf[i]<<24)|(buf[i+1]<<16)|(buf[i+2]<<8)|buf[i+3]; sprintf(tmp,"%x",freq); transponder.freq=atoi(tmp)*10; i+=4; transponder.pos=(buf[i]<<8)|buf[i+1]; i+=2; transponder.we_flag=(buf[i]&0x80)>>7; pol=(buf[i]&0x60)>>5; switch(pol) { case 0 : transponder.pol='H'; break; case 1 : transponder.pol='V'; break; case 2 : transponder.pol='L'; break; case 3 : transponder.pol='R'; break; } transponder.mod=buf[i]&0x1f; i++; sr=(unsigned int)(buf[i]<<24)|(buf[i+1]<<16)|(buf[i+2]<<8)|(buf[i+3]&0xf0); sr=(unsigned int)(sr >> 4); sprintf(tmp,"%x",sr); transponder.srate=atoi(tmp)*100; i+=4; descriptor_length=0; add_transponder(transponder);// printf("<satellite_delivery tag=\"0x43\" freq=\"%05d\" srate=\"%d\" pos=\"%04x\" we_flag=\"%d\" polarity=\"%c\" modulation=\"%d\" />\n",transponder.freq,transponder.srate,transponder.pos,transponder.we_flag,transponder.pol,transponder.mod); break; case 0x48: // service_description service_type=buf[i++]; printf("<description tag=\"0x48\" type=\"%d\"",service_type); descriptor_length--; j=buf[i++]; descriptor_length-=(j+1); printf(" provider_name=\"");; while(j > 0) { printf("%s",xmlify(buf[i++])); j--; } printf("\" service_name=\""); j=buf[i++]; descriptor_length-=(j+1); while(j > 0) { printf("%s",xmlify(buf[i])); i++; j--; } printf("\" />\n"); break; case 0x49: // country_availability: printf("<country_availability tag=\"0x49\" type=\"%d\" countries=\" ",(buf[i]&0x80)>>7); i++; j=descriptor_length-1; while (j > 0) { printf("%c",buf[i++]); j--; } printf("\" />\n"); descriptor_length=0; break; case 0x4c: printf("<time_shifted_copy_of tag=\"0x4c\" service_id=\"%d\" />\n",(buf[i]<<8)|buf[i+1]); i+=descriptor_length; descriptor_length=0; break; case 0x52: // stream_identifier_descriptor printf("<stream_id id=\"%d\" />\n",buf[i]); i+=descriptor_length; descriptor_length=0; break; case 0x53: printf("<ca_identifier tag=\"0x53\" length=\"%02x\">\n",descriptor_length); for (j=0;j<descriptor_length;j+=2) { k=(buf[i+j]<<8)|buf[i+j+1]; printf("<ca_system_id>%04x</ca_system_id>\n",k); } i+=descriptor_length; descriptor_length=0; printf("</ca_identifier>\n"); break; case 0x56: j=0; printf("<teletext tag=\"0x56\">\n"); while (j < descriptor_length) { printf("<teletext_info lang=\""); printf("%s",xmlify(buf[i])); printf("%s",xmlify(buf[i+1])); printf("%s",xmlify(buf[i+2])); k=(buf[i+3]&0x07); printf("\" type=\"%d\" page=\"%d%02x\" />\n",(buf[i+3]&0xf8)>>3,(k==0 ? 8 : k),buf[i+4]); i+=5; j+=5; } printf("</teletext>\n"); descriptor_length=0; break; case 0x59: j=0; printf("<subtitling_descriptor tag=\"0x59\">\n"); while (j < descriptor_length) { printf("<subtitle_stream lang=\""); printf("%s",xmlify(buf[i])); printf("%s",xmlify(buf[i+1])); printf("%s",xmlify(buf[i+2])); printf("\" type=\"%d\" composition_page_id=\"%04x\" ancillary_page_id=\"%04x\" />\n",buf[i+3],(buf[i+4]<<8)|buf[i+5],(buf[i+6]<<8)|buf[i+7]); i+=8; j+=8; } printf("</subtitling_descriptor>\n"); descriptor_length=0; break; case 0x6a: printf("<ac3_descriptor tag=\"0x6a\" data=\""); for (j=0;j<descriptor_length;j++) printf("%02x",buf[i+j]); printf("\" />\n"); i+=descriptor_length; descriptor_length=0; break; case 0xc5: // canal_satellite_radio_descriptor /* This is guessed from the data */ printf("<canal_radio tag=\"0x%02x\" id=\"%d\" name=\"",descriptor_tag,buf[i]); i++; for (j=0;j<descriptor_length;j++) if (buf[i+j]!=0) printf("%c",buf[i+j]); printf("\" />\n"); i+=descriptor_length; descriptor_length=0; break; default: printf("<descriptor tag=\"0x%02x\" data=\"",descriptor_tag); for (j=0;j<descriptor_length;j++) printf("%02x",buf[i+j]); printf("\" text=\""); for (j=0;j<descriptor_length;j++) printf("%c",(isalnum(buf[i+j]) ? buf[i+j] : '.')); printf("\" />\n"); i+=descriptor_length; descriptor_length=0; break; } } }}void dump(char* fname, int len, char* buf) { FILE* f; f=fopen(fname,"w"); if (f) { fwrite(buf,1,len,f); fclose(f); }}int scan_nit(int x) { int fd_nit; int n,seclen; int i; struct pollfd ufd; unsigned char buf[4096]; struct dmx_sct_filter_params sctFilterParams; int info_len,network_id; if((fd_nit = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){ perror("fd_nit DEVICE: "); return -1; } sctFilterParams.pid=0x10; memset(&sctFilterParams.filter,0,sizeof(sctFilterParams.filter)); sctFilterParams.timeout = 0; sctFilterParams.flags = DMX_IMMEDIATE_START; sctFilterParams.filter.filter[0]=x; sctFilterParams.filter.mask[0]=0xff; if (ioctl(fd_nit,DMX_SET_FILTER,&sctFilterParams) < 0) { perror("NIT - DMX_SET_FILTER:"); close(fd_nit); return -1; } ufd.fd=fd_nit; ufd.events=POLLPRI; if (poll(&ufd,1,10000) < 0 ) { fprintf(stderr,"TIMEOUT on read from fd_nit\n"); close(fd_nit); return -1; } if (read(fd_nit,buf,3)==3) { seclen=((buf[1] & 0x0f) << 8) | (buf[2] & 0xff); n = read(fd_nit,buf+3,seclen); if (n==seclen) { seclen+=3;// dump("nit.dat",seclen,buf);// printf("<nit>\n"); network_id=(buf[3]<<8)|buf[4];// printf("<network id=\"%d\">\n",network_id); info_len=((buf[8]&0x0f)<<8)|buf[9]; i=10; parse_descriptors(info_len,&buf[i]); i+=info_len; i+=2; while (i < (seclen-4)) { transponder.id=(buf[i]<<8)|buf[i+1]; i+=2; transponder.onid=(buf[i]<<8)|buf[i+1]; i+=2; // printf("<transponder id=\"%d\" onid=\"%d\">\n",transponder.id,transponder.onid); info_len=((buf[i]&0x0f)<<8)|buf[i+1]; i+=2; parse_descriptors(info_len,&buf[i]);// printf("</transponder>\n"); i+=info_len; }// printf("</network>\n");// printf("</nit>\n"); } else { fprintf(stderr,"Under-read bytes for NIT - wanted %d, got %d\n",seclen,n); } } else { fprintf(stderr,"Nothing to read from fd_nit\n"); } close(fd_nit); return(0);}void scan_pmt(int pid,int sid,int change) { int fd_pmt; int n,seclen; int i; unsigned char buf[4096]; struct dmx_sct_filter_params sctFilterParams; int service_id; int info_len,es_pid,stream_type; struct pollfd ufd; // printf("Scanning pmt: pid=%d, sid=%d\n",pid,sid); if (pid==0) { return; } if((fd_pmt = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){ perror("fd_pmt DEVICE: "); return; } sctFilterParams.pid=pid; memset(&sctFilterParams.filter,0,sizeof(sctFilterParams.filter)); sctFilterParams.timeout = 0; sctFilterParams.flags = DMX_IMMEDIATE_START; sctFilterParams.filter.filter[0]=0x02; sctFilterParams.filter.mask[0]=0xff; if (ioctl(fd_pmt,DMX_SET_FILTER,&sctFilterParams) < 0) { perror("PMT - DMX_SET_FILTER:"); close(fd_pmt); return; } ufd.fd=fd_pmt; ufd.events=POLLPRI; if (poll(&ufd,1,10000) < 0) { fprintf(stderr,"TIMEOUT reading from fd_pmt\n"); close(fd_pmt); return; } if (read(fd_pmt,buf,3)==3) { seclen=((buf[1] & 0x0f) << 8) | (buf[2] & 0xff); n = read(fd_pmt,buf+3,seclen); if (n==seclen) { seclen+=3;// printf("<pmt>\n"); service_id=(buf[3]<<8)|buf[4];// printf("<service id=\"%d\" pmt_pid=\"%d\">\n",service_id,pid); if (sid != service_id) { close(fd_pmt); scan_pmt(pid, sid, change); return; } info_len=((buf[10]&0x0f)<<8)|buf[11]; i=12; parse_descriptors(info_len,&buf[i]); i+=info_len; while (i < (seclen-4)) { stream_type=buf[i++]; es_pid=((buf[i]&0x1f)<<8)|buf[i+1]; printf("<stream type=\"%d\" pid=\"%d\">\n",stream_type,es_pid); if (change) { if ((vpid==0) && ((stream_type==1) || (stream_type==2))) { vpid=es_pid; } if ((apid==0) && ((stream_type==3) || (stream_type==4))) { apid=es_pid; } } i+=2; info_len=((buf[i]&0x0f)<<8)|buf[i+1]; i+=2; parse_descriptors(info_len,&buf[i]); i+=info_len; printf("</stream>\n"); }// printf("</service>\n");// printf("</pmt>\n"); } else { printf("Under-read bytes for PMT - wanted %d, got %d\n",seclen,n); } } else { fprintf(stderr,"Nothing to read from fd_pmt\n"); } close(fd_pmt);}void scan_pat() { int fd_pat; int n,seclen; int i; unsigned char buf[4096]; struct dmx_sct_filter_params sctFilterParams; struct pollfd ufd; pat_t pat; if((fd_pat = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){ perror("fd_pat DEVICE: "); return; } sctFilterParams.pid=0x0; memset(&sctFilterParams.filter,0,sizeof(sctFilterParams.filter)); sctFilterParams.timeout = 0; sctFilterParams.flags = DMX_IMMEDIATE_START; sctFilterParams.filter.filter[0]=0x0; sctFilterParams.filter.mask[0]=0xff; if (ioctl(fd_pat,DMX_SET_FILTER,&sctFilterParams) < 0) { perror("PAT - DMX_SET_FILTER:"); close(fd_pat); return; } ufd.fd=fd_pat; ufd.events=POLLPRI; if (poll(&ufd,1,10000) < 0) { fprintf(stderr,"TIMEOUT reading from fd_pat\n"); close(fd_pat); return; } if (read(fd_pat,buf,3)==3) { seclen=((buf[1] & 0x0f) << 8) | (buf[2] & 0xff); n = read(fd_pat,buf+3,seclen); if (n==seclen) { seclen+=3; // printf("Read %d bytes - Found %d services\n",seclen,(seclen-11)/4); // for (i=0;i<seclen+3;i++) { printf("%02x ",buf[i]); }// printf("<pat>\n"); i=8; while (i < seclen-4) { pat.service_id=(buf[i]<<8)|buf[i+1]; pat.pmt_pid=((buf[i+2]&0x1f)<<8)|buf[i+3]; add_pat(pat); /* if (service_id!=0) { scan_pmt(pmt_pid,service_id,(service_id==pnr)); } else { printf("<service id=\"0\" pmt_pid=\"%d\">\n</service>\n",pmt_pid); } */ i+=4; }// printf("</pat>\n"); } else { printf("Under-read bytes for PAT - wanted %d, got %d\n",seclen,n); } } else { fprintf(stderr,"Nothing to read from fd_pat\n"); } close(fd_pat);}void scan_sdt() { int fd_sdt; int n,seclen; int i,k; int max_k; unsigned char buf[4096]; struct dmx_sct_filter_params sctFilterParams; int ca,service_id,loop_length; struct pollfd ufd; if((fd_sdt = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){ perror("fd_sdt DEVICE: "); return; } sctFilterParams.pid=0x11; memset(&sctFilterParams.filter,0,sizeof(sctFilterParams.filter)); sctFilterParams.timeout = 0; sctFilterParams.flags = DMX_IMMEDIATE_START; sctFilterParams.filter.filter[0]=0x42; sctFilterParams.filter.mask[0]=0xff; if (ioctl(fd_sdt,DMX_SET_FILTER,&sctFilterParams) < 0) { perror("SDT - DMX_SET_FILTER:"); close(fd_sdt); return; } max_k=1;// printf("<sdt>\n");for (k=0;k<max_k;k++) { ufd.fd=fd_sdt; ufd.events=POLLPRI; if (poll(&ufd,1,2000) < 0 ) { fprintf(stderr,"TIMEOUT on read from fd_sdt\n"); close(fd_sdt); return; } if (read(fd_sdt,buf,3)==3) { seclen=((buf[1] & 0x0f) << 8) | (buf[2] & 0xff); n = read(fd_sdt,buf+3,seclen); if (n==seclen) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -