📄 movfile.c
字号:
case SIGN_URL :
if (MovReadUrl(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_URN :
if (MovReadUrn(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
default :
MovFseek(videoFile, length - (FOURBYTE << 1), SEEK_CUR);
break;
}
if ((sumLength + (FOURBYTE << 1)) >= boxSize)
{
return MOV_FILE_BOX_PARSE_SUCCESS;
}
}//for
}//else
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadStbl()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadStbl(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
uint32 length = 0x0;
DWORD tag = 0x0;
uint32 sumLength = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
if (boxSize <= 8)
{
return MOV_FILE_BOX_PARSE_SUCCESS;
}
else
{
for (; ;)
{
MovFread(&length, sizeof(uint32), 1, videoFile); //读取这个box的长度
length = BYTESWAP(length);
sumLength += length;
MovFread(&tag, sizeof(DWORD), 1, videoFile);
switch(tag)
{
case SIGN_STSD :
if (MovReadStsd(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_STTS :
if (MovReadStts(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
/*case SIGN_CTTS :
if (MovReadCtts(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;*/
case SIGN_STSC :
if (MovReadStsc(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_STSZ :
if (MovReadStsz(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
/*case SIGN_STZ2 :
if (MovReadStz2(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;*/
case SIGN_STCO :
if (MovReadStco(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
/*case SIGN_CO64 :
if (MovReadCo64(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;*/
case SIGN_STSS :
if (MovReadStss(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
/*case SIGN_STSH :
if (MovReadStsh(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_PADB :
if (MovReadPadb(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_STDP :
if (MovReadStdp(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_SGPD :
if (MovReadSgpd(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_SDTP :
if (MovReadSdtp(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_SBGP :
if (MovReadSbgp(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_SUBS :
if (MovReadSubs(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;*/
default :
MovFseek(videoFile, length - (FOURBYTE << 1), SEEK_CUR);
break;
}
if ((sumLength + (FOURBYTE << 1)) >= boxSize)
{
return MOV_FILE_BOX_PARSE_SUCCESS;
}
}//for
}//else
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadMdhd()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadMdhd(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
DWORD vsfl = 0x0;
uint32 timeScale = 0x0;
uint64 tempVar = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFread(&vsfl,sizeof(DWORD), 1, videoFile);
vsfl = BYTESWAP(vsfl);
if (vsfl&0xff000000)
{
MovFseek(videoFile, FOURBYTE << 2, SEEK_CUR);
MovFread(&timeScale, sizeof(uint32), 1, videoFile);
timeScale = BYTESWAP(timeScale);
if (IsTheTrackVideo == SIGN_AUDIO)
{
pFileinf->audioTimeScale = timeScale;
MovFread(&pFileinf->uint64AudioDuration, sizeof(uint64), 1, videoFile);
pFileinf->uint64AudioDuration = UINT64SWAP(pFileinf->uint64AudioDuration);
}
else
{
if (IsTheTrackVideo == SIGN_VIDEO)
{
pFileinf->videoTimeScale = timeScale;
sVideoTimeScale = timeScale;
MovFread(&pFileinf->uint64VideoDuration, sizeof(uint64), 1, videoFile);
pFileinf->uint64VideoDuration = UINT64SWAP(pFileinf->uint64VideoDuration);
sUint64VideoDuration = pFileinf->uint64VideoDuration;
tempVar = pFileinf->uint64VideoDuration * 1000;
pFileinf->length = (uint32)(tempVar / (uint64)pFileinf->videoTimeScale);
}
else
{
sVideoTimeScale = timeScale;
MovFread(&sUint64VideoDuration, sizeof(uint64), 1, videoFile);
sUint64VideoDuration = UINT64SWAP(sUint64VideoDuration);
}
}
MovFseek(videoFile, boxSize - (FOURBYTE * 10), SEEK_CUR);
}
else
{
MovFseek(videoFile, FOURBYTE << 1, SEEK_CUR);
MovFread(&timeScale, sizeof(uint32), 1, videoFile);
timeScale = BYTESWAP(timeScale);
if (IsTheTrackVideo == SIGN_AUDIO)
{
pFileinf->audioTimeScale = timeScale;
MovFread(&pFileinf->uint32AudioDuration, sizeof(uint32), 1, videoFile);
pFileinf->uint32AudioDuration = BYTESWAP(pFileinf->uint32AudioDuration);
}
else
{
if (IsTheTrackVideo == SIGN_VIDEO)
{
pFileinf->videoTimeScale = timeScale;
sVideoTimeScale = timeScale;
MovFread(&pFileinf->uint32VideoDuration, sizeof(uint32), 1, videoFile);
pFileinf->uint32VideoDuration = BYTESWAP(pFileinf->uint32VideoDuration);
sUint32VideoDuration = pFileinf->uint32VideoDuration;
tempVar = (uint64)pFileinf->uint32VideoDuration * 1000;
pFileinf->length = (uint32)(tempVar / (uint64)pFileinf->videoTimeScale);
}
else
{
sVideoTimeScale = timeScale;
MovFread(&sUint32VideoDuration, sizeof(uint32), 1, videoFile);
sUint32VideoDuration = BYTESWAP(sUint32VideoDuration);
}
}
MovFseek(videoFile, boxSize - (FOURBYTE * 7), SEEK_CUR);
}
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadHdlr()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadHdlr(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
DWORD tag =0x0;
uint64 tempVar = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, FOURBYTE << 1, SEEK_CUR);
MovFread(&tag, sizeof(DWORD), 1, videoFile);
if (tag == HANDLER_VIDE)
{
IsTheTrackVideo = SIGN_VIDEO;
pFileinf->videoTimeScale = sVideoTimeScale;
pFileinf->videoFlag = TRUE;
if (sUint32VideoDuration != 0x0)
{
pFileinf->uint32VideoDuration = sUint32VideoDuration;
tempVar = (uint64)sUint32VideoDuration * 1000;
pFileinf->length = (uint32)(tempVar / (uint64)sVideoTimeScale);
}
else
{
if (sUint64VideoDuration != 0x0)
{
pFileinf->uint64VideoDuration = sUint64VideoDuration;
tempVar = sUint64VideoDuration * 1000;
pFileinf->length = (uint32)(tempVar / (uint64)sVideoTimeScale);
}
}
}
else
{
if (tag == HANDLER_SOUN)
{
if (IsTheTrackVideo == -1)
{
pFileinf->audioTimeScale == sVideoTimeScale;
if (sUint32VideoDuration != 0x0)
{
pFileinf->uint32AudioDuration = sUint32VideoDuration;
}
else
{
if (sUint64VideoDuration != 0x0)
{
pFileinf->uint64AudioDuration = sUint64VideoDuration;
}
}
}
IsTheTrackVideo = SIGN_AUDIO;
pFileinf->audioFlag = TRUE;
}
else
{
IsTheTrackVideo = SIGN_OTHER;
}
}
MovFseek(videoFile, boxSize -FOURBYTE * 5, SEEK_CUR);
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadMinf()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadMinf(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
uint32 length = 0x0;
DWORD tag = 0x0;
uint32 sumLength = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
if (boxSize <= 8)
{
return MOV_FILE_BOX_PARSE_SUCCESS;
}
else
{
for (; ;)
{
MovFread(&length, sizeof(uint32), 1, videoFile); //读取这个box的长度
length = BYTESWAP(length);
sumLength += length;
MovFread(&tag, sizeof(DWORD), 1, videoFile);
switch(tag)
{
/*case SIGN_VMHD :
if (MovReadVmhd(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_SMHD :
if (MovReadSmhd(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_HMHD :
if (MovReadHmhd(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_NMHD :
if (MovReadNmhd(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
case SIGN_DINF :
if (MovReadDinf(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;*/
case SIGN_STBL :
if (MovReadStbl(videoFile, pFileinf, length))
{
return MOV_FILE_BOX_PARSE_ERR;
}
break;
default :
MovFseek(videoFile, length - (FOURBYTE << 1), SEEK_CUR);
break;
}
if ((sumLength + (FOURBYTE << 1)) >= boxSize)
{
return MOV_FILE_BOX_PARSE_SUCCESS;
}
}//for
}//else
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadTkhd()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadTkhd(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
DWORD vsfl = 0x0;
WORD tag = 0x0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -