整理一些格式
This commit is contained in:
@@ -1,369 +1,359 @@
|
||||
#include "avi.h"
|
||||
#include "dac.h"
|
||||
#include "ff.h"
|
||||
#include "lcd_rgb.h"
|
||||
#include "mjpeg.h"
|
||||
#include "mymem.h"
|
||||
#include "timer.h"
|
||||
#include "touch_043.h"
|
||||
#include "usart.h"
|
||||
#include "timer.h"
|
||||
#include "avi.h"
|
||||
#include "mjpeg.h"
|
||||
#include "lcd_rgb.h"
|
||||
#include "mymem.h"
|
||||
#include "ff.h"
|
||||
#include "dac.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ѧϰʹ<EFBFBD>ã<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>;
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//AVI<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
||||
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
//All rights reserved
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// AVI<56><49>Ƶ<EFBFBD><C6B5>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
// <20><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
// All rights reserved
|
||||
//*******************************************************************************
|
||||
//<2F><EFBFBD><DEB8><EFBFBD>Ϣ
|
||||
//<2F><>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
// <EFBFBD><EFBFBD>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AVI_INFO avix; //avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
u8*const AVI_VIDS_FLAG_TBL[2]={"00dc","01dc"};//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,00dc/01dc
|
||||
u8*const AVI_AUDS_FLAG_TBL[2]={"00wb","01wb"};//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,00wb/01wb
|
||||
AVI_INFO avix; // avi<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
u8 *const AVI_VIDS_FLAG_TBL[2] = {"00dc",
|
||||
"01dc"}; // <EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>,00dc/01dc
|
||||
u8 *const AVI_AUDS_FLAG_TBL[2] = {"00wb",
|
||||
"01wb"}; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,00wb/01wb
|
||||
|
||||
static vu8 g_i2splaybuf; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static u8* g_i2sbuf[4]; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֡,<2C><>4֡,4*5K=20K
|
||||
|
||||
//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>I2S DMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
void audio_i2s_dma_callback(DAC_UserStruct *dac)
|
||||
{
|
||||
g_i2splaybuf++;
|
||||
if(g_i2splaybuf>3)g_i2splaybuf=0;
|
||||
if(dac->buff_useing==1)
|
||||
{
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5,(u32)g_i2sbuf[g_i2splaybuf], DMA_Memory_0);
|
||||
}
|
||||
else
|
||||
{
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5,(u32)g_i2sbuf[g_i2splaybuf], DMA_Memory_1);
|
||||
}
|
||||
}
|
||||
static vu8 g_i2splaybuf; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD>Ƶ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static u8 *g_i2sbuf[4]; // <EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡,<2C><>4֡,4*5K=20K
|
||||
|
||||
|
||||
//avi<76><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
//buf:<3A><><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>
|
||||
//size:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:AVI_OK,avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
AVISTATUS avi_init(u8 *buf,int size)
|
||||
{
|
||||
u16 offset;
|
||||
u8 *tbuf;
|
||||
AVISTATUS res=AVI_OK;
|
||||
AVI_HEADER *aviheader;
|
||||
LIST_HEADER *listheader;
|
||||
AVIH_HEADER *avihheader;
|
||||
STRH_HEADER *strhheader;
|
||||
|
||||
STRF_BMPHEADER *bmpheader;
|
||||
STRF_WAVHEADER *wavheader;
|
||||
|
||||
tbuf=buf;
|
||||
aviheader=(AVI_HEADER*)buf;
|
||||
if(aviheader->RiffID!=AVI_RIFF_ID)return AVI_RIFF_ERR; //RIFF ID<49><44><EFBFBD><EFBFBD>
|
||||
if(aviheader->AviID!=AVI_AVI_ID)return AVI_AVI_ERR; //AVI ID<49><44><EFBFBD><EFBFBD>
|
||||
buf+=sizeof(AVI_HEADER); //ƫ<><C6AB>
|
||||
listheader=(LIST_HEADER*)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)return AVI_LIST_ERR; //LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if(listheader->ListType!=AVI_HDRL_ID)return AVI_HDRL_ERR; //HDRL ID<49><44><EFBFBD><EFBFBD>
|
||||
buf+=sizeof(LIST_HEADER); //ƫ<><C6AB>
|
||||
avihheader=(AVIH_HEADER*)(buf);
|
||||
if(avihheader->BlockID!=AVI_AVIH_ID)return AVI_AVIH_ERR; //AVIH ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SecPerFrame=avihheader->SecPerFrame; //<2F>õ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
avix.TotalFrame=avihheader->TotalFrame; //<2F>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
buf+=avihheader->BlockSize+8; //ƫ<><C6AB>
|
||||
listheader=(LIST_HEADER*)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)return AVI_LIST_ERR; //LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if(listheader->ListType!=AVI_STRL_ID)return AVI_STRL_ERR; //STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader=(STRH_HEADER*)(buf+12);
|
||||
if(strhheader->BlockID!=AVI_STRH_ID)return AVI_STRH_ERR; //STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if(strhheader->StreamType==AVI_VIDS_STREAM) //<2F><>Ƶ֡<C6B5><D6A1>ǰ
|
||||
{
|
||||
if(strhheader->Handler!=AVI_FORMAT_MJPG)return AVI_FORMAT_ERR; //<2F><>MJPG<50><47>Ƶ<EFBFBD><C6B5>,<2C><>֧<EFBFBD><D6A7>
|
||||
avix.VideoFLAG=(u8*)AVI_VIDS_FLAG_TBL[0]; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "00dc"
|
||||
avix.AudioFLAG=(u8*)AVI_AUDS_FLAG_TBL[1]; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "01wb"
|
||||
bmpheader=(STRF_BMPHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(bmpheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.Width=bmpheader->bmiHeader.Width;
|
||||
avix.Height=bmpheader->bmiHeader.Height;
|
||||
buf+=listheader->BlockSize+8; //ƫ<><C6AB>
|
||||
listheader=(LIST_HEADER*)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)//<2F>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>Ƶ<EFBFBD>ļ<EFBFBD>
|
||||
{
|
||||
avix.SampleRate=0; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels=0; //<2F><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType=0; //<2F><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
|
||||
}else
|
||||
{
|
||||
if(listheader->ListType!=AVI_STRL_ID)return AVI_STRL_ERR; //STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader=(STRH_HEADER*)(buf+12);
|
||||
if(strhheader->BlockID!=AVI_STRH_ID)return AVI_STRH_ERR; //STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if(strhheader->StreamType!=AVI_AUDS_STREAM)return AVI_FORMAT_ERR;//<2F><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
wavheader=(STRF_WAVHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(wavheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SampleRate=wavheader->SampleRate; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels=wavheader->Channels; //<2F><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType=wavheader->FormatTag; //<2F><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
}
|
||||
}else if(strhheader->StreamType==AVI_AUDS_STREAM) //<2F><>Ƶ֡<C6B5><D6A1>ǰ
|
||||
{
|
||||
avix.VideoFLAG=(u8*)AVI_VIDS_FLAG_TBL[1]; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "01dc"
|
||||
avix.AudioFLAG=(u8*)AVI_AUDS_FLAG_TBL[0]; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "00wb"
|
||||
wavheader=(STRF_WAVHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(wavheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SampleRate=wavheader->SampleRate; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels=wavheader->Channels; //<2F><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType=wavheader->FormatTag; //<2F><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
buf+=listheader->BlockSize+8; //ƫ<><C6AB>
|
||||
listheader=(LIST_HEADER*)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)return AVI_LIST_ERR; //LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if(listheader->ListType!=AVI_STRL_ID)return AVI_STRL_ERR; //STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader=(STRH_HEADER*)(buf+12);
|
||||
if(strhheader->BlockID!=AVI_STRH_ID)return AVI_STRH_ERR; //STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if(strhheader->StreamType!=AVI_VIDS_STREAM)return AVI_FORMAT_ERR;//<2F><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
bmpheader=(STRF_BMPHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(bmpheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
if(bmpheader->bmiHeader.Compression!=AVI_FORMAT_MJPG)return AVI_FORMAT_ERR;//<2F><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
avix.Width=bmpheader->bmiHeader.Width;
|
||||
avix.Height=bmpheader->bmiHeader.Height;
|
||||
}
|
||||
offset=avi_srarch_id(tbuf,size,"movi"); //<2F><><EFBFBD><EFBFBD>movi ID
|
||||
if(offset==0)return AVI_MOVI_ERR; //MOVI ID<49><44><EFBFBD><EFBFBD>
|
||||
if(avix.SampleRate)//<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,<2C>Ų<EFBFBD><C5B2><EFBFBD>
|
||||
{
|
||||
tbuf+=offset;
|
||||
offset=avi_srarch_id(tbuf,size,avix.AudioFLAG); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(offset==0)return AVI_STREAM_ERR; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
tbuf+=offset+4;
|
||||
avix.AudioBufSize=*((u16*)tbuf); //<2F>õ<EFBFBD><C3B5><EFBFBD>Ƶ<EFBFBD><C6B5>buf<75><66>С.
|
||||
}
|
||||
// printf("avi init ok\r\n");
|
||||
// printf("avix.SecPerFrame:%d\r\n",avix.SecPerFrame);
|
||||
// printf("avix.TotalFrame:%d\r\n",avix.TotalFrame);
|
||||
// printf("avix.Width:%d\r\n",avix.Width);
|
||||
// printf("avix.Height:%d\r\n",avix.Height);
|
||||
// printf("avix.AudioType:%d\r\n",avix.AudioType);
|
||||
// printf("avix.SampleRate:%d\r\n",avix.SampleRate);
|
||||
// printf("avix.Channels:%d\r\n",avix.Channels);
|
||||
// printf("avix.AudioBufSize:%d\r\n",avix.AudioBufSize);
|
||||
// printf("avix.VideoFLAG:%s\r\n",avix.VideoFLAG);
|
||||
// printf("avix.AudioFLAG:%s\r\n",avix.AudioFLAG);
|
||||
return res;
|
||||
// <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>I2S DMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
void audio_i2s_dma_callback(DAC_UserStruct *dac) {
|
||||
g_i2splaybuf++;
|
||||
if (g_i2splaybuf > 3)
|
||||
g_i2splaybuf = 0;
|
||||
if (dac->buff_useing == 1) {
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5, (u32)g_i2sbuf[g_i2splaybuf],
|
||||
DMA_Memory_0);
|
||||
} else {
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5, (u32)g_i2sbuf[g_i2splaybuf],
|
||||
DMA_Memory_1);
|
||||
}
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD> ID
|
||||
//buf:<3A><><EFBFBD>黺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//size:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
//id:Ҫ<><D2AA><EFBFBD>ҵ<EFBFBD>id,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>:movi IDƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 avi_srarch_id(u8* buf,int size,u8 *id)
|
||||
{
|
||||
u16 i;
|
||||
size-=4;
|
||||
for(i=0;i<size;i++)
|
||||
{
|
||||
if(buf[i]==id[0])
|
||||
if(buf[i+1]==id[1])
|
||||
if(buf[i+2]==id[2])
|
||||
if(buf[i+3]==id[3])return i;//<2F>ҵ<EFBFBD>"id"<22><><EFBFBD>ڵ<EFBFBD>λ<EFBFBD><CEBB>
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//<2F>õ<EFBFBD>stream<61><6D><EFBFBD><EFBFBD>Ϣ
|
||||
//buf:<3A><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>01wb/00wb/01dc/00dc<64><63>ͷ)
|
||||
AVISTATUS avi_get_streaminfo(u8* buf)
|
||||
{
|
||||
int offset=0;
|
||||
avix.StreamID=MAKEWORD(buf+2); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.StreamSize=MAKEDWORD(buf+4); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>С
|
||||
if(avix.StreamSize%2)avix.StreamSize++; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1(avix.StreamSize,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>)
|
||||
if(avix.StreamID==AVI_VIDS_FLAG||avix.StreamID==AVI_AUDS_FLAG)return AVI_OK;
|
||||
return AVI_STREAM_ERR;
|
||||
// avi<76><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
||||
// buf:<3A><><EFBFBD>뻺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// size:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:AVI_OK,avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
AVISTATUS avi_init(u8 *buf, int size) {
|
||||
u16 offset;
|
||||
u8 *tbuf;
|
||||
AVISTATUS res = AVI_OK;
|
||||
AVI_HEADER *aviheader;
|
||||
LIST_HEADER *listheader;
|
||||
AVIH_HEADER *avihheader;
|
||||
STRH_HEADER *strhheader;
|
||||
|
||||
STRF_BMPHEADER *bmpheader;
|
||||
STRF_WAVHEADER *wavheader;
|
||||
|
||||
tbuf = buf;
|
||||
aviheader = (AVI_HEADER *)buf;
|
||||
if (aviheader->RiffID != AVI_RIFF_ID)
|
||||
return AVI_RIFF_ERR; // RIFF ID<49><44><EFBFBD><EFBFBD>
|
||||
if (aviheader->AviID != AVI_AVI_ID)
|
||||
return AVI_AVI_ERR; // AVI ID<49><44><EFBFBD><EFBFBD>
|
||||
buf += sizeof(AVI_HEADER); // ƫ<EFBFBD><EFBFBD>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if (listheader->ListID != AVI_LIST_ID)
|
||||
return AVI_LIST_ERR; // LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListType != AVI_HDRL_ID)
|
||||
return AVI_HDRL_ERR; // HDRL ID<49><44><EFBFBD><EFBFBD>
|
||||
buf += sizeof(LIST_HEADER); // ƫ<><C6AB>
|
||||
avihheader = (AVIH_HEADER *)(buf);
|
||||
if (avihheader->BlockID != AVI_AVIH_ID)
|
||||
return AVI_AVIH_ERR; // AVIH ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SecPerFrame = avihheader->SecPerFrame; // <20>õ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
avix.TotalFrame = avihheader->TotalFrame; // <20>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
buf += avihheader->BlockSize + 8; // ƫ<><C6AB>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if (listheader->ListID != AVI_LIST_ID)
|
||||
return AVI_LIST_ERR; // LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListType != AVI_STRL_ID)
|
||||
return AVI_STRL_ERR; // STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader = (STRH_HEADER *)(buf + 12);
|
||||
if (strhheader->BlockID != AVI_STRH_ID)
|
||||
return AVI_STRH_ERR; // STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if (strhheader->StreamType == AVI_VIDS_STREAM) // <20><>Ƶ֡<C6B5><D6A1>ǰ
|
||||
{
|
||||
if (strhheader->Handler != AVI_FORMAT_MJPG)
|
||||
return AVI_FORMAT_ERR; // <20><>MJPG<50><47>Ƶ<EFBFBD><C6B5>,<2C><>֧<EFBFBD><D6A7>
|
||||
avix.VideoFLAG = (u8 *)AVI_VIDS_FLAG_TBL[0]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "00dc"
|
||||
avix.AudioFLAG = (u8 *)AVI_AUDS_FLAG_TBL[1]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "01wb"
|
||||
bmpheader =
|
||||
(STRF_BMPHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (bmpheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.Width = bmpheader->bmiHeader.Width;
|
||||
avix.Height = bmpheader->bmiHeader.Height;
|
||||
buf += listheader->BlockSize + 8; // ƫ<><C6AB>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if (listheader->ListID != AVI_LIST_ID) // <20>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>Ƶ<EFBFBD>ļ<EFBFBD>
|
||||
{
|
||||
avix.SampleRate = 0; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels = 0; // <20><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType = 0; // <20><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
} else {
|
||||
if (listheader->ListType != AVI_STRL_ID)
|
||||
return AVI_STRL_ERR; // STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader = (STRH_HEADER *)(buf + 12);
|
||||
if (strhheader->BlockID != AVI_STRH_ID)
|
||||
return AVI_STRH_ERR; // STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if (strhheader->StreamType != AVI_AUDS_STREAM)
|
||||
return AVI_FORMAT_ERR; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
wavheader =
|
||||
(STRF_WAVHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (wavheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SampleRate = wavheader->SampleRate; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels = wavheader->Channels; // <20><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType = wavheader->FormatTag; // <20><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
}
|
||||
} else if (strhheader->StreamType == AVI_AUDS_STREAM) // <20><>Ƶ֡<C6B5><D6A1>ǰ
|
||||
{
|
||||
avix.VideoFLAG = (u8 *)AVI_VIDS_FLAG_TBL[1]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "01dc"
|
||||
avix.AudioFLAG = (u8 *)AVI_AUDS_FLAG_TBL[0]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "00wb"
|
||||
wavheader =
|
||||
(STRF_WAVHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (wavheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SampleRate = wavheader->SampleRate; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels = wavheader->Channels; // <20><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType = wavheader->FormatTag; // <20><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
buf += listheader->BlockSize + 8; // ƫ<><C6AB>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if (listheader->ListID != AVI_LIST_ID)
|
||||
return AVI_LIST_ERR; // LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListType != AVI_STRL_ID)
|
||||
return AVI_STRL_ERR; // STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader = (STRH_HEADER *)(buf + 12);
|
||||
if (strhheader->BlockID != AVI_STRH_ID)
|
||||
return AVI_STRH_ERR; // STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if (strhheader->StreamType != AVI_VIDS_STREAM)
|
||||
return AVI_FORMAT_ERR; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
bmpheader =
|
||||
(STRF_BMPHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (bmpheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
if (bmpheader->bmiHeader.Compression != AVI_FORMAT_MJPG)
|
||||
return AVI_FORMAT_ERR; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
avix.Width = bmpheader->bmiHeader.Width;
|
||||
avix.Height = bmpheader->bmiHeader.Height;
|
||||
}
|
||||
offset = avi_srarch_id(tbuf, size, "movi"); // <20><><EFBFBD><EFBFBD>movi ID
|
||||
if (offset == 0)
|
||||
return AVI_MOVI_ERR; // MOVI ID<49><44><EFBFBD><EFBFBD>
|
||||
if (avix.SampleRate) // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,<2C>Ų<EFBFBD><C5B2><EFBFBD>
|
||||
{
|
||||
tbuf += offset;
|
||||
offset = avi_srarch_id(tbuf, size, avix.AudioFLAG); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (offset == 0)
|
||||
return AVI_STREAM_ERR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
tbuf += offset + 4;
|
||||
avix.AudioBufSize = *((u16 *)tbuf); // <20>õ<EFBFBD><C3B5><EFBFBD>Ƶ<EFBFBD><C6B5>buf<75><66>С.
|
||||
}
|
||||
// printf("avi init ok\r\n");
|
||||
// printf("avix.SecPerFrame:%d\r\n",avix.SecPerFrame);
|
||||
// printf("avix.TotalFrame:%d\r\n",avix.TotalFrame);
|
||||
// printf("avix.Width:%d\r\n",avix.Width);
|
||||
// printf("avix.Height:%d\r\n",avix.Height);
|
||||
// printf("avix.AudioType:%d\r\n",avix.AudioType);
|
||||
// printf("avix.SampleRate:%d\r\n",avix.SampleRate);
|
||||
// printf("avix.Channels:%d\r\n",avix.Channels);
|
||||
// printf("avix.AudioBufSize:%d\r\n",avix.AudioBufSize);
|
||||
// printf("avix.VideoFLAG:%s\r\n",avix.VideoFLAG);
|
||||
// printf("avix.AudioFLAG:%s\r\n",avix.AudioFLAG);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static vu8 g_frame_en=0;
|
||||
|
||||
|
||||
void avi_timer_irq (void)
|
||||
{
|
||||
g_frame_en=1;
|
||||
// <20><><EFBFBD><EFBFBD> ID
|
||||
// buf:<3A><><EFBFBD>黺<EFBFBD><E9BBBA><EFBFBD><EFBFBD>
|
||||
// size:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// id:Ҫ<><D2AA><EFBFBD>ҵ<EFBFBD>id,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>,<2C><><EFBFBD><EFBFBD>:movi IDƫ<44><C6AB><EFBFBD><EFBFBD>
|
||||
u16 avi_srarch_id(u8 *buf, int size, u8 *id) {
|
||||
u16 i;
|
||||
size -= 4;
|
||||
for (i = 0; i < size; i++) {
|
||||
if (buf[i] == id[0])
|
||||
if (buf[i + 1] == id[1])
|
||||
if (buf[i + 2] == id[2])
|
||||
if (buf[i + 3] == id[3])
|
||||
return i; // <20>ҵ<EFBFBD>"id"<22><><EFBFBD>ڵ<EFBFBD>λ<EFBFBD><CEBB>
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
// <20>õ<EFBFBD>stream<61><6D><EFBFBD><EFBFBD>Ϣ
|
||||
// buf:<3A><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>01wb/00wb/01dc/00dc<64><63>ͷ)
|
||||
AVISTATUS avi_get_streaminfo(u8 *buf) {
|
||||
int offset = 0;
|
||||
avix.StreamID = MAKEWORD(buf + 2); // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.StreamSize = MAKEDWORD(buf + 4); // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>С
|
||||
if (avix.StreamSize % 2)
|
||||
avix.StreamSize++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1(avix.StreamSize,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>)
|
||||
if (avix.StreamID == AVI_VIDS_FLAG || avix.StreamID == AVI_AUDS_FLAG)
|
||||
return AVI_OK;
|
||||
return AVI_STREAM_ERR;
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>avix.SecPerFrame
|
||||
void avi_timer_init (u32 t)
|
||||
{
|
||||
TIMER_InitStruct timer_init={0};
|
||||
timer_init.Cycle=t/1;
|
||||
timer_init.Tim=TIM3;
|
||||
timer_init.UpdataCall=avi_timer_irq;
|
||||
TIMER_InitNormal(&timer_init);
|
||||
static vu8 g_frame_en = 0;
|
||||
|
||||
void avi_timer_irq(void) { g_frame_en = 1; }
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>avix.SecPerFrame
|
||||
void avi_timer_init(u32 t) {
|
||||
TIMER_InitStruct timer_init = {0};
|
||||
timer_init.Cycle = t / 1;
|
||||
timer_init.Tim = TIM3;
|
||||
timer_init.UpdataCall = avi_timer_irq;
|
||||
TIMER_InitNormal(&timer_init);
|
||||
}
|
||||
|
||||
void avi_tiemr_delete(void) { TIMER_DeInit(TIM3); }
|
||||
|
||||
void avi_tiemr_delete (void)
|
||||
{
|
||||
TIMER_DeInit (TIM3);
|
||||
#define AVI_AUDIO_BUF_SIZE 1024 * 5 // <20><><EFBFBD><EFBFBD>avi<76><69><EFBFBD><EFBFBD>ʱ,<2C><>Ƶbuf<75><66>С.
|
||||
#define AVI_VIDEO_BUF_SIZE 1024 * 200 // <20><><EFBFBD><EFBFBD>avi<76><69><EFBFBD><EFBFBD>ʱ,<2C><>Ƶbuf<75><66>С.
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
int video_play(char *pname, int loop) {
|
||||
|
||||
u8 listhead[8] = {0}; // <20><><EFBFBD><EFBFBD>ͷ
|
||||
u32 fresh = 0;
|
||||
u8 *framebuf; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>buf
|
||||
u8 *pbuf; // bufָ<66><D6B8>
|
||||
FIL *favi;
|
||||
u8 res = 0;
|
||||
u16 offset = 0;
|
||||
UINT nr;
|
||||
u8 key;
|
||||
u8 i2ssavebuf;
|
||||
DAC_UserStruct dac = {0};
|
||||
|
||||
u8 *audio_buff = mymalloc(AVI_AUDIO_BUF_SIZE);
|
||||
framebuf = mymalloc(AVI_VIDEO_BUF_SIZE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶbuf
|
||||
favi = (FIL *)mymalloc(sizeof(FIL)); // <20><><EFBFBD><EFBFBD>favi<76>ڴ<EFBFBD>
|
||||
g_i2sbuf[0] = mymalloc(AVI_AUDIO_BUF_SIZE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
g_i2sbuf[1] = mymalloc(AVI_AUDIO_BUF_SIZE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
g_i2sbuf[2] = mymalloc(AVI_AUDIO_BUF_SIZE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
g_i2sbuf[3] = mymalloc(AVI_AUDIO_BUF_SIZE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
mymemset(g_i2sbuf[0], 0, AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[1], 0, AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[2], 0, AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[3], 0, AVI_AUDIO_BUF_SIZE);
|
||||
while (res == 0) {
|
||||
res = f_open(favi, (char *)pname, FA_READ);
|
||||
if (res == 0) {
|
||||
pbuf = framebuf;
|
||||
res = f_read(favi, pbuf, AVI_VIDEO_BUF_SIZE, &nr); // <20><>ʼ<EFBFBD><CABC>ȡ
|
||||
if (res) {
|
||||
break;
|
||||
}
|
||||
// <20><>ʼavi<76><69><EFBFBD><EFBFBD>
|
||||
res = avi_init(pbuf, AVI_VIDEO_BUF_SIZE); // avi<76><69><EFBFBD><EFBFBD>
|
||||
if (res) {
|
||||
break;
|
||||
}
|
||||
// avi_timer_init (avix.SecPerFrame);
|
||||
offset =
|
||||
avi_srarch_id(pbuf, AVI_VIDEO_BUF_SIZE, (u8 *)"movi"); // Ѱ<><D1B0>movi ID
|
||||
avi_get_streaminfo(pbuf + offset + 4); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ
|
||||
f_lseek(favi, offset + 12 - 8); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ID,<2C><><EFBFBD><EFBFBD>ַƫ<D6B7>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
extern void jdmerge_setvideo_xsize(int xsize, int lcd_xsize);
|
||||
jdmerge_setvideo_xsize(avix.Width, LCD_GetLcdSizeX()); // <20><><EFBFBD>õ<EFBFBD>ַ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
res =
|
||||
mjpegdec_init((LCD_GetLcdSizeX() - avix.Width) / 2,
|
||||
(LCD_GetLcdSizeY() - avix.Height) / 2); // JPG<50><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
if (avix.SampleRate) // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Ϣ,<2C>ų<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
{
|
||||
// <20><>ʼ<EFBFBD><CABC>DAC
|
||||
dac.buff1 = (u32 *)g_i2sbuf[1];
|
||||
dac.buff2 = (u32 *)g_i2sbuf[2];
|
||||
dac.buff_size = avix.AudioBufSize;
|
||||
dac.rate = DAC_GetRate(avix.SampleRate);
|
||||
dac.call_back = audio_i2s_dma_callback;
|
||||
DAC_NormalInit(&dac);
|
||||
}
|
||||
while (1) // <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
{
|
||||
f_read(favi, listhead, 8, &nr);
|
||||
if (avi_get_streaminfo(listhead)) // <20><>ȡ<EFBFBD><C8A1>һ֡ <20><><EFBFBD><EFBFBD>־
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (Touch_GetState()->x[1] != 0)
|
||||
break; // <20><>Ļ<EFBFBD><C4BB><EFBFBD>㴥<EFBFBD><E3B4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (USART3_GetKeyPressed() & (0x08))
|
||||
break; // <20><><EFBFBD>·<EFBFBD><C2B7>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (avix.StreamID == AVI_VIDS_FLAG) // <20><>Ƶ<EFBFBD><C6B5>
|
||||
{
|
||||
pbuf = framebuf;
|
||||
// mymemset (pbuf,0,AVI_VIDEO_BUF_SIZE);
|
||||
f_read(favi, pbuf, avix.StreamSize + 8 - 8,
|
||||
&nr); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡+<2B><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44>Ϣ
|
||||
// <20>ȴ<EFBFBD>֡ʱ<D6A1><CAB1>
|
||||
// while (g_frame_en==0){} g_frame_en=0;
|
||||
while (LCD_GetLayerUpdataStat() == 0)
|
||||
;
|
||||
LCD_SwitchLayerBuff();
|
||||
res = mjpegdec_decode(pbuf, avix.StreamSize);
|
||||
if (res == 0) {
|
||||
LCD_ExitLayerBuff();
|
||||
}
|
||||
if (res) {
|
||||
// break;
|
||||
}
|
||||
} else // <20><>Ƶ<EFBFBD><C6B5>
|
||||
{
|
||||
// f_read(favi,audio_buff,avix.StreamSize+8-8,&nr);//<2F><><EFBFBD><EFBFBD>i2sbuf
|
||||
// pbuf=audio_buff;
|
||||
i2ssavebuf++;
|
||||
if (i2ssavebuf > 3)
|
||||
i2ssavebuf = 0;
|
||||
do {
|
||||
nr = g_i2splaybuf;
|
||||
if (nr)
|
||||
nr--;
|
||||
else
|
||||
nr = 3;
|
||||
} while (i2ssavebuf == nr); // <20><>ײ<EFBFBD>ȴ<EFBFBD>.
|
||||
f_read(favi, g_i2sbuf[i2ssavebuf], avix.StreamSize,
|
||||
&nr); // <20><><EFBFBD><EFBFBD>i2sbuf
|
||||
u16 *p = (u16 *)g_i2sbuf[i2ssavebuf];
|
||||
for (int i = 0; i < avix.StreamSize / 2; i++)
|
||||
p[i] = (p[i] + 0x8000) >> 4;
|
||||
pbuf = g_i2sbuf[i2ssavebuf];
|
||||
}
|
||||
}
|
||||
// avi_tiemr_delete();
|
||||
mjpegdec_free(); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
f_close(favi);
|
||||
}
|
||||
if (loop == 0)
|
||||
break;
|
||||
}
|
||||
myfree(framebuf);
|
||||
myfree(favi);
|
||||
myfree(audio_buff);
|
||||
myfree(g_i2sbuf[0]);
|
||||
myfree(g_i2sbuf[1]);
|
||||
myfree(g_i2sbuf[2]);
|
||||
myfree(g_i2sbuf[3]);
|
||||
DAC_NormalDeInit(&dac);
|
||||
return (int)res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define AVI_AUDIO_BUF_SIZE 1024*5 //<2F><><EFBFBD><EFBFBD>avi<76><69><EFBFBD><EFBFBD>ʱ,<2C><>Ƶbuf<75><66>С.
|
||||
#define AVI_VIDEO_BUF_SIZE 1024*200 //<2F><><EFBFBD><EFBFBD>avi<76><69><EFBFBD><EFBFBD>ʱ,<2C><>Ƶbuf<75><66>С.
|
||||
|
||||
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
int video_play (char *pname,int loop)
|
||||
{
|
||||
|
||||
|
||||
u8 listhead[8]={0};//<2F><><EFBFBD><EFBFBD>ͷ
|
||||
u32 fresh=0;
|
||||
u8* framebuf; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>buf
|
||||
u8* pbuf; //bufָ<66><D6B8>
|
||||
FIL *favi;
|
||||
u8 res=0;
|
||||
u16 offset=0;
|
||||
UINT nr;
|
||||
u8 key;
|
||||
u8 i2ssavebuf;
|
||||
DAC_UserStruct dac={0};
|
||||
|
||||
u8 *audio_buff=mymalloc (AVI_AUDIO_BUF_SIZE);
|
||||
framebuf=mymalloc(AVI_VIDEO_BUF_SIZE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶbuf
|
||||
favi=(FIL*)mymalloc(sizeof(FIL)); //<2F><><EFBFBD><EFBFBD>favi<76>ڴ<EFBFBD>
|
||||
g_i2sbuf[0]=mymalloc(AVI_AUDIO_BUF_SIZE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
g_i2sbuf[1]=mymalloc(AVI_AUDIO_BUF_SIZE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
g_i2sbuf[2]=mymalloc(AVI_AUDIO_BUF_SIZE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
g_i2sbuf[3]=mymalloc(AVI_AUDIO_BUF_SIZE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ڴ<EFBFBD>
|
||||
mymemset(g_i2sbuf[0],0,AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[1],0,AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[2],0,AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[3],0,AVI_AUDIO_BUF_SIZE);
|
||||
while(res==0)
|
||||
{
|
||||
res=f_open(favi,(char *)pname,FA_READ);
|
||||
if(res==0)
|
||||
{
|
||||
pbuf=framebuf;
|
||||
res=f_read(favi,pbuf,AVI_VIDEO_BUF_SIZE,&nr);//<2F><>ʼ<EFBFBD><CABC>ȡ
|
||||
if(res)
|
||||
{
|
||||
break;
|
||||
}
|
||||
//<2F><>ʼavi<76><69><EFBFBD><EFBFBD>
|
||||
res=avi_init(pbuf,AVI_VIDEO_BUF_SIZE); //avi<76><69><EFBFBD><EFBFBD>
|
||||
if(res)
|
||||
{
|
||||
break;
|
||||
}
|
||||
//avi_timer_init (avix.SecPerFrame);
|
||||
offset=avi_srarch_id(pbuf,AVI_VIDEO_BUF_SIZE,(u8*)"movi");//Ѱ<><D1B0>movi ID
|
||||
avi_get_streaminfo(pbuf+offset+4); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ
|
||||
f_lseek(favi,offset+12-8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ID,<2C><><EFBFBD><EFBFBD>ַƫ<D6B7>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
extern void jdmerge_setvideo_xsize (int xsize,int lcd_xsize);
|
||||
jdmerge_setvideo_xsize (avix.Width,LCD_GetLcdSizeX());//<2F><><EFBFBD>õ<EFBFBD>ַ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
res=mjpegdec_init((LCD_GetLcdSizeX()-avix.Width)/2,(LCD_GetLcdSizeY()-avix.Height)/2);//JPG<50><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
if(avix.SampleRate) //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Ϣ,<2C>ų<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
{
|
||||
//<2F><>ʼ<EFBFBD><CABC>DAC
|
||||
dac.buff1=(u32 *)g_i2sbuf[1];
|
||||
dac.buff2=(u32 *)g_i2sbuf[2];
|
||||
dac.buff_size=avix.AudioBufSize;
|
||||
dac.rate=DAC_GetRate(avix.SampleRate);
|
||||
dac.call_back=audio_i2s_dma_callback;
|
||||
DAC_NormalInit (&dac);
|
||||
}
|
||||
while(1)//<2F><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
{
|
||||
f_read(favi,listhead,8,&nr);
|
||||
if(avi_get_streaminfo(listhead))//<2F><>ȡ<EFBFBD><C8A1>һ֡ <20><><EFBFBD><EFBFBD>־
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (Touch_GetState()->x[1]!=0) break; //<2F><>Ļ<EFBFBD><C4BB><EFBFBD>㴥<EFBFBD><E3B4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (USART3_GetKeyPressed()&(0x08)) break;//<2F><><EFBFBD>·<EFBFBD><C2B7>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(avix.StreamID==AVI_VIDS_FLAG) //<2F><>Ƶ<EFBFBD><C6B5>
|
||||
{
|
||||
pbuf=framebuf;
|
||||
//mymemset (pbuf,0,AVI_VIDEO_BUF_SIZE);
|
||||
f_read(favi,pbuf,avix.StreamSize+8-8,&nr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡+<2B><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44>Ϣ
|
||||
//<2F>ȴ<EFBFBD>֡ʱ<D6A1><CAB1>
|
||||
//while (g_frame_en==0){} g_frame_en=0;
|
||||
while (LCD_GetLayerUpdataStat ()==0);
|
||||
LCD_SwitchLayerBuff();
|
||||
res=mjpegdec_decode(pbuf,avix.StreamSize);
|
||||
if (res==0)
|
||||
{
|
||||
LCD_ExitLayerBuff();
|
||||
}
|
||||
if(res)
|
||||
{
|
||||
//break;
|
||||
}
|
||||
}else //<2F><>Ƶ<EFBFBD><C6B5>
|
||||
{
|
||||
// f_read(favi,audio_buff,avix.StreamSize+8-8,&nr);//<2F><><EFBFBD><EFBFBD>i2sbuf
|
||||
// pbuf=audio_buff;
|
||||
i2ssavebuf++;
|
||||
if(i2ssavebuf>3)i2ssavebuf=0;
|
||||
do
|
||||
{
|
||||
nr=g_i2splaybuf;
|
||||
if(nr)nr--;
|
||||
else nr=3;
|
||||
}while(i2ssavebuf==nr);//<2F><>ײ<EFBFBD>ȴ<EFBFBD>.
|
||||
f_read(favi,g_i2sbuf[i2ssavebuf],avix.StreamSize,&nr);//<2F><><EFBFBD><EFBFBD>i2sbuf
|
||||
u16 *p=(u16 *)g_i2sbuf[i2ssavebuf];
|
||||
for (int i=0;i<avix.StreamSize/2;i++)
|
||||
p[i]=(p[i]+0x8000)>>4;
|
||||
pbuf=g_i2sbuf[i2ssavebuf];
|
||||
}
|
||||
}
|
||||
//avi_tiemr_delete();
|
||||
mjpegdec_free(); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
f_close(favi);
|
||||
}
|
||||
if (loop==0)
|
||||
break;
|
||||
}
|
||||
myfree(framebuf);
|
||||
myfree(favi);
|
||||
myfree(audio_buff);
|
||||
myfree(g_i2sbuf[0]);
|
||||
myfree(g_i2sbuf[1]);
|
||||
myfree(g_i2sbuf[2]);
|
||||
myfree(g_i2sbuf[3]);
|
||||
DAC_NormalDeInit (&dac);
|
||||
return (int)res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,227 +1,205 @@
|
||||
#ifndef __AVI_H
|
||||
#define __AVI_H
|
||||
#include <stm32f4xx.h>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//AVI<56><49>Ƶ<EFBFBD><C6B5>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
||||
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
//All rights reserved
|
||||
#define __AVI_H
|
||||
#include <stm32f4xx.h>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ѧϰʹ<EFBFBD>ã<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>;
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// AVI<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
// <EFBFBD>汾<EFBFBD><EFBFBD>V1.0
|
||||
// <EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
// All rights reserved
|
||||
//*******************************************************************************
|
||||
//<2F><EFBFBD><DEB8><EFBFBD>Ϣ
|
||||
//<2F><>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
// <EFBFBD><EFBFBD>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef enum {
|
||||
AVI_OK=0, //0,<2C>ɹ<EFBFBD>
|
||||
AVI_RIFF_ERR, //1,RIFF ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_AVI_ERR, //2,AVI ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_LIST_ERR, //3,LIST ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_HDRL_ERR, //4,HDRL ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_AVIH_ERR, //5,AVIH ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_STRL_ERR, //6,STRL ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_STRH_ERR, //7,STRH ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_STRF_ERR, //8,STRF ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_MOVI_ERR, //9,MOVI ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_FORMAT_ERR, //10,<2C><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
AVI_STREAM_ERR, //11,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}AVISTATUS;
|
||||
AVI_OK = 0, // 0,<2C>ɹ<EFBFBD>
|
||||
AVI_RIFF_ERR, // 1,RIFF ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_AVI_ERR, // 2,AVI ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_LIST_ERR, // 3,LIST ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_HDRL_ERR, // 4,HDRL ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_AVIH_ERR, // 5,AVIH ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_STRL_ERR, // 6,STRL ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_STRH_ERR, // 7,STRH ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_STRF_ERR, // 8,STRF ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_MOVI_ERR, // 9,MOVI ID<49><44>ȡʧ<C8A1><CAA7>
|
||||
AVI_FORMAT_ERR, // 10,<2C><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
AVI_STREAM_ERR, // 11,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
} AVISTATUS;
|
||||
|
||||
#define AVI_RIFF_ID 0X46464952
|
||||
#define AVI_AVI_ID 0X20495641
|
||||
#define AVI_LIST_ID 0X5453494C
|
||||
#define AVI_HDRL_ID 0X6C726468 // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>־
|
||||
#define AVI_MOVI_ID 0X69766F6D // <20><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD>־
|
||||
#define AVI_STRL_ID 0X6C727473 // strl<72><6C>־
|
||||
|
||||
#define AVI_AVIH_ID 0X68697661 // avih<69>ӿ<EFBFBD><D3BF><EFBFBD>AVI_HDRL_ID
|
||||
#define AVI_STRH_ID 0X68727473 // strh(<28><>ͷ)<29>ӿ<EFBFBD><D3BF><EFBFBD>AVI_STRL_ID
|
||||
#define AVI_STRF_ID 0X66727473 // strf(<28><><EFBFBD><EFBFBD>ʽ)<29>ӿ<EFBFBD><D3BF><EFBFBD>AVI_STRL_ID
|
||||
#define AVI_STRD_ID 0X64727473 // strd<72>ӿ<EFBFBD><D3BF><EFBFBD>AVI_STRL_ID (<28><>ѡ<EFBFBD><D1A1>)
|
||||
|
||||
#define AVI_RIFF_ID 0X46464952
|
||||
#define AVI_AVI_ID 0X20495641
|
||||
#define AVI_LIST_ID 0X5453494C
|
||||
#define AVI_HDRL_ID 0X6C726468 //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>־
|
||||
#define AVI_MOVI_ID 0X69766F6D //<2F><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD>־
|
||||
#define AVI_STRL_ID 0X6C727473 //strl<72><6C>־
|
||||
#define AVI_VIDS_STREAM 0X73646976 // <20><>Ƶ<EFBFBD><C6B5>
|
||||
#define AVI_AUDS_STREAM 0X73647561 // <20><>Ƶ<EFBFBD><C6B5>
|
||||
|
||||
#define AVI_AVIH_ID 0X68697661 //avih<69>ӿ<EFBFBD><D3BF><EFBFBD>AVI_HDRL_ID
|
||||
#define AVI_STRH_ID 0X68727473 //strh(<28><>ͷ)<29>ӿ<EFBFBD><D3BF><EFBFBD>AVI_STRL_ID
|
||||
#define AVI_STRF_ID 0X66727473 //strf(<28><><EFBFBD><EFBFBD>ʽ)<29>ӿ<EFBFBD><D3BF><EFBFBD>AVI_STRL_ID
|
||||
#define AVI_STRD_ID 0X64727473 //strd<72>ӿ<EFBFBD><D3BF><EFBFBD>AVI_STRL_ID (<28><>ѡ<EFBFBD><D1A1>)
|
||||
|
||||
#define AVI_VIDS_STREAM 0X73646976 //<2F><>Ƶ<EFBFBD><C6B5>
|
||||
#define AVI_AUDS_STREAM 0X73647561 //<2F><>Ƶ<EFBFBD><C6B5>
|
||||
|
||||
|
||||
#define AVI_VIDS_FLAG 0X6463 //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>־
|
||||
#define AVI_AUDS_FLAG 0X7762 //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>־
|
||||
#define AVI_VIDS_FLAG 0X6463 // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>־
|
||||
#define AVI_AUDS_FLAG 0X7762 // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>־
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define AVI_FORMAT_MJPG 0X47504A4D
|
||||
#define AVI_FORMAT_MJPG 0X47504A4D
|
||||
|
||||
// AVI <20><>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
// <20><>һЩ<D2BB><D0A9>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef struct __packed {
|
||||
u32 SecPerFrame; // <20><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>λΪus)
|
||||
u32 TotalFrame; // <20>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
u32 Width; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 Height; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 SampleRate; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 Channels; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>Ϊ2,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 AudioBufSize; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
u16 AudioType; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>:0X0001=PCM;0X0050=MP2;0X0055=MP3;0X2000=AC3;
|
||||
u16 StreamID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID,StreamID=='dc'==0X6463 /StreamID=='wb'==0X7762
|
||||
u32 StreamSize; // <20><><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>1.<2E><>Ϊż<CEAA><C5BC>.
|
||||
u8 *VideoFLAG; // <20><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>,VideoFLAG="00dc"/"01dc"
|
||||
u8 *AudioFLAG; // <20><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>,AudioFLAG="00wb"/"01wb"
|
||||
} AVI_INFO;
|
||||
|
||||
//AVI <20><>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
//<2F><>һЩ<D2BB><D0A9>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef struct __packed
|
||||
{
|
||||
u32 SecPerFrame; //<2F><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>λΪus)
|
||||
u32 TotalFrame; //<2F>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
u32 Width; //ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 Height; //ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 SampleRate; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 Channels; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>Ϊ2,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 AudioBufSize; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
u16 AudioType; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>:0X0001=PCM;0X0050=MP2;0X0055=MP3;0X2000=AC3;
|
||||
u16 StreamID; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID,StreamID=='dc'==0X6463 /StreamID=='wb'==0X7762
|
||||
u32 StreamSize; //<2F><><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>1.<2E><>Ϊż<CEAA><C5BC>.
|
||||
u8* VideoFLAG; //<2F><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>,VideoFLAG="00dc"/"01dc"
|
||||
u8* AudioFLAG; //<2F><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>,AudioFLAG="00wb"/"01wb"
|
||||
}AVI_INFO;
|
||||
|
||||
//extern AVI_INFO avix; //avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
// extern AVI_INFO avix; //avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
//AVI <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
u32 RiffID; //RiffID=='RIFF'==0X61766968
|
||||
u32 FileSize; //AVI<56>ļ<EFBFBD><C4BC><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,ҲRIFFID<49><44>FileSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 AviID; //AviID=='AVI '==0X41564920
|
||||
}AVI_HEADER;
|
||||
// AVI <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct {
|
||||
u32 RiffID; // RiffID=='RIFF'==0X61766968
|
||||
u32 FileSize; // AVI<56>ļ<EFBFBD><C4BC><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,ҲRIFFID<49><44>FileSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 AviID; // AviID=='AVI '==0X41564920
|
||||
} AVI_HEADER;
|
||||
|
||||
//AVI <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
u32 FrameID; //֡ID,FrameID=='RIFF'==0X61766968
|
||||
u32 FrameSize; //֡<><D6A1>С
|
||||
}FRAME_HEADER;
|
||||
// AVI <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct {
|
||||
u32 FrameID; // ֡ID,FrameID=='RIFF'==0X61766968
|
||||
u32 FrameSize; // ֡<><D6A1>С
|
||||
} FRAME_HEADER;
|
||||
|
||||
// LIST <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct {
|
||||
u32 ListID; // ListID=='LIST'==0X4c495354
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,ҲListID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 ListType; // LIST<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>:hdrl(<28><>Ϣ<EFBFBD><CFA2>)/movi(<28><><EFBFBD>ݿ<EFBFBD>)/idxl(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>DZ<EFBFBD><C7B1><EFBFBD>,<2C>ǿ<EFBFBD>ѡ<EFBFBD><D1A1>)
|
||||
} LIST_HEADER;
|
||||
|
||||
//LIST <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
u32 ListID; //ListID=='LIST'==0X4c495354
|
||||
u32 BlockSize; //<2F><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,ҲListID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 ListType; //LIST<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>:hdrl(<28><>Ϣ<EFBFBD><CFA2>)/movi(<28><><EFBFBD>ݿ<EFBFBD>)/idxl(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>DZ<EFBFBD><C7B1><EFBFBD>,<2C>ǿ<EFBFBD>ѡ<EFBFBD><D1A1>)
|
||||
}LIST_HEADER;
|
||||
// avih <20>ӿ<EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־:avih==0X61766968
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 SecPerFrame; // <20><>Ƶ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>(<28><>λΪus)
|
||||
u32 MaxByteSec; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>,<2C>ֽ<EFBFBD>/<2F><>
|
||||
u32 PaddingGranularity; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 Flags; // AVI<56>ļ<EFBFBD><C4BC><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 TotalFrame; // <20>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
u32 InitFrames; // Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽָ<CABD><D6B8><EFBFBD><EFBFBD>ʼ֡<CABC><D6A1><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD>ʽӦ<CABD><D3A6>ָ<EFBFBD><D6B8>Ϊ0<CEAA><30>
|
||||
u32 Streams; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ͨ<><CDA8>Ϊ2
|
||||
u32 RefBufSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ļ<EFBFBD><C4BC>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ飩Ĭ<E9A3A9>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>1M<31>ֽ<EFBFBD>!!!
|
||||
u32 Width; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 Height; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 Reserved[4]; // <20><><EFBFBD><EFBFBD>
|
||||
} AVIH_HEADER;
|
||||
|
||||
//avih <20>ӿ<EFBFBD><D3BF><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
u32 BlockID; //<2F><><EFBFBD><EFBFBD>־:avih==0X61766968
|
||||
u32 BlockSize; //<2F><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 SecPerFrame; //<2F><>Ƶ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>(<28><>λΪus)
|
||||
u32 MaxByteSec; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>,<2C>ֽ<EFBFBD>/<EFBFBD><EFBFBD>
|
||||
u32 PaddingGranularity; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 Flags; //AVI<56>ļ<EFBFBD><C4BC><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 TotalFrame; //<2F>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><EFBFBD>
|
||||
u32 InitFrames; //Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽӦ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD>
|
||||
u32 Streams; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ͨ<><CDA8>Ϊ2
|
||||
u32 RefBufSize; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ飩Ĭ<EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1M<EFBFBD>ֽ<EFBFBD>!!!
|
||||
u32 Width; //ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 Height; //ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u32 Reserved[4]; //<2F><><EFBFBD><EFBFBD>
|
||||
}AVIH_HEADER;
|
||||
// strh <20><>ͷ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>Ϣ(strh<72><68>strl)
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־:strh==0X73747268
|
||||
u32 BlockSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 StreamType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬vids(0X73646976):<3A><>Ƶ;auds(0X73647561):<EFBFBD><EFBFBD>Ƶ
|
||||
u32 Handler; // ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>MJPG/H264֮<34><D6AE><EFBFBD><EFBFBD>.
|
||||
u32 Flags; // <20><><EFBFBD>ǣ<EFBFBD><C7A3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>Ƿ<EFBFBD><C7B7>仯<EFBFBD><EFBFBD>
|
||||
u16 Priority; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ΪĬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 Language; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 InitFrames; // Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽָ<CABD><D6B8><EFBFBD><EFBFBD>ʼ֡<EFBFBD><EFBFBD>
|
||||
u32 Scale; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>Ƶÿ<C6B5><C3BF><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
u32 Rate; // Scale/Rate=ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 Start; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>λ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>λΪScale
|
||||
u32 Length; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λΪScale
|
||||
u32 RefBufSize; // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>õĻ<C3B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
u32 Quality; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵԽ<D6B5><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD>
|
||||
u32 SampleSize; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
struct // <20><>Ƶ֡<C6B5><D6A1>ռ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
|
||||
{
|
||||
short Left;
|
||||
short Top;
|
||||
short Right;
|
||||
short Bottom;
|
||||
} Frame;
|
||||
} STRH_HEADER;
|
||||
|
||||
//strh <20><>ͷ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>Ϣ(strh<72><68>strl)
|
||||
typedef struct
|
||||
{
|
||||
u32 BlockID; //<2F><><EFBFBD><EFBFBD>־:strh==0X73747268
|
||||
u32 BlockSize; //<2F><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 StreamType; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬vids(0X73646976):<3A><>Ƶ;auds(0X73647561):<3A><>Ƶ
|
||||
u32 Handler; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>˵<EFBFBD><CBB5><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>MJPG/H264֮<34><D6AE><EFBFBD><EFBFBD>.
|
||||
u32 Flags; //<2F><><EFBFBD>ǣ<EFBFBD><C7A3>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>仯<EFBFBD><EFBFBD>
|
||||
u16 Priority; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ߵ<EFBFBD>ΪĬ<CEAA><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 Language; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 InitFrames; //Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽָ<CABD><D6B8><EFBFBD><EFBFBD>ʼ֡<EFBFBD><EFBFBD>
|
||||
u32 Scale; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>Ƶÿ<C6B5><C3BF><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
u32 Rate; //Scale/Rate=ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 Start; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ŵ<EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>λΪScale
|
||||
u32 Length; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λΪScale
|
||||
u32 RefBufSize; //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD>õĻ<C3B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
u32 Quality; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵԽ<D6B5><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
||||
u32 SampleSize; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
struct //<2F><>Ƶ֡<C6B5><D6A1>ռ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
|
||||
{
|
||||
short Left;
|
||||
short Top;
|
||||
short Right;
|
||||
short Bottom;
|
||||
}Frame;
|
||||
}STRH_HEADER;
|
||||
// BMP<4D>ṹ<EFBFBD><E1B9B9>
|
||||
typedef struct {
|
||||
u32 BmpSize; // bmp<6D>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD>(BmpSize<7A><65><EFBFBD><EFBFBD>)
|
||||
long Width; // ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
long Height; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u16 Planes; // ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1
|
||||
u16 BitCount; // <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>,0X0018<31><38>ʾ24λ
|
||||
u32 Compression; // ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:MJPG/H264<EFBFBD><EFBFBD>
|
||||
u32 SizeImage; // ͼ<><CDBC><EFBFBD><EFBFBD>С
|
||||
long XpixPerMeter; // ˮƽ<CBAE>ֱ<EFBFBD><EFBFBD><EFBFBD>
|
||||
long YpixPerMeter; // <20><>ֱ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 ClrUsed; // ʵ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>,ѹ<><D1B9><EFBFBD><EFBFBD>ʽ<EFBFBD>в<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||
u32 ClrImportant; // <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
||||
} BMP_HEADER;
|
||||
|
||||
//BMP<EFBFBD>ṹ<EFBFBD><EFBFBD>
|
||||
typedef struct
|
||||
{
|
||||
u32 BmpSize; //bmp<6D>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(BmpSize<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
long Width; //ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
long Height; //ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
u16 Planes; //ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1
|
||||
u16 BitCount; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>,0X0018<31><38>ʾ24λ
|
||||
u32 Compression; //ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>:MJPG/H264<36><34>
|
||||
u32 SizeImage; //ͼ<><CDBC><EFBFBD><EFBFBD>С
|
||||
long XpixPerMeter; //ˮƽ<CBAE>ֱ<EFBFBD><D6B1><EFBFBD>
|
||||
long YpixPerMeter; //<2F><>ֱ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
|
||||
u32 ClrUsed; //ʵ<><CAB5>ʹ<EFBFBD><CAB9><EFBFBD>˵<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫ<EFBFBD><C9AB>,ѹ<><D1B9><EFBFBD><EFBFBD>ʽ<EFBFBD>в<EFBFBD>ʹ<EFBFBD><CAB9>
|
||||
u32 ClrImportant; //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ɫ
|
||||
}BMP_HEADER;
|
||||
// <20><>ɫ<EFBFBD><EFBFBD>
|
||||
typedef struct {
|
||||
u8 rgbBlue; // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbGreen; // <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<EFBFBD><EFBFBD>ΧΪ0-255)
|
||||
u8 rgbRed; // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbReserved; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
|
||||
} AVIRGBQUAD;
|
||||
|
||||
//<2F><>ɫ<EFBFBD><EFBFBD>
|
||||
typedef struct
|
||||
{
|
||||
u8 rgbBlue; //<2F><>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbGreen; //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbRed; //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbReserved; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
|
||||
}AVIRGBQUAD;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>strh,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,strf(<28><><EFBFBD><EFBFBD>ʽ)ʹSTRH_BMPHEADER<45><52>
|
||||
typedef struct
|
||||
{
|
||||
u32 BlockID; //<2F><><EFBFBD><EFBFBD>־,strf==0X73747266
|
||||
u32 BlockSize; //<2F><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49>ͱ<EFBFBD>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
BMP_HEADER bmiHeader; //λͼ<CEBB><CDBC>Ϣͷ
|
||||
AVIRGBQUAD bmColors[1]; //<2F><>ɫ<EFBFBD><C9AB>
|
||||
}STRF_BMPHEADER;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>strh,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,strf(<28><><EFBFBD><EFBFBD>ʽ)ʹSTRH_WAVHEADER<45><52>
|
||||
typedef struct
|
||||
{
|
||||
u32 BlockID; //<2F><><EFBFBD><EFBFBD>־,strf==0X73747266
|
||||
u32 BlockSize; //<2F><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49>ͱ<EFBFBD>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u16 FormatTag; //<2F><>ʽ<EFBFBD><CABD>־:0X0001=PCM,0X0055=MP3...
|
||||
u16 Channels; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>Ϊ2,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 SampleRate; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 BaudRate; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 BlockAlign; //<2F><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||
u16 Size; //<2F>ýṹ<C3BD><E1B9B9>С
|
||||
}STRF_WAVHEADER;
|
||||
|
||||
#define MAKEWORD(ptr) (u16)(((u16)*((u8*)(ptr))<<8)|(u16)*(u8*)((ptr)+1))
|
||||
#define MAKEDWORD(ptr) (u32)(((u16)*(u8*)(ptr)|(((u16)*(u8*)(ptr+1))<<8)|\
|
||||
(((u16)*(u8*)(ptr+2))<<16)|(((u16)*(u8*)(ptr+3))<<24)))
|
||||
|
||||
|
||||
AVISTATUS avi_init(u8 *buf,int size); //<2F><>ʼ<EFBFBD><CABC>avi<76><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 avi_srarch_id(u8* buf,int size,u8* id); //<2F><><EFBFBD><EFBFBD>ID,ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
||||
AVISTATUS avi_get_streaminfo(u8* buf); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ,loop==1,ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int video_play (char *pname,int loop);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>strh,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,strf(<28><><EFBFBD><EFBFBD>ʽ)ʹSTRH_BMPHEADER<EFBFBD><EFBFBD>
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־,strf==0X73747266
|
||||
u32 BlockSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49>ͱ<EFBFBD>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
BMP_HEADER bmiHeader; // λͼ<CEBB><CDBC>Ϣͷ
|
||||
AVIRGBQUAD bmColors[1]; // <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>
|
||||
} STRF_BMPHEADER;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>strh,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,strf(<28><><EFBFBD><EFBFBD>ʽ)ʹSTRH_WAVHEADER<45><52>
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־,strf==0X73747266
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49>ͱ<EFBFBD>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u16 FormatTag; // <20><>ʽ<EFBFBD><CABD>־:0X0001=PCM,0X0055=MP3...
|
||||
u16 Channels; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>Ϊ2,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 SampleRate; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 BaudRate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 BlockAlign; // <20><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||
u16 Size; // <20>ýṹ<C3BD><E1B9B9>С
|
||||
} STRF_WAVHEADER;
|
||||
|
||||
#define MAKEWORD(ptr) \
|
||||
(u16)(((u16) * ((u8 *)(ptr)) << 8) | (u16) * (u8 *)((ptr) + 1))
|
||||
#define MAKEDWORD(ptr) \
|
||||
(u32)(((u16) * (u8 *)(ptr) | (((u16) * (u8 *)(ptr + 1)) << 8) | \
|
||||
(((u16) * (u8 *)(ptr + 2)) << 16) | \
|
||||
(((u16) * (u8 *)(ptr + 3)) << 24)))
|
||||
|
||||
AVISTATUS avi_init(u8 *buf, int size); // <20><>ʼ<EFBFBD><CABC>avi<76><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 avi_srarch_id(u8 *buf, int size, u8 *id); // <20><><EFBFBD><EFBFBD>ID,ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
||||
AVISTATUS avi_get_streaminfo(u8 *buf); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ,loop==1,ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int video_play(char *pname, int loop);
|
||||
|
||||
u8 Avih_Parser(u8 *buffer);
|
||||
u8 Strl_Parser(u8 *buffer);
|
||||
u8 Strf_Parser(u8 *buffer);
|
||||
|
||||
|
||||
|
||||
u16 Search_Movi(u8* buffer);
|
||||
u16 Search_Fram(u8* buffer);
|
||||
u32 ReadUnit(u8 *buffer,u8 index,u8 Bytes,u8 Format);
|
||||
u16 Search_Movi(u8 *buffer);
|
||||
u16 Search_Fram(u8 *buffer);
|
||||
u32 ReadUnit(u8 *buffer, u8 index, u8 Bytes, u8 Format);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,223 +1,186 @@
|
||||
#include "mjpeg.h"
|
||||
#include "mjpeg.h"
|
||||
#include "ff.h"
|
||||
#include "lcd_rgb.h"
|
||||
#include "mymem.h"
|
||||
#include "ff.h"
|
||||
#include "lcd_rgb.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ѧϰʹ<EFBFBD>ã<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>;
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//MJPEG<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
//<EFBFBD>汾<EFBFBD><EFBFBD>V1.0
|
||||
//<EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
|
||||
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
//All rights reserved
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// MJPEG<45><47>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
// <EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
// All rights reserved
|
||||
//*******************************************************************************
|
||||
//<2F><EFBFBD><DEB8><EFBFBD>Ϣ
|
||||
//<2F><>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
// <EFBFBD><EFBFBD>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct jpeg_decompress_struct *cinfo;
|
||||
struct my_error_mgr *jerr;
|
||||
u8 *jpegbuf; //jpeg<65><67><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
u32 jbufsize; //jpeg buf<75><66>С
|
||||
u16 imgoffx,imgoffy; //ͼ<><CDBC><EFBFBD><EFBFBD>x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
||||
u8 *jpegbuf; // jpeg<EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
||||
u32 jbufsize; // jpeg buf<75><66>С
|
||||
u16 imgoffx, imgoffy; // ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><EFBFBD><F2B5A5BF>ٵ<EFBFBD><D9B5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
||||
#define MJPEG_MAX_MALLOC_SIZE 38*1024 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>38K<38>ֽ<EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
||||
#define MJPEG_MAX_MALLOC_SIZE 38 * 1024 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><EFBFBD><EFBFBD>38K<EFBFBD>ֽ<EFBFBD>
|
||||
|
||||
u8 *jmembuf; // mjpeg<65><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڴ<EFBFBD><DAB4><EFBFBD>
|
||||
u32 jmempos; // <20>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
|
||||
u8 *jmembuf; //mjpeg<65><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڴ<EFBFBD><DAB4><EFBFBD>
|
||||
u32 jmempos; //<2F>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
|
||||
//mjpeg<65><67><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
void* mjpeg_malloc(u32 num)
|
||||
{
|
||||
u32 curpos=jmempos; //<2F>˴η<CBB4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
jmempos+=num; //<2F><>һ<EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
|
||||
if(jmempos>MJPEG_MAX_MALLOC_SIZE)
|
||||
{
|
||||
printf("mem error:%d,%d",curpos,num);
|
||||
}
|
||||
return (void *)&jmembuf[curpos]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ
|
||||
}
|
||||
// mjpeg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
void *mjpeg_malloc(u32 num) {
|
||||
u32 curpos = jmempos; // <20>˴η<CBB4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
jmempos += num; // <20><>һ<EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
if (jmempos > MJPEG_MAX_MALLOC_SIZE) {
|
||||
printf("mem error:%d,%d", curpos, num);
|
||||
}
|
||||
return (void *)&jmembuf[curpos]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
||||
static void my_error_exit(j_common_ptr cinfo)
|
||||
{
|
||||
my_error_ptr myerr=(my_error_ptr) cinfo->err;
|
||||
(*cinfo->err->output_message) (cinfo);
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
|
||||
METHODDEF(void) my_emit_message(j_common_ptr cinfo, int msg_level)
|
||||
{
|
||||
my_error_ptr myerr=(my_error_ptr) cinfo->err;
|
||||
if(msg_level<0)
|
||||
{
|
||||
printf("emit msg:%d\r\n",msg_level);
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
||||
static void my_error_exit(j_common_ptr cinfo) {
|
||||
my_error_ptr myerr = (my_error_ptr)cinfo->err;
|
||||
(*cinfo->err->output_message)(cinfo);
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
|
||||
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ,<2C><>ִ<EFBFBD><D6B4><EFBFBD>κβ<CEBA><CEB2><EFBFBD>
|
||||
static void init_source(j_decompress_ptr cinfo)
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>.
|
||||
return;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>,һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
||||
static boolean fill_input_buffer(j_decompress_ptr cinfo)
|
||||
{
|
||||
if(jbufsize==0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
//printf("jd read off\r\n");
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
jpegbuf[0] = (u8) 0xFF;
|
||||
jpegbuf[1] = (u8) JPEG_EOI;
|
||||
cinfo->src->next_input_byte =jpegbuf;
|
||||
cinfo->src->bytes_in_buffer = 2;
|
||||
}else
|
||||
{
|
||||
cinfo->src->next_input_byte =jpegbuf;
|
||||
cinfo->src->bytes_in_buffer = jbufsize;
|
||||
jbufsize-=jbufsize;
|
||||
}
|
||||
return TRUE;
|
||||
METHODDEF(void)
|
||||
my_emit_message(j_common_ptr cinfo, int msg_level) {
|
||||
my_error_ptr myerr = (my_error_ptr)cinfo->err;
|
||||
if (msg_level < 0) {
|
||||
printf("emit msg:%d\r\n", msg_level);
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
}
|
||||
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>num_bytes<65><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
|
||||
{
|
||||
/* Just a dumb implementation for now. Could use fseek() except
|
||||
* it doesn't work on pipes. Not clear that being smart is worth
|
||||
* any trouble anyway --- large skips are infrequent.
|
||||
*/
|
||||
if (num_bytes > 0)
|
||||
{
|
||||
while(num_bytes>(long) cinfo->src->bytes_in_buffer)
|
||||
{
|
||||
num_bytes-=(long)cinfo->src->bytes_in_buffer;
|
||||
(void)cinfo->src->fill_input_buffer(cinfo);
|
||||
/* note we assume that fill_input_buffer will never
|
||||
* return FALSE, so suspension need not be handled.
|
||||
*/
|
||||
}
|
||||
cinfo->src->next_input_byte += (size_t) num_bytes;
|
||||
cinfo->src->bytes_in_buffer -= (size_t) num_bytes;
|
||||
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ,<2C><>ִ<EFBFBD><D6B4><EFBFBD>κβ<CEBA><CEB2><EFBFBD>
|
||||
static void init_source(j_decompress_ptr cinfo) {
|
||||
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>.
|
||||
return;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>,һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
||||
static boolean fill_input_buffer(j_decompress_ptr cinfo) {
|
||||
if (jbufsize == 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
// printf("jd read off\r\n");
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
jpegbuf[0] = (u8)0xFF;
|
||||
jpegbuf[1] = (u8)JPEG_EOI;
|
||||
cinfo->src->next_input_byte = jpegbuf;
|
||||
cinfo->src->bytes_in_buffer = 2;
|
||||
} else {
|
||||
cinfo->src->next_input_byte = jpegbuf;
|
||||
cinfo->src->bytes_in_buffer = jbufsize;
|
||||
jbufsize -= jbufsize;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>num_bytes<65><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes) {
|
||||
/* Just a dumb implementation for now. Could use fseek() except
|
||||
* it doesn't work on pipes. Not clear that being smart is worth
|
||||
* any trouble anyway --- large skips are infrequent.
|
||||
*/
|
||||
if (num_bytes > 0) {
|
||||
while (num_bytes > (long)cinfo->src->bytes_in_buffer) {
|
||||
num_bytes -= (long)cinfo->src->bytes_in_buffer;
|
||||
(void)cinfo->src->fill_input_buffer(cinfo);
|
||||
/* note we assume that fill_input_buffer will never
|
||||
* return FALSE, so suspension need not be handled.
|
||||
*/
|
||||
}
|
||||
}
|
||||
//<2F>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>jpeg_finish_decompress<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void term_source(j_decompress_ptr cinfo)
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>κδ<CEBA><CEB4><EFBFBD>
|
||||
return;
|
||||
cinfo->src->next_input_byte += (size_t)num_bytes;
|
||||
cinfo->src->bytes_in_buffer -= (size_t)num_bytes;
|
||||
}
|
||||
}
|
||||
//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>jpeg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
||||
static void jpeg_filerw_src_init(j_decompress_ptr cinfo)
|
||||
{
|
||||
if (cinfo->src == NULL) /* first time for this JPEG object? */
|
||||
{
|
||||
cinfo->src = (struct jpeg_source_mgr *)
|
||||
(*cinfo->mem->alloc_small)((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
||||
sizeof(struct jpeg_source_mgr));
|
||||
}
|
||||
cinfo->src->init_source = init_source;
|
||||
cinfo->src->fill_input_buffer = fill_input_buffer;
|
||||
cinfo->src->skip_input_data = skip_input_data;
|
||||
cinfo->src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
||||
cinfo->src->term_source = term_source;
|
||||
cinfo->src->bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
|
||||
cinfo->src->next_input_byte = NULL; /* until buffer loaded */
|
||||
}
|
||||
|
||||
|
||||
//mjpeg <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
//offx,offy:x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;
|
||||
// 1,ʧ<><CAA7>
|
||||
u8 mjpegdec_init(u16 offx,u16 offy)
|
||||
{
|
||||
cinfo=mymalloc(sizeof(struct jpeg_decompress_struct));
|
||||
jerr=mymalloc(sizeof(struct my_error_mgr));
|
||||
//<2F><><EFBFBD><EFBFBD>sram<61><6D><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>--2020.6.2
|
||||
jmembuf=mymalloc_fast(MJPEG_MAX_MALLOC_SIZE);//MJPEG<45><47><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(cinfo==0||jerr==0||jmembuf==0)
|
||||
{
|
||||
mjpegdec_free();
|
||||
return 1;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
||||
imgoffx=offx;
|
||||
imgoffy=offy;
|
||||
return 0;
|
||||
// <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>jpeg_finish_decompress<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void term_source(j_decompress_ptr cinfo) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>κδ<CEBA><CEB4><EFBFBD>
|
||||
return;
|
||||
}
|
||||
//mjpeg<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
void mjpegdec_free(void)
|
||||
{
|
||||
myfree(cinfo);
|
||||
myfree(jerr);
|
||||
myfree(jmembuf);
|
||||
// <20><>ʼ<EFBFBD><CABC>jpeg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
||||
static void jpeg_filerw_src_init(j_decompress_ptr cinfo) {
|
||||
if (cinfo->src == NULL) /* first time for this JPEG object? */
|
||||
{
|
||||
cinfo->src = (struct jpeg_source_mgr *)(*cinfo->mem->alloc_small)(
|
||||
(j_common_ptr)cinfo, JPOOL_PERMANENT, sizeof(struct jpeg_source_mgr));
|
||||
}
|
||||
cinfo->src->init_source = init_source;
|
||||
cinfo->src->fill_input_buffer = fill_input_buffer;
|
||||
cinfo->src->skip_input_data = skip_input_data;
|
||||
cinfo->src->resync_to_restart =
|
||||
jpeg_resync_to_restart; /* use default method */
|
||||
cinfo->src->term_source = term_source;
|
||||
cinfo->src->bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
|
||||
cinfo->src->next_input_byte = NULL; /* until buffer loaded */
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>JPEGͼƬ
|
||||
//buf:jpeg<65><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//bsize:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>
|
||||
u8 mjpegdec_decode(u8* buf,u32 bsize)
|
||||
{
|
||||
JSAMPARRAY buffer;
|
||||
if(bsize==0)return 1;
|
||||
jpegbuf=buf;
|
||||
jbufsize=bsize;
|
||||
jmempos=0;//MJEPG<50><47><EFBFBD><EFBFBD>,<2C><><EFBFBD>´<EFBFBD>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
|
||||
cinfo->err=jpeg_std_error(&jerr->pub);
|
||||
jerr->pub.error_exit = my_error_exit;
|
||||
jerr->pub.emit_message = my_emit_message;
|
||||
//if(bsize>20*1024)printf("s:%d\r\n",bsize);
|
||||
if (setjmp(jerr->setjmp_buffer)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
jpeg_abort_decompress(cinfo);
|
||||
jpeg_destroy_decompress(cinfo);
|
||||
return 2;
|
||||
}
|
||||
jpeg_create_decompress(cinfo);
|
||||
jpeg_filerw_src_init(cinfo);
|
||||
jpeg_read_header(cinfo, TRUE);
|
||||
cinfo->dct_method = JDCT_IFAST;
|
||||
cinfo->do_fancy_upsampling = 0;
|
||||
jpeg_start_decompress(cinfo);
|
||||
extern void jdmerge_setlcdaddr (unsigned short *addr);
|
||||
unsigned short *lcd_addr=(unsigned short *)LCD_GetDrawAddr();
|
||||
// lcd_addr+=LCD_GetLcdSizeX()*LCD_GetLcdSizeY()-1-(imgoffx+imgoffy*LCD_GetLcdSizeX());
|
||||
jdmerge_setlcdaddr(lcd_addr);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾλ<CABE><CEBB>
|
||||
while (cinfo->output_scanline < cinfo->output_height)
|
||||
{
|
||||
jpeg_read_scanlines(cinfo, buffer, 1);
|
||||
}
|
||||
jpeg_finish_decompress(cinfo);
|
||||
jpeg_destroy_decompress(cinfo);
|
||||
return 0;
|
||||
// mjpeg <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
||||
// offx,offy:x,y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;
|
||||
// 1,ʧ<><EFBFBD>
|
||||
u8 mjpegdec_init(u16 offx, u16 offy) {
|
||||
cinfo = mymalloc(sizeof(struct jpeg_decompress_struct));
|
||||
jerr = mymalloc(sizeof(struct my_error_mgr));
|
||||
// <20><><EFBFBD><EFBFBD>sram<61><6D><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>--2020.6.2
|
||||
jmembuf = mymalloc_fast(MJPEG_MAX_MALLOC_SIZE); // MJPEG<45><47><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (cinfo == 0 || jerr == 0 || jmembuf == 0) {
|
||||
mjpegdec_free();
|
||||
return 1;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
||||
imgoffx = offx;
|
||||
imgoffy = offy;
|
||||
return 0;
|
||||
}
|
||||
// mjpeg<65><67><EFBFBD><EFBFBD>,<2C>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
void mjpegdec_free(void) {
|
||||
myfree(cinfo);
|
||||
myfree(jerr);
|
||||
myfree(jmembuf);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>JPEGͼƬ
|
||||
// buf:jpeg<65><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// bsize:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>
|
||||
u8 mjpegdec_decode(u8 *buf, u32 bsize) {
|
||||
JSAMPARRAY buffer;
|
||||
if (bsize == 0)
|
||||
return 1;
|
||||
jpegbuf = buf;
|
||||
jbufsize = bsize;
|
||||
jmempos = 0; // MJEPG<50><47><EFBFBD><EFBFBD>,<2C><><EFBFBD>´<EFBFBD>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cinfo->err = jpeg_std_error(&jerr->pub);
|
||||
jerr->pub.error_exit = my_error_exit;
|
||||
jerr->pub.emit_message = my_emit_message;
|
||||
// if(bsize>20*1024)printf("s:%d\r\n",bsize);
|
||||
if (setjmp(jerr->setjmp_buffer)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
jpeg_abort_decompress(cinfo);
|
||||
jpeg_destroy_decompress(cinfo);
|
||||
return 2;
|
||||
}
|
||||
jpeg_create_decompress(cinfo);
|
||||
jpeg_filerw_src_init(cinfo);
|
||||
jpeg_read_header(cinfo, TRUE);
|
||||
cinfo->dct_method = JDCT_IFAST;
|
||||
cinfo->do_fancy_upsampling = 0;
|
||||
jpeg_start_decompress(cinfo);
|
||||
extern void jdmerge_setlcdaddr(unsigned short *addr);
|
||||
unsigned short *lcd_addr = (unsigned short *)LCD_GetDrawAddr();
|
||||
// lcd_addr+=LCD_GetLcdSizeX()*LCD_GetLcdSizeY()-1-(imgoffx+imgoffy*LCD_GetLcdSizeX());
|
||||
jdmerge_setlcdaddr(lcd_addr); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾλ<CABE><CEBB>
|
||||
while (cinfo->output_scanline < cinfo->output_height) {
|
||||
jpeg_read_scanlines(cinfo, buffer, 1);
|
||||
}
|
||||
jpeg_finish_decompress(cinfo);
|
||||
jpeg_destroy_decompress(cinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,36 +1,33 @@
|
||||
#ifndef __MJPEG_H
|
||||
#define __MJPEG_H
|
||||
#include "stdio.h"
|
||||
#include <cdjpeg.h>
|
||||
#define __MJPEG_H
|
||||
#include "stdio.h"
|
||||
#include "stm32f4xx.h"
|
||||
#include <cdjpeg.h>
|
||||
#include <setjmp.h>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//MJPEG<45><47>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
||||
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
//All rights reserved
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ѧϰʹ<EFBFBD>ã<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>;
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// MJPEG<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/20
|
||||
// <EFBFBD>汾<EFBFBD><EFBFBD>V1.0
|
||||
// <EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2009-2019
|
||||
// All rights reserved
|
||||
//*******************************************************************************
|
||||
//<2F><EFBFBD><DEB8><EFBFBD>Ϣ
|
||||
//<2F><>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
// <EFBFBD><EFBFBD>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct my_error_mgr {
|
||||
struct jpeg_error_mgr pub;
|
||||
jmp_buf setjmp_buffer; //for return to caller
|
||||
};
|
||||
typedef struct my_error_mgr * my_error_ptr;
|
||||
struct jpeg_error_mgr pub;
|
||||
jmp_buf setjmp_buffer; // for return to caller
|
||||
};
|
||||
typedef struct my_error_mgr *my_error_ptr;
|
||||
|
||||
u8 mjpegdec_init(u16 offx,u16 offy);
|
||||
u8 mjpegdec_init(u16 offx, u16 offy);
|
||||
void mjpegdec_free(void);
|
||||
u8 mjpegdec_decode(u8* buf,u32 bsize);
|
||||
u8 mjpegdec_decode(u8 *buf, u32 bsize);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,186 +1,151 @@
|
||||
#ifndef __MP3PLAY_H__
|
||||
#define __MP3PLAY_H__
|
||||
#include <stm32f4xx.h>
|
||||
#ifndef __MP3PLAY_H__
|
||||
#define __MP3PLAY_H__
|
||||
#include <mp3dec.h>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD>helix MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//MP3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/6/29
|
||||
//<EFBFBD>汾<EFBFBD><EFBFBD>V1.0
|
||||
#include <stm32f4xx.h>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>helix MP3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ALIENTEK STM32F407<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// MP3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/6/29
|
||||
// <20>汾<EFBFBD><E6B1BE>V1.0
|
||||
//********************************************************************************
|
||||
//V1.0 ˵<><CBB5>
|
||||
//1,֧<><D6A7>16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3<50>Ľ<EFBFBD><C4BD><EFBFBD>
|
||||
//2,֧<><D6A7>CBR/VBR<42><52>ʽMP3<50><33><EFBFBD><EFBFBD>
|
||||
//3,֧<><D6A7>ID3V1<56><31>ID3V2<56><32>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD>
|
||||
//4,֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>(MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>320Kbps)<29><><EFBFBD><EFBFBD>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define MP3_TITSIZE_MAX 40 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define MP3_ARTSIZE_MAX 40 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define MP3_FILE_BUF_SZ 20*1024 //MP3<50><33><EFBFBD><EFBFBD>ʱ,<2C>ļ<EFBFBD>buf<75><66>С
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//ȡ2<C8A1><32>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>Сֵ.
|
||||
#ifndef AUDIO_MIN
|
||||
#define AUDIO_MIN(x,y) ((x)<(y)? (x):(y))
|
||||
// V1.0 ˵<><CBB5>
|
||||
// 1,֧<><D6A7>16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3<50>Ľ<EFBFBD><C4BD><EFBFBD>
|
||||
// 2,֧<><D6A7>CBR/VBR<42><52>ʽMP3<50><33><EFBFBD><EFBFBD>
|
||||
// 3,֧<><D6A7>ID3V1<56><31>ID3V2<56><32>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD>
|
||||
// 4,֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>(MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>320Kbps)<29><><EFBFBD><EFBFBD>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define MP3_TITSIZE_MAX 40 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define MP3_ARTSIZE_MAX 40 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define MP3_FILE_BUF_SZ 20 * 1024 // MP3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ,<2C>ļ<EFBFBD>buf<75><66>С
|
||||
|
||||
// ȡ2<C8A1><32>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>Сֵ.
|
||||
#ifndef AUDIO_MIN
|
||||
#define AUDIO_MIN(x, y) ((x) < (y) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
//ID3V1 <20><>ǩ
|
||||
typedef struct __packed
|
||||
{
|
||||
u8 id[3]; //ID,TAG<41><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
u8 title[30]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 artist[30]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 year[4]; //<2F><><EFBFBD><EFBFBD>
|
||||
u8 comment[30]; //<2F><>ע
|
||||
u8 genre; //<2F><><EFBFBD><EFBFBD>
|
||||
}ID3V1_Tag;
|
||||
|
||||
//ID3V2 <20><>ǩͷ
|
||||
typedef struct __packed
|
||||
{
|
||||
u8 id[3]; //ID
|
||||
u8 mversion; //<2F><><EFBFBD>汾<EFBFBD><EFBFBD>
|
||||
u8 sversion; //<2F>Ӱ汾<EFBFBD><EFBFBD>
|
||||
u8 flags; //<2F><>ǩͷ<EFBFBD><EFBFBD>־
|
||||
u8 size[4]; //<2F><>ǩ<EFBFBD><C7A9>Ϣ<EFBFBD><CFA2>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩͷ10<31>ֽ<EFBFBD>).<2E><><EFBFBD><EFBFBD>,<2C><>ǩ<EFBFBD><C7A9>С=size+10.
|
||||
}ID3V2_TagHead;
|
||||
// ID3V1 <20><>ǩ
|
||||
typedef struct __packed {
|
||||
u8 id[3]; // ID,TAG<41><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
u8 title[30]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 artist[30]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 year[4]; // <20><><EFBFBD><EFBFBD>
|
||||
u8 comment[30]; // <EFBFBD><EFBFBD>ע
|
||||
u8 genre; // <20><><EFBFBD><EFBFBD>
|
||||
} ID3V1_Tag;
|
||||
|
||||
//ID3V2.3 <20>汾֡ͷ
|
||||
typedef struct __packed
|
||||
{
|
||||
u8 id[4]; //֡ID
|
||||
u8 size[4]; //֡<EFBFBD><EFBFBD>С
|
||||
u16 flags; //֡<EFBFBD><EFBFBD>־
|
||||
}ID3V23_FrameHead;
|
||||
// ID3V2 <20><>ǩͷ
|
||||
typedef struct __packed {
|
||||
u8 id[3]; // ID
|
||||
u8 mversion; // <20><><EFBFBD>汾<EFBFBD><E6B1BE>
|
||||
u8 sversion; // <20>Ӱ汾<EFBFBD><EFBFBD>
|
||||
u8 flags; // <20><>ǩͷ<EFBFBD><EFBFBD>־
|
||||
u8 size[4]; // <20><>ǩ<EFBFBD><C7A9>Ϣ<EFBFBD><CFA2>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩͷ10<31>ֽ<EFBFBD>).<2E><><EFBFBD><EFBFBD>,<2C><>ǩ<EFBFBD><C7A9>С=size+10.
|
||||
} ID3V2_TagHead;
|
||||
|
||||
//MP3 Xing֡<67><D6A1>Ϣ(û<><C3BB>ȫ<EFBFBD><C8AB><EFBFBD>г<EFBFBD><D0B3><EFBFBD>,<2C><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>)
|
||||
typedef struct __packed
|
||||
{
|
||||
u8 id[4]; //֡ID,ΪXing/Info
|
||||
u8 flags[4]; //<2F><><EFBFBD>ű<EFBFBD>־
|
||||
u8 frames[4]; //<2F><>֡<EFBFBD><D6A1>
|
||||
u8 fsize[4]; //<2F>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID3)
|
||||
}MP3_FrameXing;
|
||||
|
||||
//MP3 VBRI֡<49><D6A1>Ϣ(û<><C3BB>ȫ<EFBFBD><C8AB><EFBFBD>г<EFBFBD><D0B3><EFBFBD>,<2C><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>)
|
||||
typedef struct __packed
|
||||
{
|
||||
u8 id[4]; //֡ID,ΪXing/Info
|
||||
u8 version[2]; //<2F>汾<EFBFBD><E6B1BE>
|
||||
u8 delay[2]; //<2F>ӳ<EFBFBD>
|
||||
u8 quality[2]; //<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>,0~100,Խ<><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
||||
u8 fsize[4]; //<2F>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С
|
||||
u8 frames[4]; //<2F>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
}MP3_FrameVBRI;
|
||||
// ID3V2.3 <20>汾֡ͷ
|
||||
typedef struct __packed {
|
||||
u8 id[4]; // ֡ID
|
||||
u8 size[4]; // ֡<><D6A1>С
|
||||
u16 flags; // ֡<><EFBFBD>־
|
||||
} ID3V23_FrameHead;
|
||||
|
||||
// MP3 Xing֡<67><D6A1>Ϣ(û<><C3BB>ȫ<EFBFBD><C8AB><EFBFBD>г<EFBFBD><D0B3><EFBFBD>,<2C><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>)
|
||||
typedef struct __packed {
|
||||
u8 id[4]; // ֡ID,ΪXing/Info
|
||||
u8 flags[4]; // <20><><EFBFBD>ű<EFBFBD>־
|
||||
u8 frames[4]; // <20><>֡<EFBFBD><D6A1>
|
||||
u8 fsize[4]; // <20>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID3)
|
||||
} MP3_FrameXing;
|
||||
|
||||
//MP3<EFBFBD><EFBFBD><EFBFBD>ƽṹ<EFBFBD><EFBFBD>
|
||||
typedef struct __packed
|
||||
{
|
||||
u8 title[MP3_TITSIZE_MAX]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 artist[MP3_ARTSIZE_MAX]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 totsec ; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>,<2C><>λ:<EFBFBD><EFBFBD>
|
||||
u32 cursec ; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
|
||||
u8 *jpeg_data; //ר<><D7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 jpeg_len; //ר<><D7A8><EFBFBD><EFBFBD><EFBFBD>泤<EFBFBD><E6B3A4>
|
||||
// MP3 VBRI֡<49><D6A1>Ϣ(û<><C3BB>ȫ<EFBFBD><C8AB><EFBFBD>г<EFBFBD><D0B3><EFBFBD>,<2C><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>)
|
||||
typedef struct __packed {
|
||||
u8 id[4]; // ֡ID,ΪXing/Info
|
||||
u8 version[2]; // <20>汾<EFBFBD><EFBFBD>
|
||||
u8 delay[2]; // <20>ӳ<EFBFBD>
|
||||
u8 quality[2]; // <EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,0~100,Խ<><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD>
|
||||
u8 fsize[4]; // <20>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С
|
||||
u8 frames[4]; // <20>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
} MP3_FrameVBRI;
|
||||
|
||||
u32 bitrate; //<2F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 samplerate; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 outsamples; //PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><>16λΪ<CEBB><CEAA>λ),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*2(<28><><EFBFBD><EFBFBD>DAC<41><43><EFBFBD><EFBFBD>)
|
||||
// MP3<EFBFBD><EFBFBD><EFBFBD>ƽṹ<EFBFBD><EFBFBD>
|
||||
typedef struct __packed {
|
||||
u8 title[MP3_TITSIZE_MAX]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 artist[MP3_ARTSIZE_MAX]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 totsec; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><>λ:<3A><>
|
||||
u32 cursec; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
|
||||
u32 datastart; //<2F><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>(<28><><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>)
|
||||
}__mp3ctrl;
|
||||
u8 *jpeg_data; // ר<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 jpeg_len; // ר<><D7A8><EFBFBD><EFBFBD><EFBFBD>泤<EFBFBD><E6B3A4>
|
||||
|
||||
//extern __mp3ctrl * mp3ctrl;
|
||||
u32 bitrate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32 samplerate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 outsamples; // PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><>16λΪ<CEBB><CEAA>λ),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*2(<28><><EFBFBD><EFBFBD>DAC<41><43><EFBFBD><EFBFBD>)
|
||||
|
||||
u32 datastart; // <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>(<28><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>)
|
||||
} __mp3ctrl;
|
||||
|
||||
// extern __mp3ctrl * mp3ctrl;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//<2F><><EFBFBD>ֲ<EFBFBD><D6B2>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD>ֲ<EFBFBD><D6B2>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef enum {
|
||||
AP_OK=0X00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
AP_NEXT, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
AP_PREV, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
AP_ERR=0X80, //<2F><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>(û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>)
|
||||
}APRESULT;
|
||||
AP_OK = 0X00, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
AP_NEXT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
AP_PREV, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
AP_ERR = 0X80, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>(û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>)
|
||||
} APRESULT;
|
||||
|
||||
//<2F><><EFBFBD>ֲ<EFBFBD><D6B2>ſ<EFBFBD><C5BF><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef struct __packed
|
||||
{
|
||||
//2<><32>I2S<32><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUF
|
||||
u8 *i2sbuf1;
|
||||
u8 *i2sbuf2;
|
||||
u8 *tbuf; //<2F><>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u32(*file_seek)(u32);//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD>
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD>ſ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef struct __packed {
|
||||
// 2<><32>I2S<32><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUF
|
||||
u8 *i2sbuf1;
|
||||
u8 *i2sbuf2;
|
||||
u8 *tbuf; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||
u32 (*file_seek)(u32); // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
vu8 status; //bit0:0,<2C><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//bit1:0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//bit2~3:<3A><><EFBFBD><EFBFBD>
|
||||
//bit4:0,<2C><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>;1,<2C><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
//bit5:0,<2C><EFBFBD><DEB6><EFBFBD>;1,ִ<><D6B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
//bit6:0,<2C><EFBFBD><DEB6><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>(<28><><EFBFBD>Dz<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||
//bit7:0,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>/<2F><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>;1,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>)
|
||||
|
||||
u8 mode; //<2F><><EFBFBD><EFBFBD>ģʽ
|
||||
//0,ȫ<><C8AB>ѭ<EFBFBD><D1AD>;1,<2C><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>;2,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
|
||||
u8 *name; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 namelen; //name<6D><65>ռ<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>.
|
||||
u16 curnamepos; //<2F><>ǰ<EFBFBD><C7B0>ƫ<EFBFBD><C6AB>
|
||||
vu8 status; // bit0:0,<2C><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// bit1:0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// bit2~3:<3A><><EFBFBD><EFBFBD>
|
||||
// bit4:0,<2C><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>;1,<2C><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
// bit5:0,<2C><EFBFBD><DEB6><EFBFBD>;1,ִ<><D6B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
// bit6:0,<2C><EFBFBD><DEB6><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>(<28><><EFBFBD>Dz<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||
// bit7:0,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>/<2F><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>;1,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>)
|
||||
|
||||
u32 totsec ; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>,<2C><>λ:<3A><>
|
||||
u32 cursec ; //<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||
u32 bitrate; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(λ<><CEBB>)
|
||||
u32 samplerate; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 bps; //λ<><CEBB>,<2C><><EFBFBD><EFBFBD>16bit,24bit,32bit
|
||||
|
||||
|
||||
}__audiodev;
|
||||
u8 mode; // <20><><EFBFBD><EFBFBD>ģʽ
|
||||
// 0,ȫ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>;1,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>;2,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
|
||||
u8 *name; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 namelen; // name<6D><65>ռ<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>.
|
||||
u16 curnamepos; // <20><>ǰ<EFBFBD><C7B0>ƫ<EFBFBD><C6AB>
|
||||
|
||||
u32 totsec; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><>λ:<3A><>
|
||||
u32 cursec; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
u32 bitrate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(λ<><CEBB>)
|
||||
u32 samplerate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 bps; // λ<><CEBB>,<2C><><EFBFBD><EFBFBD>16bit,24bit,32bit
|
||||
|
||||
} __audiodev;
|
||||
|
||||
u16 GetRBIT16(u16);
|
||||
|
||||
void mp3_i2s_dma_tx_callback(void);
|
||||
void mp3_fill_buffer(u16 *buf, u16 size, u8 nch);
|
||||
u8 mp3_id3v1_decode(u8 *buf, __mp3ctrl *pctrl);
|
||||
u8 mp3_id3v2_decode(u8 *buf, u32 size, __mp3ctrl *pctrl);
|
||||
u8 mp3_get_info(u8 *data, u32 size, __mp3ctrl *pctrl);
|
||||
|
||||
|
||||
|
||||
u16 GetRBIT16 (u16);
|
||||
|
||||
|
||||
|
||||
|
||||
void mp3_i2s_dma_tx_callback(void) ;
|
||||
void mp3_fill_buffer(u16* buf,u16 size,u8 nch);
|
||||
u8 mp3_id3v1_decode(u8* buf,__mp3ctrl *pctrl);
|
||||
u8 mp3_id3v2_decode(u8* buf,u32 size,__mp3ctrl *pctrl);
|
||||
u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl);
|
||||
|
||||
__audiodev *mp3_getAudiodev (void);
|
||||
__mp3ctrl *mp3_getMp3Info (void);
|
||||
|
||||
|
||||
|
||||
__audiodev *mp3_getAudiodev(void);
|
||||
__mp3ctrl *mp3_getMp3Info(void);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>0 ֧<>֣<EFBFBD><D6A3><EFBFBD>0 <20><>֧<EFBFBD><D6A7>
|
||||
int mp3_get_support (u8* data,u32 size) ;
|
||||
int mp3_get_support_name (const char *name);
|
||||
int mp3_get_support(u8 *data, u32 size);
|
||||
int mp3_get_support_name(const char *name);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>е<EFBFBD>mp3<70>ļ<EFBFBD>
|
||||
u8 mp3_play_song(u8* data,u32 size);
|
||||
u8 mp3_play_song(u8 *data, u32 size);
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
||||
char *mp3_get_name(void);
|
||||
@@ -189,11 +154,11 @@ char *mp3_get_name(void);
|
||||
char *mp3_get_artist(void);
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>1<EFBFBD>ɹ<EFBFBD>
|
||||
int mp3_get_time(int *totsec,int *cursec);
|
||||
int mp3_get_time(int *totsec, int *cursec);
|
||||
|
||||
void mp3_stop (void);
|
||||
void mp3_play (void);
|
||||
void mp3_suspend (void);
|
||||
void mp3_stop(void);
|
||||
void mp3_play(void);
|
||||
void mp3_suspend(void);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int mp3_set_vol(int vol);
|
||||
@@ -208,31 +173,3 @@ int mp3_sub_val(int vol);
|
||||
int mp3_get_vol(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user