⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvbtune.c

📁 DVBtune is a simple tuning application for DVB cards supported by the Linux DVB driver
💻 C
📖 第 1 页 / 共 3 页
字号:
                   }                   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 + -