Exemple #1
0
//=======================================================================================
//		avi decode paser header
//=======================================================================================
VIDEO_CODEC_STATUS	video_decode_paser_header(VIDEO_INFO *video_info, VIDEO_ARGUMENT arg, MEDIA_SOURCE src)
{
	INT32S nRet, video_type;
	struct sfn_info fd_info;
	
	if(video_decode_status() == VIDEO_CODEC_PROCESS_PAUSE) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	
	if(video_decode_status() == VIDEO_CODEC_PROCESSING) {
		return VIDEO_CODEC_STATUS_ERR;
	}
					
	if((src.type != SOURCE_TYPE_FS) && (src.type != SOURCE_TYPE_FS_RESOURCE_IN_FILE)) {	
		DEBUG_MSG(DBG_PRINT("Only Support GP File System\r\n"));		
		return 	VIDEO_CODEC_RESOURCE_NO_FOUND;
	}
	
	if(src.Format.VideoFormat != MJPEG && src.Format.VideoFormat != MPEG4) {
		DEBUG_MSG(DBG_PRINT("Only Support MJPEG and MPEG4\r\n"));		
		return	CHANNEL_ASSIGN_ERROR;
	}
	
	if(src.type_ID.FileHandle < 0) {	
		DEBUG_MSG(DBG_PRINT("File handle Error\r\n"));
		return RESOURCE_READ_ERROR;
	}
	
	if(src.type == SOURCE_TYPE_FS_RESOURCE_IN_FILE) {
		video_type = FILE_TYPE_AVI;
		fd_info.f_size = src.type_ID.temp;
	} else {
		sfn_stat(src.type_ID.FileHandle, &fd_info);
		video_type = vid_dec_get_file_format((INT8S*)fd_info.f_extname);
	}
	
	if(video_type < 0) {
		close(src.type_ID.FileHandle);
		return VIDEO_CODEC_STATUS_ERR;
	}
		
	nRet = vid_dec_parser_start(src.type_ID.FileHandle, video_type, fd_info.f_size);
	if(nRet < 0) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	
	video_decode_Info(video_info);		
	return VIDEO_CODEC_STATUS_OK;
}
Exemple #2
0
//========================================================================================
//	video decode set play speed 
//========================================================================================
VIDEO_CODEC_STATUS video_decode_set_reserve_play(INT32U enable)
{
	if(video_decode_status() == VIDEO_CODEC_PROCESSING) {
		if(vid_dec_set_reverse_play(enable) < 0) {
			return VIDEO_CODEC_STATUS_ERR;
		}
	}
	return VIDEO_CODEC_STATUS_OK;
}
Exemple #3
0
//========================================================================================
//	video decode set play speed 
//========================================================================================
VIDEO_CODEC_STATUS video_decode_set_play_speed(FP32 speed)
{
	if(video_decode_status() == VIDEO_CODEC_PROCESSING) {
		if(vid_dec_set_play_speed(speed * 0x10000) < 0) {
			return VIDEO_CODEC_STATUS_ERR;
		}
	}
	return VIDEO_CODEC_STATUS_OK;
}
Exemple #4
0
//=======================================================================================
//		video decode resume
//=======================================================================================
VIDEO_CODEC_STATUS video_decode_resume(void)
{
	if(video_decode_status() != VIDEO_CODEC_PROCESS_PAUSE) {
		return VIDEO_CODEC_STATUS_ERR;
	}	
	
	if(vid_dec_resume() < 0) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	return VIDEO_CODEC_STATUS_OK;
}
Exemple #5
0
//=======================================================================================
//		video decode pause
//=======================================================================================
VIDEO_CODEC_STATUS video_decode_pause(void)
{
	if(video_decode_status() != VIDEO_CODEC_PROCESSING) {
		return VIDEO_CODEC_STATUS_ERR;
	}
		
	if(vid_dec_pause() < 0) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	return VIDEO_CODEC_STATUS_OK;
}
Exemple #6
0
//========================================================================================
//	video decode set play time, jump somewhere and play 
//========================================================================================
VIDEO_CODEC_STATUS video_decode_set_play_time(INT32S SecTime)
{
	if(video_decode_status() == VIDEO_CODEC_PASER_HEADER_FAIL){
		return VIDEO_CODEC_STATUS_ERR;
	}
	
	if(video_decode_status() == VIDEO_CODEC_PROCESS_END) {
		return  VIDEO_CODEC_PROCESS_END;
	}
			
	if(SecTime < 0) {
		SecTime = 0;
	}
	
	if(SecTime >= vid_dec_get_total_time()) {
		return VIDEO_CODEC_STATUS_ERR;
	}	
	
	if(vid_dec_set_play_time(SecTime) < 0) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	return VIDEO_CODEC_STATUS_OK;
}
SINT32 ExtGpVideoEngineGetStatus()
{
	return video_decode_status();
}
//=================================================================================================
//	Platform demo code
//=================================================================================================
void Platform_Demo_Code(void)
{
	char 	video_path[32] ="C:\\Demo0091NBA.avi"; 
	char    audio_path[32] = "C:\\happy.mp3";
	char    image_path1[32] = "C:\\chen52.jpg";
	char    image_path2[32] = "C:\\chen53.jpg";
	INT8S	volume;
	INT32S  nRet;
	INT32U  decode_output_ptr;
	AUDIO_ARGUMENT audio_arg;
	IMAGE_ARGUMENT image_arg;
	VIDEO_ARGUMENT video_arg;
	VIDEO_INFO	information;
	MEDIA_SOURCE   src;
	AUDIO_CODEC_STATUS 	audio_status;
	IMAGE_CODEC_STATUS  image_status;
	VIDEO_CODEC_STATUS  video_status;
		
	while(1)
	{
		if(_devicemount(USE_DISK))					// Mount device
		{
			DBG_PRINT("Mount Disk Fail[%d]\r\n", USE_DISK);
	#if	USE_DISK == FS_NAND1
			nRet = _format(FS_NAND1, FAT32_Type);
			DrvNand_flush_allblk();	
			_deviceunmount(FS_NAND1); 		
	#endif									
		}
		else
		{
			DBG_PRINT("Mount Disk success[%d]\r\n", USE_DISK);
			break;
		}
	}

	switch(USE_DISK)
	{
	case FS_SD:	
		gp_memcpy((INT8S*)video_path, (INT8S*)"C:\\Demo0091NBA.avi", sizeof(video_path));
		gp_memcpy((INT8S*)audio_path, (INT8S*)"C:\\happy.mp3", sizeof(audio_path));
		gp_memcpy((INT8S*)image_path1, (INT8S*)"C:\\chen52.jpg", sizeof(image_path1));
		gp_memcpy((INT8S*)image_path2, (INT8S*)"C:\\chen53.jpg", sizeof(image_path2));
		break;
	case FS_NAND1:	
		gp_memcpy((INT8S*)video_path, (INT8S*)"A:\\Demo0091NBA.avi", sizeof(video_path));
		gp_memcpy((INT8S*)audio_path, (INT8S*)"A:\\happy.mp3", sizeof(audio_path));
		gp_memcpy((INT8S*)image_path1, (INT8S*)"A:\\chen52.jpg", sizeof(image_path1));
		gp_memcpy((INT8S*)image_path2, (INT8S*)"A:\\chen53.jpg", sizeof(image_path2));
		break;	
	case FS_USBH:	
		gp_memcpy((INT8S*)video_path, (INT8S*)"G:\\Demo0091NBA.avi", sizeof(video_path));
		gp_memcpy((INT8S*)audio_path, (INT8S*)"G:\\happy.mp3", sizeof(audio_path));
		gp_memcpy((INT8S*)image_path1, (INT8S*)"G:\\chen52.jpg", sizeof(image_path1));
		gp_memcpy((INT8S*)image_path2, (INT8S*)"G:\\chen53.jpg", sizeof(image_path2));
		break;		
	}
	
	// Initialize display device
#if C_DISPLAY_DEVICE >= C_TV_QVGA
	tv_init();
#if C_DISPLAY_DEVICE == C_TV_QVGA
	tv_start (TVSTD_NTSC_J_NONINTL, TV_QVGA, TV_NON_INTERLACE);	
#elif C_DISPLAY_DEVICE == C_TV_VGA
	tv_start (TVSTD_NTSC_J, TV_HVGA, TV_INTERLACE);
#elif C_DISPLAY_DEVICE == C_TV_D1
	tv_start (TVSTD_NTSC_J, TV_D1, TV_NON_INTERLACE);
#else
	while(1);
#endif
#else
	tft_init();
	tft_start(C_DISPLAY_DEVICE);
#endif
		
	user_defined_video_codec_entrance();
	audio_decode_entrance();
	image_decode_entrance();
	video_decode_entrance();     

	adc_key_scan_init(); //init key scan	
	volume = 0x3F;
	nRet = C_DISPLAY_DEV_HPIXEL*C_DISPLAY_DEV_VPIXEL*2;	
	decode_output_ptr = (INT32U) gp_malloc_align(nRet, 64);//malloc decode frame buffer
	while(!decode_output_ptr);
	
	while(1)
	{
		adc_key_scan();
		if(ADKEY_IO1)	
		{	//play audio
			if(video_decode_status() == VIDEO_CODEC_PROCESS_END)
			{
				src.type = SOURCE_TYPE_FS;
				src.type_ID.FileHandle = open(audio_path, O_RDONLY);
				src.Format.AudioFormat = MP3;
				
				audio_arg.Main_Channel = 1;		// Use DAC Channel A+B
				audio_arg.L_R_Channel = 3;		// Left + Right Channel
				audio_arg.mute = 0;
				audio_arg.volume = volume;		// volume level = 0~63
				
				G_snd_info.Speed = 12;					//for speed control(golbal var)
			    G_snd_info.Pitch = 12;					//for pitch control(golbal var)
				
				audio_status = audio_decode_start(audio_arg, src);
			}
		}
		else if(ADKEY_IO2)		
		{
			if(audio_decode_status(audio_arg) == AUDIO_CODEC_PROCESSING)
				audio_decode_stop(audio_arg);
		}
		else if(ADKEY_IO3)    
		{	//play image
			if(video_decode_status() == VIDEO_CODEC_PROCESS_END)
			{
				src.type = SOURCE_TYPE_FS;
				if((nRet++ % 2) == 0)
					src.type_ID.FileHandle = (INT32U)open(image_path1, O_RDONLY);
				else
					src.type_ID.FileHandle = (INT32U)open(image_path2, O_RDONLY);
				
				image_arg.OutputBufPtr=(INT8U *)decode_output_ptr;            //decode output buffer
				image_arg.OutputBufWidth = C_DISPLAY_DEV_HPIXEL;                  //width of output buffer 
				image_arg.OutputBufHeight = C_DISPLAY_DEV_VPIXEL;                 //Heigh of output buffer
				image_arg.OutputWidth = C_DISPLAY_DEV_HPIXEL;                     //scaler width of output image
				image_arg.OutputHeight = C_DISPLAY_DEV_VPIXEL;                    //scaler Heigh of output image
				image_arg.OutBoundaryColor = 0x008080;
				image_arg.ScalerOutputRatio = FIT_OUTPUT_SIZE;
				image_arg.OutputFormat = IMAGE_OUTPUT_FORMAT_YUYV;  
				
				image_decode_start(image_arg, src);
				while (1) 
				{
			 		image_status=image_decode_status();
	         		if (image_status == IMAGE_CODEC_DECODE_END) 
	         		{
						video_codec_show_image(C_DISPLAY_DEVICE, (INT32U)decode_output_ptr, C_DISPLAY_DEVICE,IMAGE_OUTPUT_FORMAT_YUYV);
						break;
			  		}
			  		else if(image_status==IMAGE_CODEC_DECODE_FAIL) 
			  		{
						DBG_PRINT("image decode failed\r\n");
						break;
			  		}
			  	}
			  	image_encode_stop();
			  	close(src.type_ID.FileHandle);
		  	}		
		}
		else if(ADKEY_IO4)     
		{
			audio_arg.Main_Channel = 1;
			if(audio_decode_status(audio_arg) == AUDIO_CODEC_PROCESS_END) 
			{
				DBG_PRINT("video_decode_start\r\n");	
				video_arg.bScaler = TRUE;
				video_arg.bUseDefBuf = FALSE;
				video_arg.DisplayWidth = C_DISPLAY_DEV_HPIXEL;		
				video_arg.DisplayHeight = C_DISPLAY_DEV_VPIXEL;	
				video_arg.DisplayBufferWidth = C_DISPLAY_DEV_HPIXEL;	
				video_arg.DisplayBufferHeight = C_DISPLAY_DEV_VPIXEL;	
				video_arg.OutputFormat = IMAGE_OUTPUT_FORMAT_YUYV;	
						
				src.type = SOURCE_TYPE_FS;
				src.Format.VideoFormat = MJPEG;	
				src.type_ID.FileHandle = open(video_path, O_RDONLY);
					
				if(src.type_ID.FileHandle < 0)
				{
					DBG_PRINT("file open fail\r\n");
					close(src.type_ID.FileHandle);
					continue;
				}
					
				video_status = video_decode_paser_header(&information, video_arg, src);
				if(video_status != VIDEO_CODEC_STATUS_OK)
				{
					DBG_PRINT("paser header fail !!!\r\n");
					continue;
				}
				video_decode_start(video_arg, src);
				audio_decode_volume(volume);
			}
		}
		else if(ADKEY_IO5)    
		{		
			if(video_decode_status() == VIDEO_CODEC_PROCESSING)
			{
				video_decode_stop();
				DBG_PRINT("video_decode_stop\r\n");
			}
		}
		else if(ADKEY_IO6)     
		{
			
		}
		else if(ADKEY_IO7)    
		{
	
		}
		else if(ADKEY_IO8)
		{
		
		}
	}
}
Exemple #9
0
//========================================================================================
// get n-th video frame data
//========================================================================================
VIDEO_CODEC_STATUS video_decode_get_nth_video_frame(VIDEO_INFO *video_info, VIDEO_ARGUMENT arg, MEDIA_SOURCE src, INT32U nth_frame)
{
	INT16U width, height;
	INT32S nRet, nTemp;
	INT32U video_output_format;
	
	//check playing
	if(video_decode_status() == VIDEO_CODEC_PROCESS_PAUSE) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	
	if(video_decode_status() == VIDEO_CODEC_PROCESSING) {
		return VIDEO_CODEC_STATUS_ERR;
	}	
		
	//format
	switch(arg.OutputFormat)
	{
	case IMAGE_OUTPUT_FORMAT_RGB565: 	video_output_format = C_SCALER_CTRL_OUT_RGB565; break;
	case IMAGE_OUTPUT_FORMAT_YUYV: 		video_output_format = C_SCALER_CTRL_OUT_YUYV; break;
	case IMAGE_OUTPUT_FORMAT_UYVY: 		video_output_format = C_SCALER_CTRL_OUT_UYVY; break;
#if MCU_VERSION < GPL327XX
	case IMAGE_OUTPUT_FORMAT_RGB1555: 	video_output_format = C_SCALER_CTRL_OUT_RGB1555; break;	
	case IMAGE_OUTPUT_FORMAT_RGBG: 		video_output_format = C_SCALER_CTRL_OUT_RGBG; break;
	case IMAGE_OUTPUT_FORMAT_GRGB: 		video_output_format = C_SCALER_CTRL_OUT_GRGB; break;
	case IMAGE_OUTPUT_FORMAT_YUYV8X32: 	video_output_format = C_SCALER_CTRL_OUT_YUYV8X32; break;
	case IMAGE_OUTPUT_FORMAT_YUYV8X64:	video_output_format = C_SCALER_CTRL_OUT_YUYV8X64; break;
	case IMAGE_OUTPUT_FORMAT_YUYV16X32: video_output_format = C_SCALER_CTRL_OUT_YUYV16X32; break;
	case IMAGE_OUTPUT_FORMAT_YUYV16X64: video_output_format = C_SCALER_CTRL_OUT_YUYV16X64; break;
	case IMAGE_OUTPUT_FORMAT_YUYV32X32: video_output_format = C_SCALER_CTRL_OUT_YUYV32X32; break;
	case IMAGE_OUTPUT_FORMAT_YUYV64X64: video_output_format = C_SCALER_CTRL_OUT_YUYV64X64; break;
	case IMAGE_OUTPUT_FORMAT_YUV422: 	video_output_format = C_SCALER_CTRL_OUT_YUV422; break;
	case IMAGE_OUTPUT_FORMAT_YUV420: 	video_output_format = C_SCALER_CTRL_OUT_YUV420; break;
	case IMAGE_OUTPUT_FORMAT_YUV411: 	video_output_format = C_SCALER_CTRL_OUT_YUV411; break;
	case IMAGE_OUTPUT_FORMAT_YUV444: 	video_output_format = C_SCALER_CTRL_OUT_YUV444; break;
	case IMAGE_OUTPUT_FORMAT_Y_ONLY: 	video_output_format = C_SCALER_CTRL_OUT_Y_ONLY; break;
#endif
	default: return CODEC_START_STATUS_ERROR_MAX;
	}
	
	if(video_decode_paser_header(video_info, arg, src) != VIDEO_CODEC_STATUS_OK) {
		return VIDEO_CODEC_STATUS_ERR;
	}
		
	//scaler
	vid_dec_get_size(&width, &height);
	if(arg.bScaler & 0x01) {
		p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_SCALER_FULL_SCREEN;
		vid_dec_set_scaler(C_SCALER_FULL_SCREEN, video_output_format, arg.DisplayWidth, arg.DisplayHeight, arg.DisplayBufferWidth, arg.DisplayBufferHeight);
	} else if(arg.bScaler & 0x02) {
		p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_NO_SCALER_FIT_BUFFER;
		vid_dec_set_scaler(C_NO_SCALER_FIT_BUFFER, video_output_format, arg.DisplayWidth, arg.DisplayHeight, arg.DisplayBufferWidth, arg.DisplayBufferHeight);
	} else if(arg.bScaler & 0x04) {
		p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_SCALER_FIT_BUFFER;
		vid_dec_set_scaler(C_SCALER_FIT_BUFFER, video_output_format, arg.DisplayWidth, arg.DisplayHeight, arg.DisplayBufferWidth, arg.DisplayBufferHeight);	
	} else {
		p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_NO_SCALER;
		vid_dec_set_scaler(C_NO_SCALER, video_output_format, width, height, width, height);
	} 
	
	//deblock
	vid_dec_set_deblock_flag(FALSE);
	//user define buffer
	vid_dec_set_user_define_buffer(arg.bUseDefBuf, (INT32U)arg.AviDecodeBuf1, (INT32U)arg.AviDecodeBuf2);
	nRet = vid_dec_nth_frame(1);
	nTemp = vid_dec_parser_stop();
	if(nRet < 0 || nTemp < 0) {
		return VIDEO_CODEC_STATUS_ERR;
	}
	return VIDEO_CODEC_STATUS_OK;
}