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

📄 mpegfile.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/********************************************************************************************
 Copyright (C), 2007, Fuzhou Rockchip Co.,Ltd.
 File:
  MpegFile.c
 Description:
  Mpeg file demuxer.
 Note:
  None.
 Author:
  ljn
 $Log: MpegFile.c,v $
 Revision 1.3  2008/06/19 04:42:32  Administrator
 代码整理!

 Revision 1.2  2008/05/24 09:36:44  HZF
 MPEG-1/2的支持

 Revision 1.1  2008/05/20 12:02:22  HZF
 mpg文件播放提交


********************************************************************************************/
#define _IN_MPEGFILE_H

#include "system.h"
#include "MpegFile.h"
#include "mpg_global.h"

extern int MpegDemuxInit(MpegFILE *pfMain);
extern int MpegVideoReadData(char *buffer, int size);
extern int MpegDemuxAudioInit(MpegFILE * pfMain);

/********************************************************************************************
 Func:
  MpegFileParsing()
 Description:
  Mpeg file parse.
 Param:
  MpegDemux *mpeg - Mpeg demux struct.
 Return:
  0:  Success.
  -1: Error.
 Author:
  ljn
 Date:
  2008-3-3
 Log:

********************************************************************************************/
int MpegFileParsing(MpegDemux *mpeg)
{
    memset(&base, 0, sizeof(layer_data));
    memset(&audiobase, 0, sizeof(layer_data));

    base.Rdbfr = MALLOC(2048);
    audiobase.Rdbfr = MALLOC(2048);
    if ((!base.Rdbfr) || (!audiobase.Rdbfr))
        return MPEG_FILE_OPEN_ERR;

    mpeg->frameRate = -1.0;
    if (MpegDemuxInit(mpeg->videoStr))
        return MPEG_FILE_FORMAT_ERR;

    MpegDemuxAudioInit(mpeg->audioStr);
    mpeg->width = horizontal_size;
    mpeg->height = vertical_size;
    return 0;
}

int MpegVideoGetDataToSDRAM(MpegDemux *mpeg, char *buffer, DWORD *size)
{
    int readSize, i;
    int *pBuf;

#if 0
    if (MpegFread(buffer, *size, 1, mpeg->videoStr) < *size)
        return -1;
#else
    readSize = MpegVideoReadData(buffer, *size);
#if 0
    pBuf = (int *)buffer;
    for (i = 0; i < ((readSize + 3) >> 2); i++)
    {
        pBuf[i] = ((pBuf[i] >> 8) & 0x00ff00ff) | ((pBuf[i] << 8) & 0xff00ff00);
    }
#endif
    if (readSize < *size)
    {
        *size = readSize;
        return -1;
    }
#endif
    return 0;
}


int MpegFileOpen(MpegDemux *mpeg, char *path)
{
    memset(mpeg, 0, sizeof(MpegDemux));

    mpeg->videoStr = MpegFopen(path, "rb");
    if ((int)mpeg->videoStr == -1 || !(int) mpeg->videoStr)
        return -1;
    mpeg->audioStr = MpegFopen(path, "rb");
    if ((int)mpeg->audioStr == -1 || !(int) mpeg->audioStr)
        return -1;
    return 0;
}

void MpegFileClose(MpegDemux *mpeg)
{
    if (mpeg->videoStr)
        MpegFClose(mpeg->videoStr);
    if (mpeg->audioStr)
        MpegFClose(mpeg->audioStr);
    if (base.Rdbfr)
        FREE(base.Rdbfr);
    if (audiobase.Rdbfr)
        FREE(audiobase.Rdbfr);
}

int MpegSeek(MpegDemux *mpeg, unsigned int time)
{

    return 0;
}

int  MpegAudioFSeek(MY_FILE *in, long int off , int b)
{
    if (mpeg.auCodec == MPEG_AUDIO_TYPE_MP2)
    {
        if (off != 0 && b != 0)
            return 0;
        MpegFseek(mpeg.audioStr, 0, SEEK_SET);
        Initialize_Buffer(ld2);
        return 1;
    }

    if ((mpeg.auCodec == MPEG_AUDIO_TYPE_AC3_0) || (mpeg.auCodec == MPEG_AUDIO_TYPE_AC3_1))
    {
        if (b != 0)
            return 0;
        MpegFseek(mpeg.audioStr, 0, SEEK_SET);
        Initialize_Buffer(ld2);
        while (1)
        {
            if (off < (ld2->Rdmax - ld2->Rdptr))
            {
                if (ld2->Rdptr + off > ld2->Rdbfr + 2048)
                {
                    fread(ld2->Rdbfr, 1, ld2->Rdbfr + 2048 - ld2->Rdptr, ld2->Infile);
                    ld2->Rdptr = ld2->Rdbfr + off - (ld2->Rdbfr + 2048 - ld2->Rdptr);
                }
                else
                    ld2->Rdptr += off;
                return 1;
            }
            off -= (ld2->Rdmax - ld2->Rdptr);
            if (ld2->Rdmax > ld2->Rdbfr + 2048)
                fseek(ld2->Infile, ld2->Rdmax - (ld2->Rdbfr + 2048), SEEK_CUR);
            ld2->Rdptr = ld2->Rdbfr + 2048;
            Next_PacketAudio();
        }
    }
}

int MpegSynAudio2Video(MpegDemux *mpeg)
{
    unsigned int offset = ld->Infile->Offset;
    if (mpeg->seekTime < mpeg->curTime)
        offset += (800 * (long long)mpeg->filesize) / mpeg->duration;
    fseek(ld2->Infile, offset, SEEK_SET);
    ld2->Rdptr = ld2->Rdbfr + 2048;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -