⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movfile.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************************************
*	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 + -