summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libmpg123/layer3.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/libmpg123/layer3.c b/src/libmpg123/layer3.c
index d3673b57d..58c7d018a 100644
--- a/src/libmpg123/layer3.c
+++ b/src/libmpg123/layer3.c
@@ -292,7 +292,7 @@ void init_layer3(int down_sample_sblimit)
* read additional side information
*/
#ifdef MPEG1
-static void III_get_side_info_1(struct III_sideinfo *si,int stereo,
+static int III_get_side_info_1(struct III_sideinfo *si,int stereo,
int ms_stereo,long sfreq,int single)
{
int ch, gr;
@@ -319,6 +319,7 @@ static void III_get_side_info_1(struct III_sideinfo *si,int stereo,
gr_info->big_values = getbits_fast(9);
if(gr_info->big_values > 288) {
fprintf(stderr,"big_values too large!\n");
+ return 0;
gr_info->big_values = 288;
}
gr_info->pow2gain = gainpow2+256 - getbits_fast(8) + powdiff;
@@ -343,7 +344,7 @@ static void III_get_side_info_1(struct III_sideinfo *si,int stereo,
if(gr_info->block_type == 0) {
fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
- exit(1);
+ return 0;
}
/* region_count/start parameters are implicit in this case. */
gr_info->region1start = 36>>1;
@@ -366,13 +367,14 @@ static void III_get_side_info_1(struct III_sideinfo *si,int stereo,
gr_info->count1table_select = get1bit();
}
}
+ return 1;
}
#endif
/*
* Side Info for MPEG 2.0 / LSF
*/
-static void III_get_side_info_2(struct III_sideinfo *si,int stereo,
+static int III_get_side_info_2(struct III_sideinfo *si,int stereo,
int ms_stereo,long sfreq,int single)
{
int ch;
@@ -393,6 +395,7 @@ static void III_get_side_info_2(struct III_sideinfo *si,int stereo,
if(gr_info->big_values > 288) {
fprintf(stderr,"big_values too large!\n");
gr_info->big_values = 288;
+ return 0;
}
gr_info->pow2gain = gainpow2+256 - getbits_fast(8) + powdiff;
if(ms_stereo)
@@ -416,7 +419,7 @@ static void III_get_side_info_2(struct III_sideinfo *si,int stereo,
if(gr_info->block_type == 0) {
fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
- exit(1);
+ return 0;
}
/* region_count/start parameters are implicit in this case. */
/* check this again! */
@@ -444,6 +447,7 @@ static void III_get_side_info_2(struct III_sideinfo *si,int stereo,
gr_info->scalefac_scale = get1bit();
gr_info->count1table_select = get1bit();
}
+ return 1;
}
/*
@@ -1477,12 +1481,14 @@ void do_layer3(mpgaudio_t *mp)
if(fr->lsf) {
granules = 1;
- III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single);
+ if (!III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single))
+ return;
}
else {
granules = 2;
-#ifdef MPEG1
- III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single);
+#ifdef MPEG1
+ if (!III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single))
+ return;
#else
fprintf(stderr,"Not supported\n");
#endif