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

📄 resize.c

📁 dm270 source code
💻 C
字号:
/*
    DM270 ARM Evaluation Software

    (c)Texas Instruments 2003
*/

#include <system/uart270.h>
#include <system/osd270.h>

#include <user/osd.h>
#include <user/armdsp.h>
#include <user/intc.h>

#include <appl/still.h>

#include <dsp/dspsource.h>

#include <demo/menu.h>
#include <demo/ui.h>

#include <demo/dm270_demo.h>
#include <demo_gui/demo_gui.h>
#include <demo/mem_alloc.h>

#include <appl/resize.h>

RESIZE_IMAGE_CMD	ResizeCmd;
RESIZE_IMAGE_REPLY	ResizeReply;
static OSD_WinConfigData		vwin0Config_zoom;
static OSD_VideoWinModeData		vwin0Mode_zoom;

void RESIZE_dsp_zoom();

void RESIZE_MENU_run()
{
	char ch;

	while(1) {
		UART_sendString( UART0, resize_menu );

		ch = UI_getInput();

		GUI_slideShowPanelClear();
		GUI_slideShowPanelReset();

		switch(ch) {
			case '0':
				GUI_fileInfoPanelClear();
				return;
			case '1':
				RESIZE_run();	
				break;
			default:
				break;
		}
	}

}


typedef struct{
	Uint16 resample_u;
	Uint16 resample_d;
} ZoomRatio;

void RESIZE_run()
{

	int i, i_limit;
	volatile int j;
	int in_addr_offset;
	Uint16 img_width, img_height, resize_img_width, resize_img_height;

	ZoomRatio zoom_in_ratios[] = {
	   	{11,10}, {12,10}, {13,10}, {14,10}, {15,10}, {16,10}, {17,10},
	    {18,10}, {19,10}, {20,10}, {21,10}, {22,10}, {23,10}, {24,10},
	    {25,10}, {26,10}, /*{27,10},*/ {28,10}, /*{29,10},*/ {30,10}};
	ZoomRatio zoom_out_ratios[] = {
		{ 4,16}, { 5,16}, { 6,16}, { 7,16}, { 4, 8}, { 9,16}, { 3, 5},
	    { 5, 8}, {11,16}, { 7,10}, { 3, 4}, { 4, 5}, {13,16}, { 7, 8},
	    { 9,10}, {15,16}};
  
	STILL_PLAYBACK_run();

  	
  	// Save 720x480 image that is currently in OSD VIDEO WIN0 area
	memcpy ((char*)WORK_AREA_ADDR, (char*)OSD_VIDEO_WIN0_ADDR, 720*480*2);    

	// ZOOM-OUT TESTING
	// Set Resize Parameters
	ResizeCmd.SrcAddrHigh= HIGH_WORD(WORK_AREA_OFFSET);
	ResizeCmd.SrcAddrLow = LOW_WORD(WORK_AREA_OFFSET);
	ResizeCmd.DstAddrHigh= HIGH_WORD(OSD_VIDEO_WIN0_OFFSET);
	ResizeCmd.DstAddrLow = LOW_WORD(OSD_VIDEO_WIN0_OFFSET);
	
	img_width = OSD_RGET(VIDWIN0XL);
	img_height= OSD_RGET(VIDWIN0YL)*2;
	
	ResizeCmd.ImgWidth   = img_width;
	ResizeCmd.ImgHeight  = img_height;

	vwin0Config_zoom.address = (char*)OSD_VIDEO_WIN0_ADDR;
	vwin0Config_zoom.displayMode = OSD_FRAME_MODE;
	vwin0Config_zoom.hzoom   = OSD_NO_ZOOM;
	vwin0Config_zoom.vzoom   = OSD_NO_ZOOM;

	vwin0Mode_zoom.expandFilterEnable = FALSE;
	vwin0Mode_zoom.hexpand = FALSE;
	vwin0Mode_zoom.vexpand = FALSE;
	

	OSD_setVideoWinMode( &vwin0Mode_zoom ); 
	OSD_winEnable( OSD_VID_WIN0, TRUE);

	i_limit = sizeof(zoom_out_ratios)/sizeof(ZoomRatio);
	UART_sendString( UART0, "\r\n\n Resizing demo in progress." );
	UART_sendString( UART0, "\r\n\n This resizing demo uses iMX do the resizing.\r\n" );
	UART_sendString( UART0, "\r\n Downsampling...\r\n" );
	for (i=i_limit-1; i>=0; --i)
	{
		ResizeCmd.Resample_U = zoom_out_ratios[i].resample_u;
		ResizeCmd.Resample_D = zoom_out_ratios[i].resample_d;
		ResizeCmd.DstBuffWidth = (ResizeCmd.ImgWidth*ResizeCmd.Resample_U)/
									ResizeCmd.Resample_D;
		resize_img_width=ResizeCmd.DstBuffWidth;
			
		ResizeCmd.DstBuffWidth = (ResizeCmd.DstBuffWidth+ (Uint16)15)&
									((Uint16)(~15));
		ResizeCmd.DstBuffHeight = (ResizeCmd.ImgHeight*ResizeCmd.Resample_U)/
									ResizeCmd.Resample_D;
		resize_img_height=ResizeCmd.DstBuffHeight;							
		
		OSD_winEnable( OSD_VID_WIN0, FALSE);
		RESIZE_dsp_zoom();
		if (ResizeReply.Status == (Uint16)0xFFFF) 
			continue;
		
		// Save a 160x120 image for zoom in test
		if((ResizeCmd.Resample_U==4)&&(ResizeCmd.Resample_D==16)) {
			{
				int i;
				char *src_addr, *dst_addr;
				Uint32 offset;

				offset = ResizeCmd.DstBuffWidth;
				dst_addr=(char*)WORK_AREA_ADDR+720*480*2;
				src_addr=(char*)OSD_VIDEO_WIN0_ADDR;

				for(i=0;i<resize_img_height;i++) {
					memcpy( dst_addr, src_addr, resize_img_width*2);
					src_addr += offset*2;
					dst_addr += resize_img_width*2;
				}
			}
		}

		vwin0Config_zoom.offset  = ResizeCmd.DstBuffWidth*2;
		vwin0Config_zoom.width   = ResizeReply.EffectiveWidth;
		vwin0Config_zoom.height  = ResizeReply.EffectiveHeight/2;
		vwin0Config_zoom.startX  = (720-vwin0Config_zoom.width)/2;
		vwin0Config_zoom.startY  = (240-vwin0Config_zoom.height)/2;

		OSD_setWinConfig(OSD_VID_WIN0, &vwin0Config_zoom );	
		OSD_winEnable( OSD_VID_WIN0, TRUE);
		sprintf( UART_outBuff, "[%dx%d]-", ResizeReply.EffectiveWidth, ResizeReply.EffectiveHeight );
		UART_sendString( UART0, UART_outBuff );
		TMRDelay(500);
	}
	

	// ZOOM-IN TESTING
	// Set Resize Parameters
	in_addr_offset = WORK_AREA_OFFSET+720*480*2;
	ResizeCmd.SrcAddrHigh= HIGH_WORD(in_addr_offset);
	ResizeCmd.SrcAddrLow = LOW_WORD(in_addr_offset);
	ResizeCmd.DstAddrHigh= HIGH_WORD(OSD_VIDEO_WIN0_OFFSET);
	ResizeCmd.DstAddrLow = LOW_WORD(OSD_VIDEO_WIN0_OFFSET);
	ResizeCmd.ImgWidth   = resize_img_width;
	ResizeCmd.ImgHeight  = resize_img_height;

	i_limit = sizeof(zoom_in_ratios)/sizeof(ZoomRatio);
	UART_sendString( UART0, "\r\n Upsampling...\r\n" );
	for (i=0; i<i_limit; ++i)
	{
		ResizeCmd.Resample_U = zoom_in_ratios[i].resample_u;
		ResizeCmd.Resample_D = zoom_in_ratios[i].resample_d;
		ResizeCmd.DstBuffWidth = (ResizeCmd.ImgWidth*ResizeCmd.Resample_U)/
									ResizeCmd.Resample_D;
		ResizeCmd.DstBuffWidth = (ResizeCmd.DstBuffWidth+ (Uint16)15)&
									((Uint16)(~15));
		ResizeCmd.DstBuffHeight = (ResizeCmd.ImgHeight*ResizeCmd.Resample_U)/
									ResizeCmd.Resample_D;
		
		OSD_winEnable( OSD_VID_WIN0, FALSE);
		RESIZE_dsp_zoom();
		if (ResizeReply.Status == (Uint16)0xFFFF)
		  continue;
		
		vwin0Config_zoom.offset  = ResizeCmd.DstBuffWidth*2;
		vwin0Config_zoom.width   = ResizeReply.EffectiveWidth;
		vwin0Config_zoom.height  = ResizeReply.EffectiveHeight/2;
		vwin0Config_zoom.startX  = (720-vwin0Config_zoom.width)/2;
		vwin0Config_zoom.startY  = (240-vwin0Config_zoom.height)/2;
		
		OSD_setWinConfig(OSD_VID_WIN0, &vwin0Config_zoom );	
		OSD_winEnable( OSD_VID_WIN0, TRUE);
		sprintf( UART_outBuff, "[%dx%d]-", ResizeReply.EffectiveWidth, ResizeReply.EffectiveHeight );
		UART_sendString( UART0, UART_outBuff );
		TMRDelay(500);
	}
	UART_sendString( UART0, "\r\n Resizing demo complete.\r\n" );
}

