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

📄 dvp_process.c

📁 ZPAV (H265) pnxNNNN(PHILIPS) demo ZPAV (H265) 是 音视频 压缩解压 协议
💻 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_Functions = (Dvp_Functions)dvp_wavelets_analysis ; 
		break ;
/*
	case DVP_FID_Wavelets_Analysis_3D :
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_analysis ; 
		break ;
	case DVP_FID_Wavelets_Analysis_4D : 
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_analysis ; 
		break ;
*/	 
	case DVP_FID_Wavelets_Synthesis_2D : 
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_synthesis ; 
		break ;
/*
	case DVP_FID_Wavelets_Synthesis_3D : 
		m_Dvp_Functions = (Dvp_Functions)dvp_wavelets_synthesis ; 
		break ;
	case DVP_FID_Wavelets_Synthesis_4D : 
		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 <w1, w2, w3> ) */

	default : 
	case DVP_FID_Wavelets_Analysis_2D : 
		printf( "\n wavelets <w%d> analysis \n", m_dvp_ctx.wavelets+1 ) ;
		break ;
/*
	case DVP_FID_Wavelets_Analysis_3D :
		printf( "\n wavelets <w2> analysis \n" ) ;
		break ;
	case DVP_FID_Wavelets_Analysis_4D : 
		printf( "\n wavelets <w3> analysis \n" ) ;
		break ;
*/

	case DVP_FID_Wavelets_Synthesis_2D : 
		printf( "\n wavelets <w%d> synthesis \n", m_dvp_ctx.wavelets+1 ) ;
		break ;	
/*
	case DVP_FID_Wavelets_Synthesis_3D : 
		printf( "\n wavelets <w2> synthesis \n" ) ;
		break ;	
	case DVP_FID_Wavelets_Synthesis_4D :  
		printf( "\n wavelets <w3> 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 (average) 
*/

static void dvp_write_trace_avg( dvp_ctx* dvp, unsigned int sum_length, 
							     unsigned int length, int process_frames )
{

	fprintf( m_file_trace_v, "\n" ) ;
	
	fprintf( m_file_trace_v, "|----------------------------------| \n" ) ;
	fprintf( m_file_trace_v, "|             average              | \n" ) ; 
	fprintf( m_file_trace_v, "|----------------------------------| \n" ) ;
	fprintf( m_file_trace_v, "| bitrate (Kbits/second) |  ratio  | \n" ) ; 
	fprintf( m_file_trace_v, "|------------------------|---------| \n" ) ;
	
	fprintf( m_file_trace_v, "|%11d (kbps)      |%7d  |\n", 
		     (int)( (double)(sum_length)*dvp->fps*8.0 /(process_frames*1000.0)), 
		     (int)( (double)(process_frames)*length /(sum_length))  ) ; 
	
	fprintf( m_file_trace_v, "|----------------------------------| \n" ) ; 
	
	fprintf( m_file_trace_v, "\n" ) ;
	
}

/**
** dvp trace 
*/

static void dvp_write_trace( dvp_ctx* dvp, int function_id, 
							 unsigned int length, int process_frames, int last )
{
	if( Dvp_Compression(function_id) )
	{
		const char type[] ={ 'I', 'P', 'B', 'S' } ; /* 0 : 'I' (POT_I) 1 : 'P' (POT_P) 2 : 'B' (POT_B) */
		
		unsigned int stream_length = dvp->stream_length ;
		unsigned int ratio =  stream_length ? (length+ (stream_length>>1))/ stream_length : 0 ;
			
		static unsigned int sum_length = 0 ; 

		if( ! last )
		{
			sum_length += stream_length ;
		}

		if( process_frames == 1 ) 
		{ 
			dvp_write_trace_avg( dvp, sum_length, length, process_frames ) ; /* average */

			fprintf( m_file_trace_v, "|-------------------------------------| \n" ) ;
			fprintf( m_file_trace_v, "| frames |    length | type |  ratio  | \n" ) ; 
			//fprintf( m_file_trace_v, "|--------|-----------|------|---------| \n" ) ;
		}
		
		else if( last )
		{
			fprintf( m_file_trace_v, "|-------------------------------------| \n" ) ;

			fprintf( m_file_trace_v, "\n" ); 
			
			fseek( m_file_trace_v, 0, SEEK_SET ) ; /* beginning of file  */

			dvp_write_trace_avg( dvp, sum_length, length, process_frames ) ; /* average */

			return ;
		}

		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 )
{

	int64_t qwTotalCycles = 0 ;

	int process_frames = 0 ; 

	/* read file */

	while( dvp_read_file( dvp, function_id, length ) )
	{

		int64_t t_start, t_end ;

		/* read cycles */ 
		
		read_cycles( t_start ) ;
		
		/* dvp function_id */ 
		
		m_Dvp_Functions( dvp ) ;
		//if( m_Dvp_Functions( dvp ) == davp_success ) dvp->frame_number++ ;

		/* read cycles */ 
		
		read_cycles( t_end ) ; qwTotalCycles += (int)( t_end - t_start ) ;
		
		/* write file */
		
		dvp_write_file( dvp, function_id, length ) ;
		
		/* trace and report */

		if( !(process_frames % dvp->fps) ) 
			fprintf(stderr, " dvp process frames %d \n", process_frames ) ; /* report frames  */

		process_frames ++ ; /* */

		if( m_file_trace_v )
		{
			dvp_write_trace( dvp, function_id, length, process_frames, 0x00000000 ) ;
		}

		//fprintf(stderr, " dvp process frames %d \r", process_frames ) ; /* */
	}

	if( m_file_trace_v )
	{
		dvp_write_trace( dvp, function_id, length, process_frames, 0x00000001 ) ;
	}

	/* report */ 
	
	fprintf(stderr, " dvp process frames %d \n", process_frames ) ; /* report frames  */

	dvp_report ( qwTotalCycles,  process_frames, (float)(dvp->fps) ) ;

}

/**
** 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_out_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 *)dmp_memory_alloc( length*3/2 + 128 ) ; 
	lpVideoOutData = (char *)dmp_memory_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 */
	if( Dvp_Compression(function_id) )
	{
		write_avi_header( &m_write_avi , m_out_file_name ) ; /* Compression */
	}
	
	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 */

	/* write avi trailer */
	if( Dvp_Compression(function_id) )
	{
		write_avi_trailer( &m_write_avi, m_out_file_name ) ; /* Compression */
	}

	/* dvp close */ 
	
	dvp_exit( &m_dvp_ctx, function_id ) ;
	
	i420 -=  8 ; /* for write avi head */
	lpVideoOutData -=  8 ; /* for write avi head */

	dmp_memory_free( i420 ) ;  
	dmp_memory_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) ;

}


⌨️ 快捷键说明

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