view src/aci2/mfw/mfw_fv.c @ 662:8cd8fd15a095

SIM speed enhancement re-enabled and made configurable TI's original code supported SIM speed enhancement, but Openmoko had it disabled, and OM's disabling of speed enhancement somehow caused certain SIM cards to start working which didn't work before (OM's bug #666). Because our FC community is much smaller in year 2020 than OM's community was in their day, we are not able to find one of those #666-affected SIMs, thus the real issue they had encountered remains elusive. Thus our solution is to re-enable SIM speed enhancement and simply wait for if and when someone runs into a #666-affected SIM once again. We provide a SIM_allow_speed_enhancement global variable that allows SIM speed enhancement to be enabled or disabled per session, and an /etc/SIM_spenh file in FFS that allows it to enabled or disabled on a non-volatile basis. SIM speed enhancement is now enabled by default.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 May 2020 05:02:28 +0000
parents 93999a60b835
children
line wrap: on
line source

/*
+--------------------------------------------------------------------+
| PROJECT:	MMI-Framework (8417)		$Workfile::	mfw_fv.c	    $|
| $Author::	NDH							$Revision::	1			    $|
| CREATED:	21.05.04		     		$Modtime::	21.05.04 14:58	$|
| STATE  :	code														 |
+--------------------------------------------------------------------+

   MODULE  : MFW_FV

   PURPOSE : This module contains File Viewer Interface functions.

   HISTORY  :
   	Oct 06, 2005    REF: SPR 34560 xdeepadh
   	Description: File Viewer: Image stored in the FFS is not displayed in the file viewer
   	Solution: Screen updation will be performed , soon after the decoding/color conversion 
   	of the image is completed.
   	
   	Aug 22, 2005    REF: ENH 31154 xdeepadh
   	Description: Application to Test Camera
   	Solution: Implemeted the Fileviewer to view the jpeg images.Camera Application to 
   	preview,capture and save image has been implemented.
	
*/

#define ENTITY_MFW
/*
** Include Files
*/

/* includes */
#include <string.h>
#include "typedefs.h"
#include "mfw_mfw.h"
#include "mfw_sys.h"
#include "mfw_fv.h"

//Includes of IMGIL
#include "img/imgil1_api.h"
#include "img/imgil1_i.h"
#include "gil/gil_gpf.h"
#include "dspl.h"



//Variable defines

T_IMG_YUV_BUFFER qcif_yuv_tempbuf;
extern UINT8 qcif_yuv_lum[FV_DSPL_VOLUME]; 		 //decoded and Scaled  lum buffer
extern UINT8 qcif_yuv_cb[FV_SCALE_VOLUME];		//decoded and Scaled cb  buffer
extern UINT8 qcif_yuv_cr[FV_SCALE_VOLUME];		//decoded and Scaled cr buffer

extern UINT8 qcif_rgb_array[ FV_DSPL_VOLUME  *  2];			//Color converted buffer to view
extern UINT8 rgb_img_process_array[FV_DSPL_VOLUME  *  2];  	//Color converted buffer for zoom/rotate

T_IMG_YUV_BUFFER qcif_process_buffer;
extern UINT8 qcif_yuv_process_lum[FV_DSPL_VOLUME ];		//lum buffer for rotate and zoom
extern UINT8 qcif_yuv_process_cb[FV_SCALE_VOLUME];		//cb buffer for rotate and zoom
extern UINT8 qcif_yuv_process_cr[FV_SCALE_VOLUME];		//cr buffer for rotate and zoom

extern UBYTE  zoom_flag;
extern UBYTE  rotate_flag;

//Function Prototypes
static void mfw_fv_change_format_cb(void *parameter);
static void mfw_fv_zoom_cb(void *parameter);
static void mfw_fv_rotate_cb(void *parameter);
static void mfw_fv_color_convert_cb(void *parameter);
static void mfw_fv_process_cb(void *parameter);
GLOBAL UBYTE mfw_fv_display_image_in_center(
                          USHORT in_Width,
                          USHORT in_Height,
                          void * in_BmpPtr,
                          USHORT in_index,
                          int bmpFormat,
                          USHORT dsplWidth,
                          USHORT dsplHeight);



/*******************************************************************************

 $Function:     mfw_fv_decode_image

 $Description:		decode the jpeg image
 
 $Returns: Status

 $Arguments:		inputbuffer -Input Buffer
 				size- Size of the Input Buffer
 				

*******************************************************************************/

