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


 
/* 
/////////////////////////////////////////////////////////////////////////////// 
//                                                                           // 
//   Copyright (C) 2006-2008  Beijing,  pengzhen (pengzhenxp@yahoo.com.cn)   // 
//                                                                           // 
/////////////////////////////////////////////////////////////////////////////// 
*/ 
 
#include "RIFF.h" 
 
#define RIFF_ID        "RIFF" 
#define RIFF_WAVE_ID   "WAVE" 
#define RIFF_FORMAT_ID "fmt " 
#define RIFF_DATA_ID   "data" 
 
#define RIFF_SIZE( filelen )  ( (filelen) - 8 ) 
 
#define RIFF_FORMAT_CHUNK_SIZE ( sizeof( ST_RIFF_FORMAT_CHUNK ) -8 ) 
 
#define RIFF_DATA_CHUNK_OFF ( sizeof(ST_RIFF_HDR)+         \ 
                              sizeof(ST_RIFF_WAV_ID)+        \ 
						      sizeof(ST_RIFF_FORMAT_CHUNK) )  
 
#define RIFF_DATA_CHUNK_SIZE(a,  filelen ) { (a) = (filelen) -       \ 
                                             RIFF_DATA_CHUNK_OFF  -  \ 
										     sizeof(ST_RIFF_DATA_CHUNK) ; } 
   
#define RIFF_COPY_ID( a , b ) { memcpy( (a), (b), sizeof(b) ) ; } 
 
#define RIFF_WRITE_FILE(a) { fwrite( &(a), 1, sizeof(a), fp ) ; \ 
					         m_iWaveFileHeadSize += sizeof(a) ;  } 
 
/* initializing wave file */   
 
void write_riff_head(FILE *fp , unsigned long dFileSize ) 
 
{ 
	ST_RIFF_HDR     lpRiff_Header  ={0}; 
	ST_RIFF_WAV_ID  lpRIFF_WAVE_ID ={0}; 
	ST_RIFF_FORMAT_CHUNK lpFormatChunk ={0} ; 
	ST_RIFF_DATA_CHUNK   lpDataChunk   ={0}; 
 
   if( dFileSize == 0 )  
   { 
	   m_iWaveFileSize = m_iWaveFileHeadSize =0; /* first write head */ 
   } 
   if( ! fp ) return  ;  
   // seek file  
   fseek(fp, 0, SEEK_SET );  
 
   // riff 
   RIFF_COPY_ID( lpRiff_Header.m_id , RIFF_ID ) ; 
   lpRiff_Header.m_size = RIFF_SIZE( dFileSize )  ; 
   // write  
   RIFF_WRITE_FILE( lpRiff_Header ) ;  
   
   // wave  
   RIFF_COPY_ID( lpRIFF_WAVE_ID.m_id , RIFF_WAVE_ID ) ;  
   //write 
   RIFF_WRITE_FILE( lpRIFF_WAVE_ID ) ;  
  
   // format chunk  
   RIFF_COPY_ID( lpFormatChunk.m_id , RIFF_FORMAT_ID ) ; 
   lpFormatChunk.m_size = RIFF_FORMAT_CHUNK_SIZE ; 
 
   lpFormatChunk.m_wbitspersample= 16 ; 
   lpFormatChunk.m_wformattag    = 1 ; // no compression PCM  
   //lpFormatChunk.m_wchannels     = 2 ; // stero // mono    
   lpFormatChunk.m_wchannels     = RIFF_CHANNELS ;  
   lpFormatChunk.m_dwsamplespersec =RIFF_SAMPLE_RATE ; // 44100  
   lpFormatChunk.m_dwavgbytespersec=lpFormatChunk.m_wchannels* 
	                                lpFormatChunk.m_dwsamplespersec* 
	                                lpFormatChunk.m_wbitspersample/8 ;     
    
   lpFormatChunk.m_wblockalign   =  lpFormatChunk.m_wchannels* 
	                                lpFormatChunk.m_wbitspersample/8 ; 
   // write  
   RIFF_WRITE_FILE( lpFormatChunk ) ;  
 
   // data chunk 
   RIFF_COPY_ID( lpDataChunk.m_id , RIFF_DATA_ID ) ; 
   RIFF_DATA_CHUNK_SIZE( lpDataChunk.m_size, dFileSize ) ; 
   // write  
   RIFF_WRITE_FILE( lpDataChunk ) ; 
 
   if( dFileSize == 0 )  
   { 
	   m_iWaveFileSize = m_iWaveFileHeadSize ; /* first write head */ 
   } 
 
}