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

📄 chp_dl_media_from_host.c

📁 C625 host控制源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/**====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*

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