int  mfw_fv_decode_image(UBYTE * inputbuffer, int size)
{
	T_IMG_CHANGE_FORMAT_PARAM change_param;
	T_IMG_RETURN ret;

	TRACE_EVENT("mfw_fv_decode_image");
	
	qcif_yuv_tempbuf.lum = qcif_yuv_lum;
	qcif_yuv_tempbuf.cb = qcif_yuv_cb;
	qcif_yuv_tempbuf.cr = qcif_yuv_cr;
	qcif_yuv_tempbuf.width = FV_DSPL_WIDTH;
	qcif_yuv_tempbuf.height =FV_DSPL_HEIGHT;

	change_param.input_image_format = IMG_FORMAT_JPG ;
	change_param.decode_param.x_offset = 0;
	change_param.decode_param.y_offset = 0;
	change_param.decode_param.sampling_factor = 1;
	change_param.decode_param.num_rows = 0;
	change_param.decode_param.scaling_factor = 2;
	//This is the dummy parameter .The source color format will be retrieved  by reading the jpeg header.
	change_param.output_format.color_format = IMG_YUV420; 
	//The width and height should not be taken based on the resolution.
	change_param.output_format.resolution = 0; 
	change_param.output_format.x_length = FV_DSPL_WIDTH;		
	change_param.output_format.y_length = FV_DSPL_HEIGHT;

	//Call the Change Format API to decode/scale and color convert
	//Decode  and Scale the input image.

	ret = imgil_change_format((UINT8*)inputbuffer,size,change_param,&qcif_yuv_tempbuf,mfw_fv_change_format_cb,NULL);

	if(ret == IMG_OK)
	{
		TRACE_EVENT("mfw_fv_decode_image---OK");
		return 1;
	}
	else 
	{
		TRACE_EVENT("mfw_fv_decode_image--FAIL");
		return 0;
	}
}


/*******************************************************************************

 $Function:     mfw_fv_change_format_cb

 $Description: Callback for img_change_format.

 $Returns: None

 $Arguments: Callback Parameter

*******************************************************************************/
static void mfw_fv_change_format_cb(void *parameter)
{
	T_IMG_RETURN ret;
	T_IMG_COLORCONV_PARAM color_param;
	UBYTE color_format;
	
	TRACE_EVENT("mfw_fv_change_format_cb()");
	color_param.actWidht = qcif_yuv_tempbuf.width;
	color_param.actHeight = qcif_yuv_tempbuf.height;
	color_param.srcClrFfmt =qcif_yuv_tempbuf.color_format;
	color_param.numBytes = 0;
	color_param.destClrFmt = IMG_RGB565 ;

	//Call the Color Conversion API
	memset(qcif_rgb_array,0,sizeof(qcif_rgb_array));
	imgil_color_convert(&qcif_yuv_tempbuf,color_param,qcif_rgb_array,mfw_fv_color_convert_cb);
}

/*******************************************************************************

 $Function:     mfw_fv_color_convert_cb

 $Description: Callback for imgil_color_convert API.

 $Returns: None

 $Arguments: Callback Parameter

*******************************************************************************/
static void mfw_fv_color_convert_cb(void *parameter)
{
	TRACE_EVENT("mfw_fv_color_convert_cb()");
	//Draw the image on the LCD
	mfw_fv_display_image_in_center(qcif_yuv_tempbuf.width,qcif_yuv_tempbuf.height, qcif_rgb_array,0,0x05,FV_DSPL_WIDTH,FV_DSPL_HEIGHT);
}

/*******************************************************************************

 $Function:     mfw_fv_zoom_image

 $Description:		zoom the jpeg image

 $Returns: Status

 $Arguments:None
 				

*******************************************************************************/

