Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: Rebuilding index.vdr files
I've found some bugs in the method how i find the frames.
the program often found some frames "in a frame" or frames that aren't I B
or P-Frames.
Now it should be fixed. I've tested this with an ~1 h (Pro 7) recording and
the
index file didn't differ from the original file that VDR has produced.
btw. this doesn't work with "mplexed" files. It seems, that searching for
0x00 0x00 0x01 0xE0 does not return the right offset of a video frame.
Roland
------------- genindex.c ----------
#include <stdio.h>
#define readbuffersize 1024*128
#define SC_VIDEO 0xE0
#define SC_PICTURE 0x00
unsigned char ringbuf[readbuffersize];
int offset;
FILE* fp ;
FILE* idx;
int Foffset;
unsigned char buf(int p)
{
if ((p >= Foffset) && ( p < (Foffset+readbuffersize)) )
{return ringbuf[p-Foffset];}
Foffset=p;
if (fseek(fp,p,SEEK_SET)==0)
{
fread(ringbuf, 1, readbuffersize, fp);
return ringbuf[p-Foffset];
}
return 0;
}
int readfile(const unsigned char number )
{
int filesize;
int length;
int c;
int d;
int e;
char fname[20];
sprintf(fname,"%03d.vdr",number);
printf("\nReading:");
printf(fname);
printf("\n");
fp = fopen(fname, "r");
if(!fp) { printf("Could not open the file\n"); return -1;}
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
Foffset=filesize;
for (c=0;c < filesize-32;c++)
{
if (buf(c) == 0 && buf(c+1) == 0 && buf(c+2) == 1 && buf(c+3)==SC_VIDEO)
{
d=c+8;
d+= buf(d)+1;
length=(buf(c+4) << 8) + buf(c +5)+6;
e=length;
if (e > 256) { e=256;}
// I think the Picture Header must be in the
// first 256 Bytes (also makes program faster :-)
e+=d; // d is offset of SC_Video
for (;(d < e) && (d < filesize -32);d++)
{
if (buf(d) == 0 && buf(d+1) == 0 && buf(d+2) == 1 && buf(d+3)==SC_PICTURE)
{
char Ptype=(buf(d+5)>>3) & 0x07;
if (Ptype > 0 && Ptype < 4)
{
char i[8]={c,c>>8,c>>16,c>>24,Ptype,number,0};
if(fwrite(i, 1, 8, idx) != 8)
{ printf("Error writing index file\n"); return -1;}
if (((buf(d+5)>>3) & 0x07)==1)
{ printf("IFrame found at: %d kB
\r",(c/1024));
fflush(stdout);
c+=length;
d=c;
}
}
}
}
}
}
fclose(fp);
return 0;
}
int main()
{
int c;
idx = fopen("index.vdr", "w");
for (c=1;readfile(c)==0;c++) { }
fclose(idx);
return 0;
}
--
Info:
To unsubscribe send a mail to listar@linuxtv.org with "unsubscribe linux-dvb" as subject.
Home |
Main Index |
Thread Index