?? chp_dl_media_from_host.c
字號:
/**====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*
Chp_dl_media_from_host.c
Copyright (c) 2003 by CHIPNUTS Incorporated. All Rights Reserved.
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/
/**===========================================================================
Revisions of Chp_dl_media_from_host.c
Version Name Date Description
1.0 Eric 10/26/2004 Initial Version
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/
#include "chp_dl_media_comdef.h"
#include "chp_dl_media_sysapi.h"
#include "chp_dl_media_if.h"
#include "chp_dl_media_from_host.h"
#include "chp_dl_media_comm.h"
#include "chp_dl_media_midi.h"
#include "chp_dl_media_lyric.h"
#include "chp_dl_media_sd.h"
#include "chp_dl_media_mp3.h"
#ifdef MPEG4_MODULE_ENABLE
#include "chp_dl_media_mpeg4.h"
#endif
UINT8 mp4_mjp_flag = 0;
DL_MEDIA_HOST_DATA_T dl_media_host_data;
extern MEDIA_CALLBACK_TBL_T dl_media_callback;
UINT8 dl_media_host_test_buffer[1024*800];
UINT32 length_2 = 1024*800;
extern UINT16 sd_buf[];
//extern UINT8 DL_MEDIA_IIC_TYPE;
#ifdef MPEG4_MODULE_ENABLE
extern DL_MEDIA_MPG4_INFO_T mpg4_info;
#endif
const int aryBitRates[2][3][16] = {
{ //MPEG 2 & 2.5
{0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0}, //Layer I
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, //Layer II
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0} //Layer III
},{ //MPEG 1
{0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448,0}, //Layer I
{0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384,0}, //Layer II
{0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,0} //Layer III
}
};
const int aryFrequencies[3][3] = {
{44100, 48000, 32000}, //MPEG 1
{22050, 24000, 16000}, //MPEG 2
{32000, 16000, 8000} //MPEG 2.5
};
#define MP3_ID3_TAG_LENGTH 10
extern DL_DISP_RET_T dl_lcd_display_scn_hd66773(RECT_T* p_lcd_rect,UINT8 * p_buf);
#ifdef SEMIHOST_USING
DL_MEDIA_RET_T dl_media_host_save_file(const char *p_filename, void *p_data, UINT32 length)
{
UINT32 handle, ret, offsize, wsize;
UINT8 *p_write = p_data;
handle = Fopen(p_filename, 5);
if (handle == 0)
return DL_MEDIA_RET_FAIL;
offsize = 0;
for (; offsize != length;)
{
if (length - offsize >= 16384)
wsize = 16384;
else
wsize = length - offsize;
ret = Fwrite(handle, p_write, wsize);
if (ret != 0)
return DL_MEDIA_RET_FAIL;
offsize += wsize;
p_write += wsize;
}
ret = Fclose(handle);
if (ret != 0)
return DL_MEDIA_RET_FAIL;
else
return DL_MEDIA_RET_SUCCESS;
}
DL_MEDIA_RET_T dl_media_host_read_file(const char *p_filename, void *p_buffer, UINT32 *p_length)
{
UINT32 handle, ret, offsize, size, wsize;
handle = Fopen(p_filename, 1);
size = Flen(handle);
if (size > *p_length)
{
*p_length = 0;
return DL_MEDIA_RET_FAIL;
}
offsize = 0;
for (; offsize != size;)
{
if (size - offsize >= 16384)
wsize = 16384;
else
wsize = size - offsize;
ret = Fread(handle, p_buffer, wsize);
if (ret != 0)
return DL_MEDIA_RET_FAIL;
offsize += wsize;
p_buffer = (UINT8*)p_buffer + wsize;
}
*p_length = size;
ret = Fclose(handle);
if (ret != 0)
return DL_MEDIA_RET_FAIL;
else
return DL_MEDIA_RET_SUCCESS;
}
DL_MEDIA_RET_T dl_media_host_compare_file(void *p_buffer, UINT32 length)
{
UINT32 handle, ret, size, readsize, cmpsize;
UINT8 buffer[128], *p_read = p_buffer;
handle = Fopen("d:\\Tanent\\1.mp3", 1);
size = Flen(handle);
if (size != length)
return DL_MEDIA_RET_FAIL;
for (readsize = 0; readsize < size; readsize += cmpsize)
{
if (size - readsize >= 128)
cmpsize = 128;
else
cmpsize = size - readsize;
ret = Fread(handle, buffer, cmpsize);
if (sys_memcmp(buffer, p_read, cmpsize))
return DL_MEDIA_RET_FAIL;
p_read += cmpsize;
}
ret = Fclose(handle);
if (ret != 0)
return DL_MEDIA_RET_FAIL;
else
return DL_MEDIA_RET_SUCCESS;
}
#endif
DL_MEDIA_RET_T dl_media_host_get_data_for_mp4(UINT8 *p_buffer, UINT32 *p_length)
{
DL_MEDIA_RET_T ret;
DL_MEDIA_IOU_FRAME_T dl_media_frame;
UINT32 toreadlen, readinglen, readlen, readsize;
DL_MEDIA_RET_T error_flag = DL_MEDIA_RET_SUCCESS;
readsize = 0;
for (; ;)
{
ret = dl_media_iou_read_frame((UINT8 *)&dl_media_frame);
FATAL_ERROR_TO_RESET(ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if (dl_media_frame.type == IOU_FRAME_SET_DATA_LENGTH)
{
toreadlen = dl_media_frame.size_hi << 16 | dl_media_frame.size_low;
// sys_printf("toreadlen =0x%x \n", toreadlen);
if (readsize + toreadlen > *p_length)
{
*p_length = readsize;
error_flag = DL_MEDIA_RET_FAIL;
}
else
{
readsize += toreadlen;
// sys_printf("readsize =0x%x \n", readsize);
}
for (readlen = 0; readlen != toreadlen; readlen += readinglen)
{
ret = dl_media_iou_read_data_for_big_endian(&readinglen, (UINT16*)p_buffer);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if(error_flag == DL_MEDIA_RET_SUCCESS)
p_buffer += readinglen;
}
if(error_flag == DL_MEDIA_RET_FAIL) return error_flag;
}
else
{
*p_length = readsize;
if (dl_media_frame.type == IOU_FRAME_TRAN_JPG)
break;
else if (dl_media_frame.type == IOU_FRAME_ARM_RSP && dl_media_frame.rsp == RSP_SUCCESS)
return DL_MEDIA_RET_SUCCESS;
else
return DL_MEDIA_RET_FAIL;
}
}
ret = dl_media_iou_read_frame((UINT8 *)&dl_media_frame);
FATAL_ERROR_TO_RESET(ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if(dl_media_frame.type == IOU_FRAME_ARM_RSP && dl_media_frame.rsp == 0)
return DL_MEDIA_RET_SUCCESS;
else
return DL_MEDIA_RET_FAIL;
}
DL_MEDIA_RET_T dl_media_host_get_data(UINT8 *p_buffer, UINT32 *p_length)
{
DL_MEDIA_RET_T ret;
DL_MEDIA_IOU_FRAME_T dl_media_frame;
UINT32 toreadlen, readinglen, readlen, readsize;
DL_MEDIA_RET_T error_flag = DL_MEDIA_RET_SUCCESS;
readsize = 0;
for (; ;)
{
ret = dl_media_iou_read_frame((UINT8 *)&dl_media_frame);
sys_printf("dl_media_iou_read_frame ret=0x%x,type=0x%x,rsp=0x%x\n",ret,dl_media_frame.type,dl_media_frame.rsp);
FATAL_ERROR_TO_RESET(ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if (dl_media_frame.type == IOU_FRAME_SET_DATA_LENGTH)
{
toreadlen = dl_media_frame.size_hi << 16 | dl_media_frame.size_low;
sys_printf("toreadlen =0x%x,*p_length=0x%x \n", toreadlen,*p_length);
if (readsize + toreadlen > *p_length)
{
*p_length = readsize;
error_flag = DL_MEDIA_RET_FAIL;
}
else
{
readsize += toreadlen;
// sys_printf("readsize =0x%x \n", readsize);
}
for (readlen = 0; readlen != toreadlen; readlen += readinglen)
{
#ifndef CHP_BIG_ENDIAN
ret = dl_media_iou_read_data(&readinglen, (UINT16*)p_buffer);
#else
ret = dl_media_iou_read_data_for_big_endian(&readinglen, (UINT16*)p_buffer);
#endif
sys_printf("dl_media_iou_read_data ret=0x%x\n",ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if(error_flag == DL_MEDIA_RET_SUCCESS)
p_buffer += readinglen;
}
if(error_flag == DL_MEDIA_RET_FAIL) return error_flag;
}
else
{
*p_length = readsize;
if (dl_media_frame.type == IOU_FRAME_TRAN_JPG)
break;
else if (dl_media_frame.type == IOU_FRAME_ARM_RSP && dl_media_frame.rsp == RSP_SUCCESS)
return DL_MEDIA_RET_SUCCESS;
else
return DL_MEDIA_RET_FAIL;
}
}
ret = dl_media_iou_read_frame((UINT8 *)&dl_media_frame);
sys_printf("2222dl_media_iou_read_frame ret=0x%x,type=0x%x,rsp=0x%x\n",ret,dl_media_frame.type,dl_media_frame.rsp);
FATAL_ERROR_TO_RESET(ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if(dl_media_frame.type == IOU_FRAME_ARM_RSP && dl_media_frame.rsp == 0)
return DL_MEDIA_RET_SUCCESS;
else
return DL_MEDIA_RET_FAIL;
}
DL_MEDIA_RET_T dl_media_host_send_data(void *p_buffer, UINT32 length)
{
DL_MEDIA_RET_T ret;
DL_MEDIA_IOU_FRAME_T dl_media_frame;
UINT16 iou_size[4];
UINT8 *p_send = (UINT8*)p_buffer;
UINT32 offsize, offset, wsize;
for (; ;)
{
ret = dl_media_iou_read_frame((UINT8 *)&dl_media_frame);
// sys_printf("dl_media_iou_read_frame is end rst = %d, type=%d, rsp=0x%x\n", ret,dl_media_frame.type,dl_media_frame.rsp);
FATAL_ERROR_TO_RESET(ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
if (dl_media_frame.type == IOU_FRAME_REQ_FILE_LENGTH)
{
iou_size[0] = 0xfff0;
iou_size[1] = 0x0000;
iou_size[2] = length;
iou_size[3] = length >> 16;
ret = dl_media_iou_write_cmd(iou_size, 8);
// sys_printf("dl_media_iou_write_cmd is end rst = %d\n", ret);
if (ret != DL_MEDIA_RET_SUCCESS)
return ret;
offsize = 0;
offset = 0;
}
else if (dl_media_frame.type == IOU_FRAME_OFFSET_SIZE)
{
offset = dl_media_frame.value[2]<<16 | dl_media_frame.value[1];
if (dl_media_frame.value[0] == 0)
offsize = offset;
else if (dl_media_frame.value[0] == 1)
offsize += offset;
else if (dl_media_frame.value[0] == 2)
offsize = length - offset;
p_send = (UINT8 *)p_buffer + offsize;
wsize = (dl_media_frame.size_hi << 16) | dl_media_frame.size_low;
if (wsize != 0)
{
ret = dl_media_iou_write_data(p_send, wsize);
// sys_printf("dl_media_iou_write_data_for_big_endian is end rst = %d\n", ret);
if(ret!= DL_MEDIA_RET_SUCCESS)
return DL_MEDIA_RET_FAIL;
offsize += wsize;
}
}
else if (dl_media_frame.type == IOU_FRAME_ARM_RSP)
{
if (dl_media_frame.rsp == RSP_MJPG_PLAY_START ||
dl_media_frame.rsp == RSP_SUCCESS)
return DL_MEDIA_RET_SUCCESS;
else
return DL_MEDIA_RET_FAIL;
}
else
return DL_MEDIA_RET_FAIL;
}
}
void dl_media_host_handle_rsp_data(void *p_para)
{
DL_MEDIA_IOU_FRAME_T dl_media_frame;
UINT32 toreadlen, readinglen, readlen;
UINT8 *p_buffer = dl_media_host_data.p_buffer;
UINT32 *p_length = dl_media_host_data.p_length;
UINT32 length = *dl_media_host_data.p_length;
UINT16 ret;
UINT16 temp = 0;
ret =dl_media_iou_read_frame((UINT8*)&dl_media_frame);
sys_printf("****ret=%d, type=0x%x,rsp=0x%x \n",ret,dl_media_frame.type,dl_media_frame.rsp);
FATAL_ERROR_TO_RESET(ret);
if (dl_media_frame.type == IOU_FRAME_SET_DATA_LENGTH)
{
toreadlen = dl_media_frame.size_hi << 16 | dl_media_frame.size_low;
p_buffer = (UINT8*)p_buffer + dl_media_host_data.size;
if (dl_media_host_data.size + toreadlen+5120 > *p_length)
{
temp = 1;
/*
dl_media_host_data.ret = DL_MEDIA_RET_FAIL;
return;
*/
sys_printf("***********over buf********** \n");
}
dl_media_host_data.size += toreadlen;
for (readlen = 0; readlen != toreadlen; readlen += readinglen)
{
dl_media_iou_read_data(&readinglen, (UINT16*)p_buffer);
p_buffer = (UINT8*)p_buffer + readinglen;
}
if (temp == 1)
{
dl_media_host_data.ret = DL_MEDIA_RET_FAIL;
dl_media_interrupt_disable();
dl_media_iou_int_disable();
dl_media_callback.cmd_callback = NULL;
ret = dl_media_send_cmd(DL_MEDIA_CMD_CMR_MJP_CAPTURE_END, NULL);
if (ret != DL_MEDIA_RET_SUCCESS)
{
dl_media_iou_int_restore();
return ;
}
dl_media_host_data.p_buffer = (UINT8*)dl_media_host_data.p_buffer + dl_media_host_data.size;
length -= dl_media_host_data.size;
ret = dl_media_host_get_data(dl_media_host_data.p_buffer, &length);
dl_media_host_data.size = dl_media_host_data.size + length;
dl_media_iou_int_restore();
}
return;
}
else if (dl_media_frame.type == IOU_FRAME_ARM_RSP && dl_media_frame.rsp == RSP_SUCCESS)
{
sys_printf("***********END********* \n");
return;
}
dl_media_host_data.ret = DL_MEDIA_RET_FAIL;
return;
}
extern UINT8 KTV_Play_Flag;
extern UINT8 KTV_Over_Check;
/* for U8 data in big endian mode*/
void dl_media_host_handle_rsp_for_mp4ktv(void *p_para)
{
DL_MEDIA_IOU_FRAME_T dl_media_frame;
UINT16 iou_size[4],ret;
UINT8 *p_buffer = dl_media_host_data.p_buffer;
UINT32 length = dl_media_host_data.length;
ret =dl_media_iou_read_frame((UINT8*)&dl_media_frame);
// sys_printf("dl_media_iou_read_frame is end rst = %d, type=%d, rsp=0x%x\n", ret,dl_media_frame.type,dl_media_frame.rsp);
FATAL_ERROR_TO_RESET(ret);
if (dl_media_frame.type == IOU_FRAME_REQ_FILE_LENGTH)
{
iou_size[0] = 0xfff0;
iou_size[1] = 0x0000;
iou_size[2] = length;
iou_size[3] = length >> 16;
ret = dl_media_iou_write_cmd(iou_size, 8);
// sys_printf("dl_media_iou_write_cmd is end rst = %d\n", ret);
dl_media_host_data.offsize = 0;
dl_media_host_data.offset = 0;
}
else if (dl_media_frame.type == IOU_FRAME_OFFSET_SIZE)
{
dl_media_host_data.offset = dl_media_frame.value[2]<<16 | dl_media_frame.value[1];
if (dl_media_frame.value[0] == 0)
dl_media_host_data.offsize = dl_media_host_data.offset;
else if (dl_media_frame.value[0] == 1)
dl_media_host_data.offsize += dl_media_host_data.offset;
else if (dl_media_frame.value[0] == 2)
dl_media_host_data.offsize = dl_media_host_data.size - dl_media_host_data.offset;
p_buffer = dl_media_host_data.p_buffer + dl_media_host_data.offsize;
dl_media_host_data.wsize = (dl_media_frame.size_hi << 16) | dl_media_frame.size_low;
if (dl_media_host_data.wsize != 0)
{
ret = dl_media_iou_write_data(p_buffer, dl_media_host_data.wsize);
//sys_printf("dl_media_iou_write_data_for_big_endian is end rst = %d\n", ret);
dl_media_host_data.offsize += dl_media_host_data.wsize;
}
}
else if (dl_media_frame.type == IOU_FRAME_ARM_RSP)
{
if (dl_media_frame.rsp == RSP_MJPG_PLAY_START ||
dl_media_frame.rsp == RSP_MP3_PLAY_START ||
dl_media_frame.rsp == RSP_SUCCESS)
{
// sys_printf("********Start or sucess******** \n");
return;
}
else if ( dl_media_frame.rsp == RSP_MJPG_PLAY_OVER)
{
dl_media_interrupt_disable();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -