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


 
/* 
/////////////////////////////////////////////////////////////////////////////// 
//                                                                           // 
//   Copyright (C) 2006-2008  Beijing,  pengzhen (pengzhenxp@yahoo.com.cn)   // 
//                                                                           // 
/////////////////////////////////////////////////////////////////////////////// 
*/ 
 
void write_avi_init( avi_context *lpWriteAvi )  
{ 
 
	memset( lpWriteAvi, 0x00, sizeof(avi_context) ) ; 
 
	lpWriteAvi->video_Handler = 0 ; 
	lpWriteAvi->video_tag     = FOURCC_VIDEO ;  
	lpWriteAvi->rgb_bit_count = 24 ; /*RGB24*/ 
	//lpWriteAvi->rgb_bit_count = 8*m_bmp_stride/m_width ;  
	lpWriteAvi->key_frame = 1 ;  
 
	lpWriteAvi->width   = m_width ; 
	lpWriteAvi->height  = m_height ; 
	lpWriteAvi->frame_rate = 25;  
 
} 
 
 
void get_convert_yuv_function( int colorspace ) 
{ 
 
	switch(colorspace ) 
	{  
	case MPV_CSP_RGB32 :  
		m_write_avi.rgb_bit_count = 32 ; 
		m_bmp_stride = m_width*4 ;  
		m_dvp_pack_yuv420 = dvp_pack_yuv420( MPV_CSP_RGB32 ) ; 
		printf( "\nconvert Yuv420 to RGB32 \n" ) ; 
		break ; 
 
	case MPV_CSP_RGB24 :  
		m_write_avi.rgb_bit_count = 24 ; 
		m_bmp_stride = m_width*3 ;  
		m_dvp_pack_yuv420 = dvp_pack_yuv420( MPV_CSP_RGB24 ) ; 
		printf( "\nconvert Yuv420 to RGB24 \n" ) ; 
		break ; 
	 
	case MPV_CSP_RGB565 :  
		m_write_avi.rgb_bit_count = 16 ; /* BI_BITFIELDS */ 
		m_bmp_stride = m_width*2 ;  
		m_dvp_pack_yuv420 = dvp_pack_yuv420( MPV_CSP_RGB565 ) ; 
		printf( "\nconvert Yuv420 to RGB565 \n" ) ; 
		break ; 
 
	case MPV_CSP_RGB555 :  
		m_write_avi.rgb_bit_count = 15 ; /* BI_BITFIELDS */ 
		//m_write_avi.rgb_bit_count = 16 ; /* */ 
		m_bmp_stride = m_width*2 ;  
		m_dvp_pack_yuv420 = dvp_pack_yuv420( MPV_CSP_RGB555 ) ; 
		printf( "\nconvert Yuv420 to RGB555 \n" ) ; 
		break ; 
 
	} 
} 
 
void tools_process( char* lpYuv420P_Y , 
				    char* lpYuv420P_U , 
					char* lpYuv420P_V ,  
					char* lpBMP , 
					int iYuv420P_Length, int iBmp_Length )  
{ 
	unsigned int dwTotalCycles = 0 ; 
	unsigned int dwStartCycles = 0 ; 
 
	int fv_flag = ( m_fp_in_v != NULL ) ; 
 
	lpBMP += 8 ; /* for write avi head */ 
 
	while( fv_flag ) 
	{ 
		 
		/* read file */ 
 
		fv_flag = (int)(fread( lpYuv420P_Y, 1, iYuv420P_Length, m_fp_in_v )) == iYuv420P_Length ; 
		 
		if( !fv_flag ) continue ; 
 
		/* read cycles */  
		 
		dwStartCycles = hmpv_read_fcnt() ; 
 
		if( m_dvp_pack_yuv420 ) 
		{  
			m_dvp_pack_yuv420( lpYuv420P_Y, m_width, 
				                      lpYuv420P_U,  
				                      lpYuv420P_V, (m_width>>1), 
				                      lpBMP,       m_width, -m_height, m_bmp_stride ); 
		} 
		 
		/* write cycles */  
		 
		dwTotalCycles += hmpv_read_fcnt() - dwStartCycles ; 
 
		/* write file */ 
 
		write_avi_packet( &m_write_avi, m_write_avi.video_tag, lpBMP-8 , iBmp_Length ) ; 
	 
		m_write_avi.frame_number ++ ; /* next */ 
 
#ifdef __OUT_RAW__ 
		fwrite( lpBMP , 1, iBmp_Length, m_file_out_raw_v ) ; 
#endif /*__OUT_RAW__*/ 
 
		printf("dvp tansform frames %d \r", m_write_avi.frame_number );  
 
	} 
 
	/* report */  
	 
	tools_report ( dwTotalCycles,  m_write_avi.frame_number ) ;  
 
} 
 
static void tools_main(int argc,char **argv) 
{	 
 
	int iLength ; 
	int iYuv420P_Length ;   
	int iBmp_Length     ; 
 
	char* lpYuv420P ; 
	char* lpBMP     ;  
	 
	char* lpYuv420P_Y ; 
	char* lpYuv420P_U ; 
	char* lpYuv420P_V ; 
 
	/* write avi init */ 
	write_avi_init( &m_write_avi )  ; 
 
	/* parameter */  
	 
	get_parameter( argc,  argv ) ;  
	 
	/* get convert_yuv function */ 
	get_convert_yuv_function( m_colorspace ) ; 
	iBmp_Length = (m_bmp_stride*m_height) ; 
 
	iLength         = (m_width*m_height) ; 
	iYuv420P_Length = (iLength*3)/2 ;   
	//iBmp_Length     = (iLength*4) ; 
 
	lpYuv420P = (char*)M_ALLOC( iYuv420P_Length + 32 ) ; 
	lpBMP     = (char*)M_ALLOC( iBmp_Length     + 32 ) ;  
	 
	lpYuv420P_Y = lpYuv420P ; 
	lpYuv420P_U = lpYuv420P + (iLength) ; 
	lpYuv420P_V = lpYuv420P + (iLength) + (iLength/4) ; 
 
	/* 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 ; } 
 
#ifdef __OUT_RAW__ 
	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__*/ 
	 
	/* write avi head */ 
	write_avi_header( &m_write_avi , m_out_file_name )  ; 
 
	/* tools process */ 
	tools_process( lpYuv420P_Y, lpYuv420P_U, lpYuv420P_V, lpBMP, iYuv420P_Length, iBmp_Length ) ;  
 
	/* write avi trailer */ 
	write_avi_trailer( &m_write_avi , m_out_file_name )  ; 
		 
	M_FREE( lpYuv420P );   
	M_FREE( lpBMP );   
	 
	/* file close */  
	 
	if(m_fp_in_v) fclose(m_fp_in_v);  
#ifdef __OUT_RAW__ 
	if(m_file_out_raw_v) fclose(m_file_out_raw_v); 
#endif /*__OUT_RAW__*/ 
 
}