bitstream reading was majorly broken for edge cases (of which there are a lot in a MUS playlist!)

git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@368 51a99a44-fe44-0410-b1ba-c3e57ba2b86b
This commit is contained in:
halleyscometsw 2008-07-22 04:47:37 +00:00
parent 6a0fd32833
commit 3a47ef576b

View File

@ -51,31 +51,37 @@ static int get_bits_reload(ACMStream *acm, unsigned bits)
switch (acm->data_len - acm->buf_start_ofs) { switch (acm->data_len - acm->buf_start_ofs) {
case 0: case 0:
return ACM_ERR_UNEXPECTED_EOF; b_data = 0;
b_avail = 8;
break;
case 1: case 1:
b_data = read_8bit(acm->buf_start_ofs,acm->streamfile); b_data = (uint8_t)read_8bit(acm->buf_start_ofs,acm->streamfile);
b_avail = 8; b_avail = 8;
acm->buf_start_ofs += 1; acm->buf_start_ofs += 1;
break; break;
case 2: case 2:
b_data = read_16bitLE(acm->buf_start_ofs,acm->streamfile); b_data = (uint16_t)read_16bitLE(acm->buf_start_ofs,acm->streamfile);
b_avail = 16; b_avail = 16;
acm->buf_start_ofs += 2; acm->buf_start_ofs += 2;
break; break;
case 3: case 3:
b_data = read_8bit(acm->buf_start_ofs,acm->streamfile); b_data = (uint8_t)read_8bit(acm->buf_start_ofs,acm->streamfile);
b_data |= (int32_t)read_16bitLE(acm->buf_start_ofs+1,acm->streamfile)<<8; b_data |= (int32_t)(uint16_t)read_16bitLE(acm->buf_start_ofs+1,acm->streamfile)<<8;
b_avail = 24; b_avail = 24;
acm->buf_start_ofs += 3; acm->buf_start_ofs += 3;
break;
case 4: case 4:
default: default:
/* shouldn't happen */ if (acm->data_len - acm->buf_start_ofs <= 0) {
if (acm->data_len - acm->buf_start_ofs < 0) b_data = 0;
return ACM_ERR_UNEXPECTED_EOF; b_avail = 8;
break;
}
b_data = read_32bitLE(acm->buf_start_ofs,acm->streamfile); b_data = read_32bitLE(acm->buf_start_ofs,acm->streamfile);
b_avail = 32; b_avail = 32;
acm->buf_start_ofs += 4; acm->buf_start_ofs += 4;
break;
} }
data |= (b_data & ((1 << bits) - 1)) << got; data |= (b_data & ((1 << bits) - 1)) << got;