SHORT  mfw_fv_zoom_image()
{
	T_IMG_SCALE_PARAM scale_param;
	T_IMG_RETURN ret;
	
	TRACE_FUNCTION("mfw_fv_zoom_image");

	qcif_process_buffer.lum = qcif_yuv_process_lum;
	qcif_process_buffer.cb = qcif_yuv_process_cb;
	qcif_process_buffer.cr = qcif_yuv_process_cr;
	qcif_process_buffer.width =0;
	qcif_process_buffer.height=0;
		
	scale_param.srcClrFmt = qcif_yuv_tempbuf.color_format;

	//Set the Zoom Parameters
	if(zoom_flag == FV_ZOOM_OUT)
		{
			//Zoom out the complete image to a smaller size
			scale_param.x_offset = 0 ;
			scale_param.y_offset = 0;
			scale_param.cropWidth = qcif_yuv_tempbuf.width ;
			scale_param.cropHeight = qcif_yuv_tempbuf.height;
			qcif_process_buffer.width = qcif_yuv_tempbuf.width  - MFW_ZOOM_WIDTH_DELTA;
			qcif_process_buffer.height = qcif_yuv_tempbuf.height - MFW_ZOOM_HEIGHT_DELTA;
			
		}
	else  //FV_ZOOM_IN
		{
			//Zoom out the central portion of the image to the display width and height
			scale_param.x_offset=MFW_ZOOM_WIDTH_DELTA ;		
			scale_param.y_offset=MFW_ZOOM_HEIGHT_DELTA;	
			scale_param.cropWidth=qcif_yuv_tempbuf.width - 2  *  MFW_ZOOM_WIDTH_DELTA;		
			scale_param.cropHeight=qcif_yuv_tempbuf.height - 2  *  MFW_ZOOM_HEIGHT_DELTA;		
			qcif_process_buffer.width = FV_DSPL_WIDTH;
			qcif_process_buffer.height = FV_DSPL_HEIGHT;
			
		}

	//Call the Scaling  API to zoom in or out based on the scaling parameters
	memset(qcif_yuv_process_lum,0,sizeof(qcif_yuv_process_lum));
	memset(qcif_yuv_process_cb,0,sizeof(qcif_yuv_process_cb));
	memset(qcif_yuv_process_cr,0,sizeof(qcif_yuv_process_cr));
	ret = imgil_scale(&qcif_yuv_tempbuf,scale_param,&qcif_process_buffer,mfw_fv_zoom_cb);
return 1;
}

/*******************************************************************************

 $Function:     mfw_fv_zoom_cb

 $Description: Callback function for imgil_scale

 $Returns: None

 $Arguments: Callback Parameter

*******************************************************************************/
static void mfw_fv_zoom_cb(void *parameter)
{

	T_IMG_COLORCONV_PARAM color_param;

	TRACE_EVENT("mfw_fv_zoom_cb()");
	
	//Set the color conversion parameters
	color_param.actWidht = qcif_process_buffer.width;
	color_param.actHeight =qcif_process_buffer.height ;
	color_param.srcClrFfmt = qcif_yuv_tempbuf.color_format;
	color_param.numBytes = 0;
	color_param.destClrFmt = IMG_RGB565 ;
	
	memset(rgb_img_process_array,0,sizeof(rgb_img_process_array));
	//Call the Color Conversion API
	imgil_color_convert(&qcif_process_buffer,color_param,rgb_img_process_array,mfw_fv_process_cb);
}

/*******************************************************************************

 $Function:     mfw_fv_process_cb

 $Description: Callback for imgil_color_convert API while zooming and rotating

 $Returns: None

 $Arguments: Callback Parameter

*******************************************************************************/
static void mfw_fv_process_cb(void *parameter)
{
	TRACE_EVENT("mfw_fv_process_cb()");

	//Draw the image on the LCD
	mfw_fv_display_image_in_center(qcif_process_buffer.width,qcif_process_buffer.height,rgb_img_process_array,0,BMP_FORMAT_16BIT_LCD_COMPRESSED_COLOUR,FV_DSPL_WIDTH,FV_DSPL_HEIGHT);
	
	if( rotate_flag == FV_ROTATE_90 || rotate_flag == FV_ROTATE_270)
		{
			//Unset the flag
			rotate_flag = FV_ROTATE_360;
		}
	else 	if(zoom_flag  ==  FV_ZOOM_OUT || zoom_flag == FV_ZOOM_IN)
		{
			//Unset the flag
			zoom_flag = FV_NO_ZOOM;
		}
}

/*******************************************************************************

 $Function:     mfw_fv_rotate_image

 $Description:		Rotate the jpeg image

 $Returns: Status

 $Arguments: None
 				

*******************************************************************************/

SHORT  mfw_fv_rotate_image()
{
	T_IMG_ROTATION_PARAM rotate_param;
	T_IMG_RETURN ret;
	
	TRACE_FUNCTION("mfw_fv_rotate_image");

	qcif_process_buffer.lum = qcif_yuv_process_lum;
	qcif_process_buffer.cb = qcif_yuv_process_cb;
	qcif_process_buffer.cr = qcif_yuv_process_cr;
	qcif_process_buffer.width =qcif_yuv_tempbuf.width;
	qcif_process_buffer.height=qcif_yuv_tempbuf.height;
		
	//Set the Rotate Parameters
	if(rotate_flag == FV_ROTATE_90)
		{
			rotate_param.rotate_flag = 1 ;
		}
	else if(rotate_flag == FV_ROTATE_180)
		{
			rotate_param.rotate_flag = 2 ;
		}
	else if(rotate_flag == FV_ROTATE_270)
		{
			rotate_param.rotate_flag = 3 ;
		}
	
	rotate_param.srcClrFmt = qcif_yuv_tempbuf.color_format;
	
	memset(qcif_yuv_process_lum,0,sizeof(qcif_yuv_process_lum));
	memset(qcif_yuv_process_cb,0,sizeof(qcif_yuv_process_cb));
	memset(qcif_yuv_process_cr,0,sizeof(qcif_yuv_process_cr));
	//Call the Rotate API to rotate by the set degree
	ret = imgil_rotate(&qcif_yuv_tempbuf,rotate_param,&qcif_process_buffer,mfw_fv_rotate_cb);
return 1;
}


