For info, I have now updated my dvdauthor patch to work with the 0.6.14
version of dvdauthor (the latest stable release).
The patch is available via my Howto on the ivtv wiki site, at
http://ivtvdriver.org/index.php/Howto:ivtv_for_dvdauthor .
Please use the Howto on the Wiki rather than the version I posted here a
couple of days ago, as I have corrected a couple of minor errors.
I also attach a copy of the patch to this mail for ease of reference,
although again you should probably use the version at the wiki as it may
have been updated.
Kind regards to all,
MJC
30 May 2008
--- src/dvdvob_dist.c 2008-05-30 22:07:22.000000000 +0100
+++ src/dvdvob.c 2008-05-30 22:09:43.000000000 +0100
@@ -240,25 +240,51 @@
buf[2] == 1 &&
buf[3] == 0xba )
{
+ int offs = (buf[17] == 0xbb) ? 24 : 0;
writescr(buf+4,readscr(buf+4)+tsoffs);
// 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];
@@ -548,7 +574,7 @@
scanvideoptr(va,buf+i,thisvi,cursect,vsi);
}
if( !va->vd.vmpeg )
- vobgroup_set_video_attr(va,VIDEO_MPEG,"mpeg1");
+ vobgroup_set_video_attr(va,VIDEO_MPEG,"mpeg2");
// if the mpeg version changed, then rerun scanvideoframe, because
// scanvideoptr updates the aspect ratio in the sequence header
if( mpf != va->vd.vmpeg ) {
@@ -824,6 +850,7 @@
int FindVobus(char *fbase,struct vobgroup *va,int ismenu)
{
unsigned char *buf;
+ unsigned char *buf_copy = (unsigned char*) malloc(2048);
int cursect=0,fsect=-1,vnum,outnum=-ismenu+1;
int vobid=0;
struct mp2info {
@@ -837,6 +864,7 @@
int i,j;
int hadfirstvobu=0;
pts_t backoffs=0, lastscr=0;
+ int generate_vobu=0,copy_packet=0,tsoffs=0;
struct vob *s=va->vobs[vnum];
int prevvidsect=-1;
struct vscani vsi;
@@ -869,8 +897,9 @@
}
buf=writegrabbuf();
- i=fread(buf,1,2048,vf.h);
- if( i!=2048 ) {
+ if (copy_packet == 1 ) {
+ memcpy( buf, buf_copy, 2048);
+ } else if( 2048 != (i=fread(buf,1,2048,vf.h)) ) {
if( i==-1 ) {
fprintf(stderr,"\nERR: Error while reading: %s\n",strerror(errno));
exit(1);
@@ -986,6 +1015,38 @@
writeundo();
continue;
}
+
+ if( fsect == -1 ) {
+ char newname[200];
+ fsect=0;
+ if( outnum >= 0)
+ sprintf(newname, "%s_%d.VOB", fbase,outnum);
+ else
+ 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
+ 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( buf[0]==0 && buf[1]==0 && buf[2]==1 && buf[3]==0xba ) {
pts_t newscr=readscr(buf+4);
if( newscr < lastscr ) {
@@ -997,16 +1058,15 @@
backoffs=newscr;
}
transpose_ts(buf,-backoffs);
- if( fsect == -1 ) {
- char newname[200];
- fsect=0;
- if( fbase ) {
- if( outnum>=0 )
- sprintf(newname,"%s_%d.VOB",fbase,outnum);
- else
- strcpy(newname,fbase);
- writeopen(newname);
- }
+ 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);
}
if( buf[14] == 0 &&
buf[15] == 0 &&
@@ -1051,7 +1111,7 @@
printvobustatus(va,cursect);
vsi.lastrefsect=0;
vsi.firstgop=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");
}
}
@@ -1369,6 +1429,7 @@
}
}
writeclose();
+ free(buf_copy);
printvobustatus(va,cursect);
fprintf(stderr,"\n");
free(crs);
_______________________________________________
ivtv-users mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-users