📄 common.c
字号:
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 + -