/*******************************************************************************

 $Function:     mfw_fv_rotate_cb

 $Description: Callback function for imgil_roate 

 $Returns: None

 $Arguments: Callback Parameter

*******************************************************************************/
static void mfw_fv_rotate_cb(void *parameter)
{
	T_IMG_COLORCONV_PARAM color_param;

	TRACE_EVENT("mfw_fv_rotate_cb()");

	//Set the Color Conversion Parameters
	color_param.actWidht =	 qcif_process_buffer.width;
	color_param.actHeight = qcif_process_buffer.height;
	color_param.actWidht = qcif_process_buffer.width;
	color_param.actHeight = qcif_process_buffer.height;
	color_param.srcClrFfmt =qcif_yuv_tempbuf.color_format;
	color_param.numBytes = 0;
	color_param.destClrFmt = IMG_RGB565 ;
	
	memset(rgb_img_process_array,0,sizeof(rgb_img_process_array));
	//Call the color Conversion API
	imgil_color_convert(&qcif_process_buffer,color_param,rgb_img_process_array,mfw_fv_process_cb);
}

/*******************************************************************************

 $Function:		mfw_fv_init

 $Description:		This function initialises the imgil interface.

 $Returns:		None

 $Arguments:		None

*******************************************************************************/
void mfw_fv_init(void)
{
	TRACE_EVENT("mfw_fv_init()");
	// Initialize IMGIL interface.
	if (imgil_init() != RV_OK)
	{
	    // @todo : use correct return code for error cases !
	    return ;
	}
}

/*******************************************************************************

 $Function:		mfw_fv_exit

 $Description:		This function will tidy up any resources used by the Mfw FileViewer Module
 				on Power Down

 $Returns:		None

 $Arguments:		None

*******************************************************************************/
void mfw_fv_exit(void)
{
	TRACE_EVENT("mfw_fv_exit()");
	/* nothing to do here... RAM will be automatically cleaned, and the flash wasn't modified */
}

/***********************************************************************************************************************
 $Function:		mfw_fv_display_image_in_center

 $Description:		This function will display the image in the center

 $Returns:		None

 $Arguments:		None

***********************************************************************************************************************/
GLOBAL UBYTE mfw_fv_display_image_in_center(
                          USHORT in_Width,
                          USHORT in_Height,
                          void * in_BmpPtr,
                          USHORT in_index,
                          int bmpFormat,
                          USHORT dsplWidth,
                          USHORT dsplHeight)
{
	 int x_offset,y_offset;
	 x_offset = (dsplWidth - in_Width) / 2 ;
	 y_offset = (dsplHeight- in_Height) / 2 ;

	 TRACE_EVENT_P2("width and height are %d ---%d",in_Width,in_Height);
	 TRACE_EVENT_P2("x and y offset are %d ---%d",x_offset,y_offset);
	 
	 if(zoom_flag == FV_ZOOM_OUT)
	 	{
	 		dspl_BitBlt2(x_offset,11,in_Width,in_Height,in_BmpPtr,in_index,bmpFormat);
			//Oct 06, 2005    REF: SPR 34560 xdeepadh
			//Screen updation will be performed , soon after the decoding/color conversion 
			//of the image is completed.
			dspl_Enable(1);
	 	}
	 else
	 	{
			#if 0
			if(in_Height < dsplHeight)
				{
					TRACE_EVENT("The height is lesser ");
					
					dspl_BitBlt2(x_offset,11,in_Width,in_Height,in_BmpPtr,in_index,bmpFormat);
				}
			else
				{
		       #endif		
					dspl_BitBlt2(x_offset,0,in_Width,in_Height,in_BmpPtr,in_index,bmpFormat);
					//Oct 06, 2005    REF: SPR 34560 xdeepadh
					//Screen updation will be performed , soon after the decoding/color conversion 
					//of the image is completed.
				       dspl_Enable(1);
	 	}
			return 1;
}