common.c

来自「ISO mp3 sources (distribution 10) Layer」· C语言 代码 · 共 1,831 行 · 第 1/4 页

C
1,831
字号
		fr_ps->sblimit = pick_table (fr_ps);	else		fr_ps->sblimit = SBLIMIT;	if (hdr->mode == MPG_MD_JOINT_STEREO)		fr_ps->jsbound = js_bound (hdr->lay, hdr->mode_ext);	else		fr_ps->jsbound = fr_ps->sblimit;}/* interpret data in hdr str to fields in fr_ps */void mc_hdr_to_frps (frame_params *fr_ps){	layer *hdr = fr_ps->header;     /* (or pass in as arg?) */		if (fr_ps->header->surround == 3)	/* second stereo program */		if (fr_ps->header->center == 1 || fr_ps->header->center == 3)		{			fr_ps->mc_channel = 3;     /* 3 + 2 */			fr_ps->alloc_bits = 2;     /* 2 bits for tc_alloc */			fr_ps->dyn_cross_bits = 1;			fr_ps->pred_mode = 2; /* FdB for prediction  3/0 */		}		else		{			fr_ps->mc_channel = 2;     /* 2 + 2 or 1 + 2 */			fr_ps->alloc_bits = 0;     /* 0 bits for tc_alloc */			fr_ps->dyn_cross_bits = 0;			fr_ps->pred_mode = 5; /* FdB for prediction  2/0 */		}	else if (fr_ps->header->surround == 2)	/* stereo surround */		if (fr_ps->header->center == 1 || fr_ps->header->center == 3)		{			fr_ps->mc_channel = 3;  /* 3 mc-channels 3/2 */			fr_ps->alloc_bits = 3;  /* 3 bits for tc_alloc */			fr_ps->dyn_cross_bits = 4; 			fr_ps->pred_mode = 0; /* 7/4/95 R.S. for prediction  3/2 */		}		else		{			fr_ps->mc_channel = 2;  /* 2 mc-channels 2/2 */			fr_ps->alloc_bits = 2;  /* 2 bits for tc_alloc */			fr_ps->dyn_cross_bits = 3;			fr_ps->pred_mode = 3; /* 7/4/95 R.S. for prediction  2/2 */		}	else if (fr_ps->header->surround == 1)	/* mono surround */		if (fr_ps->header->center == 1 || fr_ps->header->center == 3)		{			fr_ps->mc_channel = 2;  /* 3/1 */			fr_ps->alloc_bits = 3;  /* 3 bits for tc_alloc */			fr_ps->dyn_cross_bits = 3;			fr_ps->pred_mode = 1; /* 7/4/95 R.S. for prediction 3/1 */		}		else		{			fr_ps->mc_channel = 1;	/* 2/1 */			fr_ps->alloc_bits = 2;  /* 2 bits for tc_alloc */			fr_ps->dyn_cross_bits = 1;			fr_ps->pred_mode = 4; /* 7/4/95 R.S. for prediction 2/1 */		}	else					/* no surround */		if (fr_ps->header->center == 1 || fr_ps->header->center == 3)		{			fr_ps->mc_channel = 1;	/* 3/0 */			fr_ps->alloc_bits = 2;	/* 2 bits for tc_alloc */ 			fr_ps->dyn_cross_bits = 1;			fr_ps->pred_mode = 2;         /* 3/0 */		}		else		{			fr_ps->mc_channel = 0;	/* 2/0 or 1/0 */			fr_ps->alloc_bits = 0;  /* 2 bits for tc_alloc */			fr_ps->dyn_cross_bits = 0;			fr_ps->pred_mode = 5; /* FdB for prediction  2/0 */		}		if ( (hdr->no_of_multi_lingual_ch>0) && (hdr->multi_lingual_layer>0) )	{		fprintf (stderr, "MultiLingual not in Layer 2!\n exit.\n");		exit (1);	}	if (fr_ps->mc_channel > 0 || hdr->lfe || hdr->no_of_multi_lingual_ch > 0)		mc_pick_table (fr_ps);}void WriteHdr(frame_params *fr_ps, FILE *s){layer *info = fr_ps->header;   fprintf(s, "HDR:  s=FFF, id=%X, l=%X, ep=%X, br=%X, sf=%X, pd=%X, ",		   info->version, info->lay, !info->error_protection,		   info->bitrate_index, info->sampling_frequency, info->padding);   fprintf(s, "pr=%X, m=%X, js=%X, c=%X, o=%X, e=%X\n",		   info->extension, info->mode, info->mode_ext,		   info->copyright, info->original, info->emphasis);   fprintf(s, "layer=%s, MPEG1-bitrate=%d, sfrq=%.1f, mode=%s, ",		   layer_names[info->lay-1],Bitrate=bitrate[info->lay-1][info->bitrate_index],		   S_freq=s_freq[info->sampling_frequency], mode_names[info->mode]);   fprintf(s, "sblim=%d, jsbd=%d, MPEG1-ch=%d\n",		   fr_ps->sblimit, fr_ps->jsbound, fr_ps->stereo);   fflush(s);}/*********************************************************************************  Allocate number of bytes of memory equal to "block".********************************************************************************/void    *mem_alloc(unsigned long block, char *item){void	  *ptr;#ifdef  MACINTOSH    ptr = NewPtr(block);#endif#ifdef  MSDOS	 ptr = (void *)_fmalloc((unsigned int)block); /* far memory, 92-07-08 sr */#endif#if ! defined (MACINTOSH) && ! defined (MSDOS)    ptr = (void *) malloc(block);#endif	 if (ptr != NULL){#ifdef  MSDOS	_fmemset(ptr, 0, (unsigned int)block); /* far memory, 92-07-08 sr */#else		memset(ptr, 0, block);#endif    }    else{        fprintf (stderr, "Unable to allocate %s\n", item);        exit (1);    }    return(ptr);}/******************************************************************************  Free memory pointed to by "*ptr_addr".******************************************************************************/void    mem_free(void **ptr_addr){    if (*ptr_addr != NULL){#ifdef  MACINTOSH        DisposPtr(*ptr_addr);#else        free(*ptr_addr);#endif        *ptr_addr = NULL;    }}/******************************************************************************  Routines to convert between the Apple SANE extended floating point format*  and the IEEE double precision floating point format.  These routines are*  called from within the Audio Interchange File Format (AIFF) routines.******************************************************************************//**** Apple's 80-bit SANE extended has the following format: 1       15      1            63+-+-------------+-+-----------------------------+|s|       e     |i|            f                |+-+-------------+-+-----------------------------+  msb        lsb   msb                       lsbThe value v of the number is determined by these fields as follows:If 0 <= e < 32767,              then v = (-1)^s * 2^(e-16383) * (i.f).If e == 32767 and f == 0,       then v = (-1)^s * (infinity), regardless of i.If e == 32767 and f != 0,       then v is a NaN, regardless of i.*** IEEE Draft Standard 754 Double Precision has the following format:MSB+-+---------+-----------------------------+|1| 11 Bits |           52 Bits           |+-+---------+-----------------------------+ ^     ^                ^ |     |                | Sign  Exponent         Mantissa*//*******************************************************************************  double_to_extended()**  Purpose:     Convert from IEEE double precision format to SANE extended*               format.**  Passed:      Pointer to the double precision number and a pointer to what*               will hold the Apple SANE extended format value.**  Outputs:     The SANE extended format pointer will be filled with the*               converted value.**  Returned:    Nothing.******************************************************************************/void    double_to_extended(double *pd, char ps[10]){#ifdef  MACINTOSH        x96tox80(pd, (extended *) ps);#else/* fixed bus alignment error, HP 27-may-93 */register unsigned long  top2bits;register unsigned short *ps2;register IEEE_DBL       *p_dbl;register SANE_EXT       *p_ext;SANE_EXT ext_align;char *c_align;int i;   p_dbl = (IEEE_DBL *) pd;   p_ext = &ext_align;   top2bits = p_dbl->hi & 0xc0000000L;   p_ext->l1 = ((p_dbl->hi >> 4) & 0x3ff0000L) | top2bits;   p_ext->l1 |= ((p_dbl->hi >> 5) & 0x7fffL) | 0x8000L;   p_ext->l2 = (p_dbl->hi << 27) & 0xf8000000L;   p_ext->l2 |= ((p_dbl->lo >> 5) & 0x07ffffffL);   ps2 = (unsigned short *) & (p_dbl->lo);   ps2++;   p_ext->s1 = (*ps2 << 11) & 0xf800;   c_align = (char *) p_ext;   for (i=0;i<10;i++)	 ps[i] = c_align[i];#endif}/*******************************************************************************  extended_to_double()**  Purpose:     Convert from SANE extended format to IEEE double precision*               format.**  Passed:      Pointer to the Apple SANE extended format value and a pointer*               to what will hold the the IEEE double precision number.**  Outputs:     The IEEE double precision format pointer will be filled with*               the converted value.**  Returned:    Nothing.******************************************************************************/void    extended_to_double(char ps[10], double *pd){#ifdef  MACINTOSH   x80tox96((extended *) ps, pd);#else/* fixed bus alignment error, HP 27-may-93 */register unsigned long  top2bits;register IEEE_DBL       *p_dbl;register SANE_EXT       *p_ext;SANE_EXT ext_align;char *c_align;int i;   p_dbl = (IEEE_DBL *) pd;   p_ext = &ext_align;   c_align = (char *) p_ext;   for (i=0;i<10;i++)	 c_align[i] = ps[i];   top2bits = p_ext->l1 & 0xc0000000L;   p_dbl->hi = ((p_ext->l1 << 4) & 0x3ff00000L) | top2bits;   p_dbl->hi |= (p_ext->l1 << 5) & 0xffff0L;   p_dbl->hi |= (p_ext->l2 >> 27) & 0x1f;   p_dbl->lo = (p_ext->l2 << 5) & 0xffffffe0L;   p_dbl->lo |= (unsigned long) ((p_ext->s1 >> 11) & 0x1f);#endif}/*******************************************************************************  Read Audio Interchange File Format (AIFF) headers.******************************************************************************/int aiff_read_headers(FILE *file_ptr,		      IFF_AIFF *aiff_ptr, 		      int *byte_per_sample){register char   i;register long   seek_offset;char		temp_sampleRate[10];char		*dummy;char		holder;Chunk           FormChunk;CommonChunk     CommChunk;SoundDataChunk  SndDChunk;identifier	ident;   if (fseek(file_ptr, 0, SEEK_SET) != 0)	  return(-1);   if (fread(&FormChunk, sizeof(Chunk), 1, file_ptr) != 1)	  return(-1);#ifdef MSDOS  holder = FormChunk.ckID[0];  FormChunk.ckID[0] = FormChunk.ckID[3];  FormChunk.ckID[3] = holder;  holder = FormChunk.ckID[1];  FormChunk.ckID[1] = FormChunk.ckID[2];  FormChunk.ckID[2] = holder;/* fixed bug in next line, HP 27-may-93 */  holder = FormChunk.formType[0];  FormChunk.formType[0] = FormChunk.formType[3];  FormChunk.formType[3] = holder;  holder = FormChunk.formType[1];  FormChunk.formType[1] = FormChunk.formType[2];  FormChunk.formType[2] = holder;  FormChunk.ckSize = _lrotl(FormChunk.ckSize, 8);#endif/* fixed bug in next line, HP 27-may-93 */	if (strncmp(FormChunk.ckID,IFF_ID_FORM,4) != 0 ||		 strncmp(FormChunk.formType,IFF_ID_AIFF,4) != 0)      return(-1); 	/* warning: different levels of indirection.7/8/92.sr*/	if (fread(&ident,sizeof(identifier), 1, file_ptr) != 1)		return(-1);#ifdef MSDOS	holder = ident.name[0];	ident.name[0] = ident.name[3];	ident.name[3] = holder;	holder = ident.name[1];	ident.name[1] = ident.name[2];	ident.name[2] = holder;	ident.ck_length = _lrotl(ident.ck_length, 8);#endif/* fixed bug in next line, HP 27-may-93 */	while(strncmp(ident.name,IFF_ID_COMM,4) != 0)	{		dummy = calloc( ident.ck_length, sizeof(char));/* changed "fread( &dummy," to "fread ( dummy,", HP 26-may-93 */		if(fread( dummy, ident.ck_length, 1, file_ptr) != 1)		  return(-1);		free(dummy);/* fixed bug in next line, HP 27-may-93 */		if(fread( &ident, sizeof(identifier),1, file_ptr) != 1)		  return(-1);#ifdef MSDOS	holder = ident.name[0];	ident.name[0] = ident.name[3];	ident.name[3] = holder;	holder = ident.name[1];	ident.name[1] = ident.name[2];	ident.name[2] = holder;	ident.ck_length = _lrotl(ident.ck_length, 8);#endif	}		for( i = 0; i < 4; ++i)		CommChunk.ckID[i] = ident.name[i];		CommChunk.ckSize = ident.ck_length;		if (fread(&CommChunk.numChannels, sizeof(short), 1, file_ptr) != 1)			return(-1);		if (fread(&CommChunk.numSampleFrames, sizeof(unsigned long), 1,			 file_ptr) != 1)			return(-1);		if (fread(&CommChunk.sampleSize, sizeof(short), 1, file_ptr) != 1)			return(-1);		if (fread(CommChunk.sampleRate, sizeof(char[10]), 1, file_ptr) != 1)			return(-1);#ifdef MSDOS  CommChunk.sampleSize = _rotl(CommChunk.sampleSize, 8);  CommChunk.ckSize = _lrotl(CommChunk.ckSize, 8);  CommChunk.numChannels = _rotl(CommChunk.numChannels, 8);  CommChunk.numSampleFrames = _lrotl(CommChunk.numSampleFrames, 8);#endif  *byte_per_sample = ceil((double)CommChunk.sampleSize / 8);	  for (i = 0; i < sizeof(char[10]); i++)			temp_sampleRate[i] = CommChunk.sampleRate[i];	  extended_to_double(temp_sampleRate, &aiff_ptr->sampleRate);/* to start the search again from the beginning, HP 27-may-93 */         fseek (file_ptr, sizeof(Chunk), SEEK_SET);	 if (fread(&ident, sizeof(identifier), 1, file_ptr) != 1)		return(-1);#ifdef MSDOS	holder = ident.name[0];	ident.name[0] = ident.name[3];	ident.name[3] = holder;	holder = ident.name[1];	ident.name[1] = ident.name[2];	ident.name[2] = holder;	ident.ck_length = _lrotl(ident.ck_length, 8);#endif/* fixed bug in next line, HP 27-may-93 */

⌨️ 快捷键说明

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