📄 movfile.c
字号:
/********************************************************************************************
* Copyright (C), 2008, Fuzhou Rockchip Co.,Ltd.
* All Rights Reserved
*
* File:
* MovFile.c
* Description:
*
* Author:
* guosl
* Note:
* None.
* $Log: MovFile.c,v $
* Revision 1.3 2008/07/18 11:09:37 HZF
* no message
*
* Revision 1.2 2008/07/18 09:31:07 HZF
* no message
*
* Revision 1.1 2008/07/08 07:29:20 HZF
* 增加3gp和MP4
*
* Revision 1.1 2008/5/16 14:43:19 guosl
* no message
*
*
*
*
********************************************************************************************/
#include "MovFile.h"
#include "system.h"
#include "MovVideoContrl.h"
STATIC uint32 sVideoTimeScale = 0x1;
STATIC uint32 sUint32VideoDuration = 0x0;
STATIC uint64 sUint64VideoDuration = 0x0;
MovFileinf gMovFile;
MOV_FILE *gMovFilePointer = NULL;
MOV_FILE *gMovAudioFilePointer = NULL;
WORD IsTheTrackVideo = -1;
SKIPSTATE gBeingSkip = NO_SKIP;
SKIPSTATE gVideoBeingSkip = NO_SKIP;
STATIC uint32 *sVideoSampleSizeIndex = NULL;
STATIC uint32 *sAudioSampleSizeIndex = NULL;
STATIC uint32 *sVideoSampleToChunkIndex = NULL;
STATIC uint32 *sAudioSampleToChunkIndex = NULL;
STATIC uint32 *sVideoChunkOffsetIndex = NULL;
STATIC uint32 *sAudioChunkOffsetIndex = NULL;
STATIC uint32 *sVideoTimeToSampleIndex = NULL;
STATIC uint32 *sAudioTimeToSampleIndex = NULL;
STATIC uint32 *sVideoSyncSampleIndex = NULL;
EXT int movLastSeekTime;
EXT int gSkipFlag;
EXT uint32 movTimerCount;
EXT LONG sMovFilledBlockNum;
EXT uint32 skipToSampleNo;
EXT int MovAudioSeekTime(int msTime);
EXT void MovAudioStart(void);
EXT void MovSetAudioPlayEnd(void);
EXT void MovSetAudioPlayNoEnd(void);
EXT BOOLEAN VideoAudioStop(UINT16 ReqType);
/********************************************************************************************
* Func:
* MovReadUrl()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadUrl(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, boxSize - (FOURBYTE << 1), SEEK_CUR);
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadDref()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadDref(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, boxSize - (FOURBYTE << 1), SEEK_CUR);
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadUrn()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadUrn(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, boxSize - (FOURBYTE << 1), SEEK_CUR);
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadStsd()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadStsd(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
if (IsTheTrackVideo == SIGN_OTHER)
{
MovFseek(videoFile, boxSize - (FOURBYTE << 1), SEEK_CUR);
}
else
{
int entries;
DWORD codeTag = 0x0;
int loop;
int entrySize;
MovFseek(videoFile, FOURBYTE, SEEK_CUR);
MovFread(&entries, sizeof(int), 1, videoFile);
entries = BYTESWAP(entries);
for (loop = 0x0; loop < entries; loop++)
{
MovFread(&entrySize, sizeof(int), 1, videoFile);
entrySize = BYTESWAP(entrySize);
MovFread(&codeTag, sizeof(DWORD), 1, videoFile);
if (IsTheTrackVideo == SIGN_VIDEO)
{
switch (codeTag)
{
case VIDEOCODE_MP4V :
pFileinf->vFormat = VIDEO_CODEC_LIB_MP4V;
break;
case VIDEOCODE_S263 :
pFileinf->vFormat = VIDEO_CODEC_LIB_H263;
break;
default :
pFileinf->vFormat = VIDEO_CODEC_LIB_NULL;
return MOV_FILE_VIDEO_UNSUPPORTED ;
//break;
}
MovFseek(videoFile, FOURBYTE * 6, SEEK_CUR);
/* read the width of the video */
MovFread(&pFileinf->width, sizeof(WORD), 1, videoFile);
pFileinf->width = WORDSWAP(pFileinf->width);
/* read the height of the video */
MovFread(&pFileinf->height, sizeof(WORD), 1, videoFile);
pFileinf->height = WORDSWAP(pFileinf->height);
if ((pFileinf->width > MOV_MAX_FRAME_WIDTH)
|| (pFileinf->height > MOV_MAX_FRAME_HEIGHT))
{
return MOV_FILE_RESOLUTION_UNSUPPORTED ;
}
if (pFileinf->vFormat == VIDEO_CODEC_LIB_MP4V)
{
uint32 size = 0x0;
DWORD tag = 0x0;
/* read the information of esds*/
MovFseek(videoFile, 0x32, SEEK_CUR);
MovFread(&size, sizeof(uint32), 1, videoFile);
size = BYTESWAP(size);
MovFread(&tag, sizeof(DWORD), 1, videoFile);
if (tag == SIGN_ESDS)
{
MovFseek(videoFile, FOURBYTE, SEEK_CUR);
pFileinf->esdsInf.length = size - 0xC;
pFileinf->esdsInf.esdsFilePos.clus = videoFile->Clus;
pFileinf->esdsInf.esdsFilePos.offset = videoFile->Offset;
MovFseek(videoFile, (size - 0xC), SEEK_CUR);
}
else
{
MovFseek(videoFile, (size - 0x8), SEEK_CUR);
}
}
else
{
MovFseek(videoFile, entrySize - (FOURBYTE * 0x9), SEEK_CUR);
}
}
else
{
switch (codeTag)
{
case AUDIOCODE_SAMR :
pFileinf->aFormat = AUDIO_CODEC_LIB_SAMR;
break;
case AUDIOCODE_MP4A :
pFileinf->aFormat = AUDIO_CODEC_LIB_MP4A;
break;
default :
pFileinf->aFormat = AUDIO_CODEC_LIB_NULL;
break;
}
MovFseek(videoFile, (FOURBYTE << 0x2), SEEK_CUR);
/* read the channelCount of the audio*/
MovFread(&pFileinf->channelCount, sizeof(WORD), 1, videoFile);
pFileinf->channelCount = WORDSWAP(pFileinf->channelCount);
MovFseek(videoFile, 0x6, SEEK_CUR);
/* read the sample rate of audio */
MovFread(&pFileinf->sampleRate, sizeof(uint32), 1, videoFile);
pFileinf->sampleRate = BYTESWAP(pFileinf->sampleRate);
pFileinf->sampleRate = ((pFileinf->sampleRate >> 16) & 0x0000ffff);
MovFseek(videoFile, entrySize - (FOURBYTE * 0x9), SEEK_CUR);
}
}
}
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadStts()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadStts(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
uint32 entryCount = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, FOURBYTE, SEEK_CUR);
MovFread(&entryCount, sizeof(uint32), 1 , videoFile);
entryCount = BYTESWAP(entryCount);
switch (IsTheTrackVideo)
{
case SIGN_VIDEO:
pFileinf->videoTimeToSampleNo = entryCount;
sVideoTimeToSampleIndex = (uint32 *)MALLOC(sizeof(uint32) * 0x2 * entryCount);
if (sVideoTimeToSampleIndex == NULL)
{
return MALLOC_FAILED;
}
MovFread(sVideoTimeToSampleIndex, sizeof(uint32), (0x2 * entryCount), videoFile);
break;
case SIGN_AUDIO:
pFileinf->audioTimeToSampleNo = entryCount;
sAudioTimeToSampleIndex = (uint32 *)MALLOC(sizeof(uint32) * 0x2 * entryCount);
if (sAudioTimeToSampleIndex == NULL)
{
return MALLOC_FAILED;
}
MovFread(sAudioTimeToSampleIndex, sizeof(uint32), (0x2 * entryCount), videoFile);
break;
default:
MovFseek(videoFile, boxSize - (FOURBYTE << 2), SEEK_CUR);
break;
}
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadCtts()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadCtts(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, boxSize - (FOURBYTE << 1), SEEK_CUR);
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadStsc()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadStsc(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
uint32 length = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, FOURBYTE, SEEK_CUR);
MovFread(&length, sizeof(uint32), 1, videoFile);
length = BYTESWAP(length);
switch (IsTheTrackVideo)
{
case SIGN_VIDEO:
pFileinf->videoSampleToChunkNo = length;
sVideoSampleToChunkIndex = (uint32 *)MALLOC(sizeof(uint32) * 0x3 * length);
if (sVideoSampleToChunkIndex == NULL)
{
return MALLOC_FAILED;
}
MovFread(sVideoSampleToChunkIndex, sizeof(uint32), (length * 0x3), videoFile);
break;
case SIGN_AUDIO:
pFileinf->audioSampleToChunkNo = length;
sAudioSampleToChunkIndex = (uint32 *)MALLOC(sizeof(uint32) * 0x3 * length);
if (sAudioSampleToChunkIndex == NULL)
{
return MALLOC_FAILED;
}
MovFread(sAudioSampleToChunkIndex, sizeof(uint32), (length * 0x3), videoFile);
break;
default:
MovFseek(videoFile, boxSize - (FOURBYTE << 2), SEEK_CUR);
break;
}
return MOV_FILE_BOX_PARSE_SUCCESS;
}
/********************************************************************************************
* Func:
* MovReadStsz()
* Description:
*
* Param:
*
* Return:
* 0: OK.
* -1: Error.
* Author:
* guosl
* Date:
* 2008-5-16 10:30
* Log:
*
********************************************************************************************/
STATIC int MovReadStsz(MOV_FILE *videoFile, MovFileinf *pFileinf, LONG boxSize)
{
uint32 sampleSize =0x0;
uint32 sampleCount = 0x0;
ASSERT((videoFile != NULL)
&& (pFileinf != NULL));
MovFseek(videoFile, FOURBYTE, SEEK_CUR);
MovFread(&sampleSize, sizeof(uint32), 1, videoFile);
sampleSize = BYTESWAP(sampleSize);
switch (IsTheTrackVideo)
{
case SIGN_VIDEO:
pFileinf->videoSampleSize = sampleSize;
break;
case SIGN_AUDIO:
pFileinf->audioSampleSize = sampleSize;
break;
default:
break;
}
MovFread(&sampleCount, sizeof(uint32), 1, videoFile);
sampleCount = BYTESWAP(sampleCount);
switch (IsTheTrackVideo)
{
case SIGN_VIDEO:
pFileinf->videoSampleNum = sampleCount;
if (pFileinf->videoSampleSize == 0x0)
{
sVideoSampleSizeIndex = (uint32 *)MALLOC(sizeof(uint32) * sampleCount);
if (sVideoSampleSizeIndex == NULL)
{
return MALLOC_FAILED;
}
MovFread(sVideoSampleSizeIndex, sizeof(uint32), sampleCount, videoFile);
}
break;
case SIGN_AUDIO:
pFileinf->audioSampleNum = sampleCount;
if (pFileinf->audioSampleSize == 0x0)
{
sAudioSampleSizeIndex = (uint32 *)MALLOC(sizeof(uint32) * sampleCount);
if (sAudioSampleSizeIndex == NULL)
{
return MALLOC_FAILED;
}
MovFread(sAudioSampleSizeIndex, sizeof(uint32), sampleCount, videoFile);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -