📄 mpegfile.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 + -