+fn expand_token(blk: &mut Block, br: &mut BitReader, eob_run: &mut usize, coef_no: usize, token: u8) -> DecoderResult<()> {
+ match token {
+ // EOBs
+ 0 | 1 | 2 => { *eob_run = (token as usize) + 1; },
+ 3 | 4 | 5 => {
+ let bits = token - 1;
+ *eob_run = (br.read(bits)? as usize) + (1 << bits);
+ },
+ 6 => { *eob_run = br.read(12)? as usize; },
+ // zero runs
+ 7 | 8 => {
+ let bits = if token == 7 { 3 } else { 6 };
+ let run = (br.read(bits)? as usize) + 1;
+ blk.idx += run;
+ validate!(blk.idx <= 64);
+ },
+ // single coefficients
+ 9 | 10 | 11 | 12 => {
+ let val = (i16::from(token) - 7) >> 1;
+ if (token & 1) == 1 {
+ blk.coeffs[ZIGZAG[blk.idx]] = val;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -val;
+ }
+ blk.idx += 1;
+ },
+ 13 | 14 | 15 | 16 => {
+ let val = i16::from(token) - 10;
+ if !br.read_bool()? {
+ blk.coeffs[ZIGZAG[blk.idx]] = val;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -val;
+ }
+ blk.idx += 1;
+ },
+ 17 | 18 | 19 | 20 | 21 | 22 => {
+ let add_bits = if token == 22 { 9 } else { token - 16 };
+ let sign = br.read_bool()?;
+ let val = (br.read(add_bits)? as i16) + VP3_LITERAL_BASE[(token - 17) as usize];
+ if !sign {
+ blk.coeffs[ZIGZAG[blk.idx]] = val;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -val;
+ }
+ blk.idx += 1;
+ }
+ // zero run plus coefficient
+ 23 | 24 | 25 | 26 | 27 => {
+ blk.idx += (token - 22) as usize;
+ validate!(blk.idx < 64);
+ if !br.read_bool()? {
+ blk.coeffs[ZIGZAG[blk.idx]] = 1;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -1;
+ }
+ blk.idx += 1;
+ },
+ 28 | 29 => {
+ let run_bits = token - 26;
+ if token == 28 {
+ blk.idx += 6;
+ } else {
+ blk.idx += 10;
+ }
+ let sign = br.read_bool()?;
+ blk.idx += br.read(run_bits)? as usize;
+ validate!(blk.idx < 64);
+ if !sign {
+ blk.coeffs[ZIGZAG[blk.idx]] = 1;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -1;
+ }
+ blk.idx += 1;
+ },
+ 30 => {
+ blk.idx += 1;
+ validate!(blk.idx < 64);
+ let sign = br.read_bool()?;
+ let val = (br.read(1)? as i16) + 2;
+ if !sign {
+ blk.coeffs[ZIGZAG[blk.idx]] = val;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -val;
+ }
+ blk.idx += 1;
+ },
+ _ => {
+ let sign = br.read_bool()?;
+ let val = (br.read(1)? as i16) + 2;
+ blk.idx += (br.read(1)? as usize) + 2;
+ validate!(blk.idx < 64);
+ if !sign {
+ blk.coeffs[ZIGZAG[blk.idx]] = val;
+ } else {
+ blk.coeffs[ZIGZAG[blk.idx]] = -val;
+ }
+ blk.idx += 1;
+ },
+ };
+ if *eob_run > 0 {
+ blk.idx = 64;
+ *eob_run -= 1;
+ } else if coef_no > 0 {
+ blk.has_ac = true;
+ }
+ Ok(())
+}