📄 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_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 + -