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) ;
}