www.pudn.com > H265+2008.8.rar > dvp_process.c


 
/* 
/////////////////////////////////////////////////////////////////////////////// 
//                                                                           // 
//   Copyright (C) 2006-2008  Beijing,  pengzhen (pengzhenxp@yahoo.com.cn)   // 
//                                                                           // 
/////////////////////////////////////////////////////////////////////////////// 
*/ 
 
 
#include "dvp_demo.h" 
 
static Dvp_Functions m_Dvp_Functions = 0 ; 
 
static dvp_ctx  m_dvp_ctx  = {0} ;  
static avi_context m_write_avi = {0} ;  
 
static FILE *m_fp_in_v    = 0 ; 
static FILE *m_file_out_v = 0 ; 
#ifdef __OUT_RAW__ 
static FILE *m_file_out_raw_v = 0 ; 
#endif /* __OUT_RAW__ */ 
 
static FILE *m_file_trace_v = 0 ; 
 
/** 
* dvp functions  
*/ 
void Get_Dvp_Functions( int function_id ) 
{ 
 
	switch( function_id ) 
	{ 
 
	/* Image Compression */ 
 
	case DVP_FID_H265P_V8_Compression :   
		m_Dvp_Functions = (Dvp_Functions)dvp_encode_frame ;  
		break ; 
		 
	/* Image Decompression */ 
 
	case DVP_FID_H265P_V8_Decompression : 
		m_Dvp_Functions = (Dvp_Functions)dvp_decode_frame ;  
		break ; 
 
 
	/* Image Process ( wavelets <2D, 3D, 4D> ) */ 
 
	default :  
	case DVP_FID_Wavelets_Analysis_2D :  
		m_dvp_ctx.wavelets = 0 ;  
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_analysis ;  
		break ; 
	case DVP_FID_Wavelets_Analysis_3D : 
		m_dvp_ctx.wavelets = 1 ;  
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_analysis ;  
		break ; 
	case DVP_FID_Wavelets_Analysis_4D :  
		m_dvp_ctx.wavelets = 2 ;  
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_analysis ;  
		break ; 
	  
	case DVP_FID_Wavelets_Synthesis_2D :  
		m_dvp_ctx.wavelets = 0 ;  
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_synthesis ;  
		break ; 
	case DVP_FID_Wavelets_Synthesis_3D :  
		m_dvp_ctx.wavelets = 1 ;  
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_synthesis ;  
		break ; 
	case DVP_FID_Wavelets_Synthesis_4D :  
		m_dvp_ctx.wavelets = 2 ;  
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_synthesis ;  
		break ; 
 
	/* Image Process */ 
 
	case DVP_FID_Denoise :  
		m_Dvp_Functions = (Dvp_Functions)dvp_denoise ; break ; 
	 
	} 
 
} 
 
/** 
* dvp functions print  
*/ 
static void Print_Dvp_Functions( int function_id ) 
{ 
 
	switch( function_id ) 
	{ 
 
	/* Image Compression */ 
 
	case DVP_FID_H265P_V8_Compression :  
		printf( "\n digital image H265+ (ZPV8) compression \n" ) ; 
		break ; 
	 
	/* Image Decompression */ 
 
	case DVP_FID_H265P_V8_Decompression :  
		printf( "\n digital image H265+ (ZPV8) decopmress \n" ) ; 
		break ; 
	 
	/* Image Process ( wavelets  ) */ 
 
	default :  
	case DVP_FID_Wavelets_Analysis_2D :  
		printf( "\n wavelets  analysis \n" ) ; 
		break ; 
	case DVP_FID_Wavelets_Analysis_3D : 
		printf( "\n wavelets  analysis \n" ) ; 
		break ; 
	case DVP_FID_Wavelets_Analysis_4D :  
		printf( "\n wavelets  analysis \n" ) ; 
		break ; 
 
	case DVP_FID_Wavelets_Synthesis_2D :  
		printf( "\n wavelets  synthesis \n" ) ; 
		break ;	 
	case DVP_FID_Wavelets_Synthesis_3D :  
		printf( "\n wavelets  synthesis \n" ) ; 
		break ;	 
	case DVP_FID_Wavelets_Synthesis_4D :   
		printf( "\n wavelets  synthesis \n" ) ; 
		break ;	 
	 
	/* Image Process */ 
 
	case DVP_FID_Denoise :  
		printf( "\n digital image denoise \n" ) ; 
		break ; 
 
	case DVP_FID_Recognise :   
		printf( "\n digital image recognise \n" ) ; 
		break ; 
 
	} 
 
	printf( "\n written by pengzhenxp@yahoo.com.cn \n\n" ) ; 
 
} 
 
