diff -urN dvdauthor-0.6.5/src/dvdauthor.c dvdauthor-0.6.5-new/src/dvdauthor.c --- dvdauthor-0.6.5/src/dvdauthor.c Tue Nov 4 20:58:27 2003 +++ dvdauthor-0.6.5-new/src/dvdauthor.c Thu Nov 6 21:18:01 2003 @@ -944,7 +944,7 @@ fprintf(stderr,"\n"); } -static void transpose_ts(unsigned char *buf,int tsoffs) +static void transpose_ts(unsigned char *buf,int scroffs, int tsoffs) { // pack scr if( buf[0] == 0 && @@ -952,25 +952,52 @@ buf[2] == 1 && buf[3] == 0xba ) { - writescr(buf+4,readscr(buf+4)+tsoffs); + int offs = (buf[17] == 0xbb) ? 24 : 0; + + writescr(buf+4,readscr(buf+4)+scroffs); // video/audio? // pts? - if( buf[14] == 0 && - buf[15] == 0 && - buf[16] == 1 && - (buf[17]==0xbd || (buf[17]>=0xc0 && buf[17]<=0xef)) && - (buf[21] & 128)) + if( buf[offs+14] == 0 && + buf[offs+15] == 0 && + buf[offs+16] == 1 && + (buf[offs+17]==0xbd || (buf[offs+17]>=0xc0 && buf[offs+17]<=0xef)) && + (buf[offs+21] & 128)) { - writepts(buf+23,readpts(buf+23)+tsoffs); + writepts(buf+offs+23,readpts(buf+offs+23)+tsoffs); // dts? - if( buf[21] & 64 ) { - writepts(buf+28,readpts(buf+28)+tsoffs); + if( buf[offs+21] & 64 ) { + writepts(buf+offs+28,readpts(buf+offs+28)+tsoffs); } } } } +int find_gop(unsigned char *buf) +{ + if (buf[14] == 0 && + buf[15] == 0 && + buf[16] == 1 && + buf[17] == 0xbb && + buf[38] == 0 && + buf[39] == 0 && + buf[40] == 1 && + buf[41] == 0xe0) + { + int i = 42; + while (i < 1024) + { + if (buf[i] == 0 && + buf[i+1] == 0 && + buf[i+2] == 1 && + buf[i+3] == 0xb8) + return 1; + i += 4; + } + } + return 0; +} + static int mpa_valid(unsigned char *b) { unsigned int v=(b[0]<<24)|(b[1]<<16)|(b[2]<<8)|b[3]; @@ -1376,6 +1403,7 @@ static int FindVobus(char *fbase,struct pgcgroup *va,int ismenu) { unsigned char *buf; + unsigned char *buf_copy = (unsigned char*) malloc(2048); FILE *h; int cursect=0,fsect=-1,fnum,pnum,outnum=-ismenu+1; int ispipe,vobid=0; @@ -1396,6 +1424,7 @@ for( fnum=0; fnumnumsources; fnum++ ) { int hadfirstvobu=0,chapterindex=0,backoffs=0,cellid=1; + int generate_vobu=0,copy_packet=0,tsoffs=0; struct vob *s=p->sources[fnum]; if( fnum && p->sources[fnum-1]->numvobus ) { struct vob *ps=p->sources[fnum-1]; @@ -1532,18 +1561,51 @@ writeundo(); continue; } - if( !hadfirstvobu && buf[0]==0 && buf[1]==0 && buf[2]==1 && buf[3]==0xba ) - backoffs=readscr(buf+4); - transpose_ts(buf,-backoffs); if( fsect == -1 ) { char newname[200]; fsect=0; - if( outnum>=0 ) - sprintf(newname,"%s_%d.VOB",fbase,outnum); - else - strcpy(newname,fbase); + strcpy(newname,fbase); writeopen(newname); } + + // we should get a VOBU before a video with GOP + if( (generate_vobu == 1 || hadfirstvobu == 0) && + copy_packet == 0 && find_gop(buf) ) + { + // create VOBU + // fprintf(stderr,"Found GOP with no VOBU, creating VOBU...\n"); + generate_vobu = 1; + copy_packet = 1; + memcpy( buf_copy, buf, 2048); + + buf[41] = 0xbf; + buf[42] = 0x03; + buf[43] = 0xd4; + buf[44] = 0x81; + memset( buf+45, 0, 2048-45); + buf[1026] = 1; + buf[1027] = 0xbf; + buf[1028] = 0x03; + buf[1029] = 0xfa; + buf[1030] = 0x81; + } else if (copy_packet == 1) + copy_packet = 0; + + if( !hadfirstvobu && buf[0]==0 && buf[1]==0 && buf[2]==1 && buf[3]==0xba ) + backoffs=readscr(buf+4); + + if( !hadfirstvobu && buf[0]==0 && buf[1]==0 && buf[2]==1 && buf[3]==0xba ) + { + int offs = (buf[17] == 0xbb) ? 24 : 0; + if( buf[offs+14] == 0 && + buf[offs+15] == 0 && + buf[offs+16] == 1 && + (buf[offs+17]==0xbd || (buf[offs+17]>=0xc0 && buf[offs+17]<=0xef)) && + (buf[offs+21] & 128)) + tsoffs = readpts(buf+offs+23); + } + transpose_ts(buf,-backoffs,-tsoffs); + if( buf[14] == 0 && buf[15] == 0 && buf[16] == 1 && @@ -1607,12 +1669,12 @@ if( !(s->numvobus&15) ) printvobustatus(va,cursect); vsi.lastrefsect=-1; - } else { + } else if (generate_vobu == 0 || copy_packet == 1) { fprintf(stderr,"WARN: System header found, but PCI/DSI information is not where expected\n\t(make sure your system header is 18 bytes!)\n"); } } if( !hadfirstvobu ) { - fprintf(stderr,"WARN: Skipping sector, waiting for first VOBU...\n"); + // fprintf(stderr,"WARN: Skipping sector, waiting for first VOBU...\n"); writeundo(); continue; } @@ -1744,6 +1806,7 @@ } } writeclose(); + free(buf_copy); printvobustatus(va,cursect); fprintf(stderr,"\n"); free(crs);