#include "parser.h"
#include <stdio.h>
#include <string.h> // fro strcmp
void readboxsize(FILE* ifs, long& boxsize)
{
if(ifs){
unsigned char sizeC4[4];
fread(sizeC4, 1,sizeof(sizeC4), ifs);
boxsize = sizeC4[3]+sizeC4[2]*0x100+sizeC4[1]*0x10000+sizeC4[0]*0x1000000;
}
}
void readboxname(FILE* ifs, char* boxname)
{
if(ifs)
{
fread(boxname, sizeof(char), 4, ifs);
}
boxname[4] = 0;
}
void read4size(FILE* ifs, long& size)
{
if(ifs){
unsigned char sizeC4[4];
fread(sizeC4, 1,sizeof(sizeC4), ifs);
size = sizeC4[3]+sizeC4[2]*0x100+sizeC4[1]*0x10000+sizeC4[0]*0x1000000;
}
}
void readname(FILE* ifs, char* name)
{
if(ifs)
{
fread(name, sizeof(char), 4, ifs);
}
name[4] = 0;
}
// 返回video track内容的绝对地址
long find_video_track(FILE* filename)
{
long boxsize = 0;
char boxname[5];
long pre_track_size;
char track_type[5];
long track_loc = 0;
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "moov"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中字符串"moov"的最后字符
loop:
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "trak"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文哪募刚胫赶蛄宋募凶址?trak"的最后字符
track_loc = ftell(filename);
pre_track_size = boxsize;
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "mdia"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中字符串"mdia"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "hdlr"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中字符串"hdlr"的最后
// 跳过hdlr box中的version和pre_defined
fseek(filename, 8, SEEK_CUR);
readname(filename, track_type);
if (!strcmp(track_type, "vide"))
{
return track_loc;
}
else
{
fseek(filename, track_loc+pre_track_size-8, SEEK_SET);
goto loop;
}
}
// 返回video track box中stsz box内容的文件绝对地址
long find_video_stsz(FILE* filename)
{
long video_track_loc;
long boxsize = 0;
char boxname[5];
video_track_loc = find_video_track(filename);
fseek(filename, video_track_loc, SEEK_SET);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "mdia"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"mdia"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "minf"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"minf"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "stbl"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"stbl"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "stsz"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"stsz"的最后字符
return ftell(filename);
}
// 返回video track box中stsc box内容的文件绝对地址
long find_video_stsc(FILE* filename)
{
long video_track_loc;
long boxsize = 0;
char boxname[5];
video_track_loc = find_video_track(filename);
fseek(filename, video_track_loc, SEEK_SET);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "mdia"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"mdia"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "minf"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"minf"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "stbl"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"stbl"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "stsc"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"stsc"的最后字符
return ftell(filename);
}
// 返回video track box中stco box内容的文件绝对地址
long find_video_stco(FILE* filename)
{
long video_track_loc;
long boxsize = 0;
char boxname[5];
video_track_loc = find_video_track(filename);
fseek(filename, video_track_loc, SEEK_SET);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "mdia"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"mdia"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "minf"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"minf"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "stbl"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"stbl"的最后字符
readboxsize(filename, boxsize);
readboxname(filename, boxname);
while (strcmp(boxname, "stco"))
{
fseek(filename, boxsize-8, SEEK_CUR);
readboxsize(filename, boxsize);
readboxname(filename, boxname);
} // 此时文件指针指向了文件中video track中字符串"stco"的最后字符
return ftell(filename);
}
评论1