void RESIZE_dsp_zoom()
{
  	// start resize on DSP side
	{
		Uint16 cmd;

		// reset DSP
		DSPC_reset();

		// clear ARM-DSP communication area
		ARMDSP_clearReg();

		// load image pipe code to DSP side
		DSPLoadCode(digital_zoom);

		// wait for DSP to be ready
		do {
			ARMDSP_getArmCmd(&cmd, NULL, 0);
		} while( cmd != 0x777 ) ;

		// clear DSP HINT interrupt
		INTC_clearIRQ( INT_DSP );

		// send command to start image pipe
		profile_clear(0);
		profile_start(0);
		ARMDSP_sendDspCmd(RESIZE_IMAGE, (Uint16*)&ResizeCmd, sizeof(RESIZE_IMAGE_CMD)/2);

		// wait for resize to complete
		INTC_waitForInt(INT_DSP, 0);
		profile_end(0);
		// get execution status
		ARMDSP_getDspReply(&cmd, (Uint16*)&ResizeReply, sizeof(RESIZE_IMAGE_REPLY)/2 );

		if(    (cmd & 0xFFF) != RESIZE_IMAGE  
			|| (cmd & DSP_CMD_COMPLETE ) != DSP_CMD_COMPLETE 
			|| (cmd & DSP_CMD_INVALID_CMD ) || (cmd & DSP_CMD_INVALID_PARAM ) ) 
		{
			sprintf( UART_outBuff, "\r\n E_DEVICE : Resize Image. Execution status [0x%x] \r\n",
				cmd );
			UART_sendString( UART0,  UART_outBuff );
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -