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

📄 movfile.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 5 页
字号:

				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 + -