/** 
* dvp open  
*/ 
void dvp_init( void* dvp, int function_id ) 
{ 
 
	if( Dvp_Compression(function_id) ) /* dvp encoder */ 
	{ 
		dvp_ctx *lp_dvp_enc = (dvp_ctx*)(dvp) ; 
 
		//lp_dvp_enc->frame_number = 0 ; 
		lp_dvp_enc->m_handle = 0 ;  
		dvp_encode_open( lp_dvp_enc ) ; 
		 
	} 
	else if( Dvp_Decompression(function_id) ) /* dvp decoder */ 
	{ 
		dvp_ctx *lp_dvp_dec = (dvp_ctx*)(dvp) ; 
		 
		//lp_dvp_dec->frame_number = 0 ; 
		lp_dvp_dec->m_handle = 0 ;  
		dvp_decode_open( lp_dvp_dec ) ; 
		 
	} 
	else /* dvp system */ 
	{ 
		dvp_ctx* lp_dvp = (dvp_ctx*)( dvp ) ; 
 
		//lp_dvp->frame_number = 0 ; 
		lp_dvp->m_handle = 0 ;  
		dvp_open( lp_dvp ) ; 
	} 
} 
 
/** 
* dvp close  
*/ 
static void dvp_exit( void* dvp, int function_id ) 
{ 
 
	if( Dvp_Compression(function_id) ) /* dvp encoder */ 
	{ 
		dvp_ctx *lp_dvp_enc = (dvp_ctx*)(dvp) ; 
 
		dvp_encode_close( lp_dvp_enc ) ; 
		 
	} 
	else if( Dvp_Decompression(function_id) ) /* dvp decoder */ 
	{ 
		dvp_ctx *lp_dvp_dec = (dvp_ctx*)(dvp) ; 
		 
		dvp_decode_close( lp_dvp_dec ) ; 
		 
	} 
	else /* dvp system */ 
	{ 
		dvp_ctx* lp_dvp = (dvp_ctx*)( dvp ) ; 
 
		dvp_close( lp_dvp ) ; 
	} 
 
} 
 
/** 
* dvp write init   
*/ 
void write_avi_init()  
{ 
	avi_context * lp_write_avi = & m_write_avi ; 
	dvp_ctx * lp_dvp_ctx = & m_dvp_ctx ;   
 
	memset( lp_write_avi, 0x00, sizeof(avi_context) ) ; 
 
	lp_write_avi->video_tag = FOURCC_VIDEO ;  
	lp_write_avi->video_Handler = FOURCC_ZPV8 ;  /* */ 
 
	lp_write_avi->width  = lp_dvp_ctx->width ; 
	lp_write_avi->height = lp_dvp_ctx->height ; 
 
	lp_write_avi->frame_rate = lp_dvp_ctx->fps ;  
	lp_write_avi->bit_rate   = lp_dvp_ctx->bps ; 
 
	lp_write_avi->rgb_bit_count = 32 ; /* RGB32 */ 
	 
} 
 
/** 
* dvp read  
*/ 
static int dvp_read_file( dvp_ctx* dvp, int function_id, unsigned int length ) 
{ 
 
	int f_flag = 0 ; 
 
	if( Dvp_Decompression(function_id) )  
	{ 
		f_flag = fread( & dvp->stream_length , 1, sizeof(int), m_fp_in_v)  == sizeof(int) ; 
		f_flag = fread( dvp->stream , 1, dvp->stream_length, m_fp_in_v ) == dvp->stream_length ; 
	} 
	else 
	{ 
		f_flag = fread( dvp->i420_y, sizeof(char), length,   m_fp_in_v) == length ;  
	} 
	 
	return f_flag ; 
} 
 
