⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 4 页
字号:
		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                       lsb

The 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -