注意:不同的平台需要修改MY_MVHD结构
//不同的平台需要修改MY_MVHD结构
int _Comm_GetFileDurationMs(const char* src_filename)
{
int ifd = -1;
int iRetLen = 0;
int len = 0;
int offset = 0;
int ret = 0;
MY_MVHD myMvhd = {0};
MY_MVHD1 myMvhd1 = {0};
/*
00 00 6B 14 6D 6F 6F 76 00 00 00 6C [6D 76 68 64] mvhd
00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 E8
[00 00 EA C0] 00 01 00 00 01 00 00 00 00 00 00 00 DurationMs
*/
offset = 0x0020;
do {
ifd = open(src_filename, O_SYNC | O_RDWR);
if (-1 == ifd) {
ret = -4;
break;
}
if (lseek(ifd, offset, SEEK_SET) == (off_t)-1) {
ret = -5;
break;
}
len = sizeof(myMvhd);
iRetLen = read(ifd, (unsigned char*)&myMvhd, len);
if (iRetLen != len) {
ret = -6;
break;
}
}while(0);
if(ifd != -1)
close(ifd);
if(ret < 0) {
LOGV("[%s] ret = %d\n", src_filename, ret);
ret = 0;
} else {
//_Comm_DumpHexEx("mvhd", (char*)&myMvhd, len);
//LOGD("mvhd=%x [%02x %02x %02x %02x]\n", myMvhd.mvhd, myMvhd.DurationMs[0], myMvhd.DurationMs[1], myMvhd.DurationMs[2], myMvhd.DurationMs[3]);
if(myMvhd.mvhd == 0x6468766d) {
ret = myMvhd.DurationMs[0]<<24|myMvhd.DurationMs[1]<<16|myMvhd.DurationMs[2]<<8|myMvhd.DurationMs[3]<<0;
}
else //不一致就要在读取一次
{
offset = 0x0010;
do {
ifd = open(src_filename, O_SYNC | O_RDWR);
if (-1 == ifd) {
ret = -4;
break;
}
if (lseek(ifd, offset, SEEK_SET) == (off_t)-1) {
ret = -5;
break;
}
len = sizeof(myMvhd1);
iRetLen = read(ifd, (unsigned char*)&myMvhd1, len);
if (iRetLen != len) {
ret = -6;
break;
}
}while(0);
if(ifd != -1)
close(ifd);
if(ret < 0) {
LOGV("[%s] ret = %d\n", src_filename, ret);
ret = 0;
} else {
//_Comm_DumpHexEx("mvhd", (char*)&myMvhd1, len);
//LOGD("mvhd1=%x [%02x %02x %02x %02x]\n", myMvhd1.mvhd, myMvhd1.DurationMs[0], myMvhd1.DurationMs[1], myMvhd1.DurationMs[2], myMvhd1.DurationMs[3]);
if(myMvhd1.mvhd == 0x6468766d) {
ret = myMvhd1.DurationMs[0]<<24|myMvhd1.DurationMs[1]<<16|myMvhd1.DurationMs[2]<<8|myMvhd1.DurationMs[3]<<0;
}
else {
ret = -7;
}
}
}
}
//LOGI("[%s] DurationMs = %d\n", src_filename, ret);
return ret;
}