/**/ // // This routine extracts the bitrate from the content file. // The content file must contain PCRs // /**/ double getBitRate(FILE *fp) ...{ // variables used to get bit rate from content file uint64_t PCR0 =0, PCR1 =0; uint64_t PCRdelta; double bitRate =0; uint32_t mpegPackets =0; uint32_t gotPCR =0; unsigned char m2tTmp[256]; int length; unsigned int PID =0; //used to control "." output int sync =0; printf(" Scanning content file for bit rate "); for (;;) ...{ length = fread(m2tTmp, sizeof(uint8_t), 188, fp); if(length !=188) break; mpegPackets++; if (sync %1200==0 ) ...{ //show user something while we loop printf("."); //force it out-may not otherwise appear in real time fflush(stdout); } sync++; // look for the sync byte if(m2tTmp[0] !=0x47) ...{ printf("vpSendspts: data corruption in content file "); fclose(fp); exit(2); } // we are going to scan through the first 10 PCRs in this content. // According to the specifications that will be on the order of // every 40 milliseconds. We don't have to scan the whole file // to get a good sense of its validity and bit rate. // First see if the TS header indicates the presence of an // adaptation field. if(GET_DVBASI_ADAPT(m2tTmp) &0x02) ...{ // Get the adaptation field and look for the presence of // a PCR in the adaptation field if(GET_DVBASI_ADAPTLENGTH(m2tTmp) ==0) ...{ printf("Zero length AF "); continue; } if(GET_DVBASI_ADAPTFIELD(m2tTmp) &0x10) ...{ // Get the initial PCR and reset the counter if(gotPCR ==10) ...{ // skip the first few, some times they are bad! PID = GET_DVBASI_PID(m2tTmp); GET_DVBASI_PCR(m2tTmp, PCR0); mpegPackets =0; } // Look for the 10th PCR in this content and if((gotPCR >20) && PID == GET_DVBASI_PID(m2tTmp)) ...{ GET_DVBASI_PCR(m2tTmp, PCR1); PCRdelta = (uint64_t) ((uint64_t)PCR1 - (uint64_t)PCR0); bitRate = (double) ( ((double)(40608000000ULL)*((double)mpegPackets))/(double)(PCRdelta)); break; } gotPCR++; }// GET_DVBASI_ADAPTFIELD }//GET_DVBASI_ADAPT }// while read //rewind file rewind(fp); fflush(fp); return(bitRate); }