/** 
* dvp write  
*/ 
static void dvp_write_file( dvp_ctx* dvp, int function_id, unsigned int length ) 
{ 
	 
	if( Dvp_Compression(function_id) )  
	{ 
		 
		if( dvp->stream_length ) 
		{ 
#ifdef __OUT_RAW__ 
			if(m_file_out_raw_v) 
			{ 
				fwrite( & dvp->stream_length , 1, sizeof(int), m_file_out_raw_v) ; 
				fwrite( dvp->stream , 1, dvp->stream_length, m_file_out_raw_v ) ; 
			} 
#endif /* __OUT_RAW__ */ 
 
		write_avi_packet( &m_write_avi, m_write_avi.video_tag, 
			              (char*)(dvp->stream)-8 , dvp->stream_length ) ; 
 
		m_write_avi.frame_number++ ; 
		} 
 
	} 
	else 
	{ 
		fwrite( dvp->i420_y, sizeof(char), length, m_file_out_v) ;  
	} 
 
} 
 
/** 
* dvp trace  
*/ 
static void dvp_write_trace( dvp_ctx* dvp, int function_id, unsigned int length, int process_frames ) 
{ 
	if( Dvp_Compression(function_id) ) 
	{ 
		const char type[] ={ 'I', 'P', 'B', 'S' } ; /* 0 : 'I' (POT_I) 1 : 'P' (POT_P) 2 : 'B' (POT_B) */ 
		 
		int stream_length = dvp->stream_length ; 
		int ratio =  stream_length ? (length+ (stream_length>>1))/ stream_length : 0 ; 
			 
		if( process_frames == 1 )  
		{  
			fprintf( m_file_trace_v, "\n" ) ; 
 
			fprintf( m_file_trace_v, "|-------------------------------------| \n" ) ; 
			fprintf( m_file_trace_v, "| frames |    length | type |  ratio  | \n" ) ;  
			//fprintf( m_file_trace_v, "|--------|-----------|------|---------| \n" ) ; 
		} 
		 
		fprintf( m_file_trace_v, "|--------|-----------|------|---------| \n" ) ; 
		fprintf( m_file_trace_v, "|%4d    | %8d  |%4c  |%7d  |\n",  
			     process_frames, stream_length, type[dvp->type], ratio ) ;  
	} 
	 
} 
 
/** 
* dvp process  
*/ 
static void dvp_process( dvp_ctx* dvp, int function_id, unsigned int length ) 
{ 
 
	int process_frames = 0 ;  
 
	unsigned int dwTotalCycles = 0 ; 
	unsigned int dwStartCycles = 0 ; 
 
	/* read file */ 
 
	while( dvp_read_file( dvp, function_id, length ) ) 
	{ 
 
		/* read cycles */  
		 
		dwStartCycles = hmpv_read_fcnt() ; 
		 
		/* dvp function_id */  
		 
		m_Dvp_Functions( dvp ) ; 
		//if( m_Dvp_Functions( dvp ) == davp_success ) dvp->frame_number++ ; 
 
		/* write cycles */  
		 
		dwTotalCycles += hmpv_read_fcnt() - dwStartCycles ; 
		 
		/* write file */ 
		 
		dvp_write_file( dvp, function_id, length ) ; 
		 
		/* trace and report */ 
 
		process_frames ++ ; /* */ 
 
		if( m_file_trace_v ) 
		{ 
			dvp_write_trace( dvp, function_id, length, process_frames ) ; 
		} 
 
		fprintf(stderr, " dvp process frames %d \r", process_frames ) ; /* */ 
	} 
 
	/* report */  
	 
	dvp_report ( dwTotalCycles,  process_frames ) ;  
 
} 
 
