void cGenIndex::Work(void) { eof=error=pstart=false; memset(fileSize,0,sizeof(fileSize)); if(rewrite) { writeFile=writeName->OpenWrite(); if(writeFile<0) { printf("Failed to open output file(s)\n"); return; } } replayFile=fileName->Open(); readNo=fileName->FileNumber(); fileSize[readNo]=fileName->FileSize(); readOffset=0; fileNo=rewrite ? 1 : readNo; fileOffset=0; splitOffset=splitsize*MEGABYTE(1); sSize=0; if(replayFile>=0) { if(index->Open()) { int lastoff=0; while(!error && NextFile()) { int count=read(replayFile,buff,sizeof(buff)); if(count<0) { printf("read vdr: %s\n",strerror(errno)); return; } else if(count==0) { if(fileSize[readNo]!=readOffset) printf("file %d read/size mismatch\n",readNo); eof=true; continue; } else { readOffset+=count; if(!quiet && (readOffset<lastoff || readOffset>lastoff+KILOBYTE(256)) && fileSize[readNo]) { printf("offset %lld %d%%\r",readOffset,(int)(readOffset*100/fileSize[readNo])); fflush(stdout); lastoff=readOffset; } int used=Process(buff,count); if(used<0) { error=true; break; } if(count-used) printf("bummer, count!=0\n"); } } if(!error && !quiet) Statistics(); } } else printf("Failed to open input file(s)\n"); }
bool cGenIndex::NextFile(void) { if(replayFile>=0 && eof) { replayFile=fileName->NextFile(); readNo=fileName->FileNumber(); readOffset=0; fileSize[readNo]=fileName->FileSize(); } eof=false; return replayFile>=0; }
int cGenIndex::Output(const uchar *data, int len) { if(rewrite && pstart && sSize>0) { if(!SafeWrite(writeFile,store,sSize)) { error=true; return -1; } sSize=0; } int ftype=0; if(scan) { const uchar *d=data; for(int i=len ; i>0 ; i--) { uchar c=*d++; if(skip>0) { skip--; continue; } // searching for sequence 00 00 01 00 xx PIC switch(state) { case 0: case 1: case 3: if(c==0x00) state++; else state=0; break; case 2: if(c==0x01) state++; else if(c!=0x00) state=0; break; case 4: state++; break; case 5: ftype=(c>>3)&0x07; if(ftype<I_FRAME || ftype>B_FRAME) { printf("unknown picture type %d at %d\n",ftype,packetOffset); ftype=0; } scan=false; state=0; i=0; break; } } } if(rewrite) { if(scan && fileOffset>=splitOffset && (pstart || sSize)) { if(sSize+len>sizeof(store)) { printf("Oops! Packet buffer overflow\n"); error=true; return -1; } memcpy(store+sSize,data,len); sSize+=len; } else { if(fileOffset>=splitOffset && sSize && ftype==I_FRAME) { writeFile=writeName->NextWriteFile(); if(writeFile<0) { printf("Failed to open output file(s)\n"); error=true; return -1; } packetNo=fileNo=writeName->FileNumber(); packetOffset=0; fileOffset=sSize; } if(ftype>=I_FRAME) { index->Write(packetNo,packetOffset,ftype); } if(sSize>0) { if(!SafeWrite(writeFile,store,sSize)) { error=true; return -1; } sSize=0; } if(!SafeWrite(writeFile,data,len)) { error=true; return -1; } } } else { if(ftype>=I_FRAME) index->Write(packetNo,packetOffset,ftype); } Count(len); pstart=false; return len; }