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