/** 
* dvp main  
*/ 
static void dvp_main(int argc,char **argv) 
{	 
	char *i420 = 0 ; 
	char* lpVideoOutData = 0 ; 
 
	char *i420_y = 0 ; 
	char *i420_u = 0 ; 
	char *i420_v = 0 ; 
	 
	int width = 0 ; 
	int height = 0 ; 
	int function_id = 0 ; 
	unsigned int length = 0 ; 
 
	/* parameter */  
	 
	get_parameter( &m_dvp_ctx , NULL , argc,  argv ) ;  
 
	/* dvp function_id */ 
 
	function_id = m_function_id ;  
	Get_Dvp_Functions( function_id ) ; 
	Print_Dvp_Functions( function_id ) ; 
	 
	width = m_dvp_ctx.width ; /* */ 
	height = m_dvp_ctx.height ;  /* */ 
 
	/* file open */  
	 
	m_fp_in_v = fopen(m_in_file_name,"rb") ;  
	if( ! m_fp_in_v ) { printf("can't open file : %s \n", m_in_file_name ) ; return ; } 
 
	m_file_out_v = fopen(m_out_file_name,"wb") ; 
	if( ! m_file_out_v ) { printf("can't open file : %s \n", m_out_file_name ) ; return ; } 
 
#ifdef __OUT_RAW__ 
	if( Dvp_Compression( function_id ) ) 
	m_file_out_raw_v = fopen(m_out_raw_file_name,"wb") ;  
	/* if( ! m_file_out_raw_v ) printf("can't open file : %s \n", m_file_out_raw_v ) ; */ 
#endif /* __OUT_RAW__ */ 
		 
	/* */ 
	if( m_trace ) 
	{ 
		char file_trace_name[100]; sprintf( file_trace_name, "%s.trace.txt", m_in_file_name ) ; 
		m_file_trace_v = fopen(file_trace_name,"w") ;  
		/* if( ! m_file_trace_v ) printf("can't open file : %s \n", file_trace_name ) ; */ 
	} 
 
	/* dvp open */  
	 
	dvp_init( &m_dvp_ctx, function_id ) ; 
	 
	/* dvp data pointor */  
	 
	length = width*height ;  
	 
	i420 = (char *)M_ALLOC( length*3/2 + 128 ) ;  
	lpVideoOutData = (char *)M_ALLOC( (256*1024L) ) ; 
	 
	i420 +=  8 ; /* for write avi head */ 
	lpVideoOutData +=  8 ; /* for write avi head */ 
 
	i420_y = i420 ; 
	i420_u = i420 + (length) ; 
	i420_v = i420 + (length)*5/4 ; 
	 
	/* dvp stream pointor */  
 
	m_dvp_ctx.stream   = lpVideoOutData ; 
	m_dvp_ctx.stream   = lpVideoOutData ; 
 
	/* write avi init */ 
	write_avi_init()  ; 
	/* write avi head */ 
	write_avi_header( &m_write_avi , m_out_file_name ) ; 
 
	m_dvp_ctx.i420_y  = i420_y ; 
	m_dvp_ctx.i420_u  = i420_u ; 
	m_dvp_ctx.i420_v  = i420_v ; 
 
/** 
* dvp process  
*/ 
	dvp_process( &m_dvp_ctx, function_id, length*3/2 ) ; /* Yuv420 planar */ 
 
	if(m_file_trace_v ) fprintf( m_file_trace_v, "|-------------------------------------| \n" ) ; 
 
	/* write avi trailer */ 
	 
	write_avi_trailer( &m_write_avi, m_out_file_name ) ; 
 
	/* dvp close */  
	 
	dvp_exit( &m_dvp_ctx, function_id ) ; 
	 
	i420 -=  8 ; /* for write avi head */ 
	lpVideoOutData -=  8 ; /* for write avi head */ 
 
	M_FREE( i420 ) ;   
	M_FREE( lpVideoOutData ) ;   
	 
	/* file close */  
	 
	if(m_fp_in_v) fclose(m_fp_in_v) ; 
	if(m_file_out_v) fclose(m_file_out_v) ; 
#ifdef __OUT_RAW__ 
	if(m_file_out_raw_v) fclose(m_file_out_raw_v) ; 
#endif /* __OUT_RAW__ */ 
 
	if(m_file_trace_v) fclose(m_file_trace_v) ; 
 
}