X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Fcabac_coder.rs;h=82c20b00ee63e67a4fa96f1f2465e133da5caaf8;hb=HEAD;hp=3e9278e1f72c36dc647273bdc00ff9501aec7a9c;hpb=625751036014b099fd9c126397bc973cb0543130;p=nihav.git diff --git a/nihav-itu/src/codecs/h264/cabac_coder.rs b/nihav-itu/src/codecs/h264/cabac_coder.rs index 3e9278e..c41928b 100644 --- a/nihav-itu/src/codecs/h264/cabac_coder.rs +++ b/nihav-itu/src/codecs/h264/cabac_coder.rs @@ -167,14 +167,14 @@ impl<'a> CABAC<'a> { asm!( // unpack state "movzx {state_idx:e}, byte ptr [{ctx} + 0x18 + {idx}]", + "movzx {tmp}, word ptr [{ctx} + 0x418]", "mov {val_mps:x}, {state_idx:x}", "and {state_idx}, 0x3F", "and {val_mps:r}, 0x80", - "movzx {tmp}, word ptr [{ctx} + 0x418]", - "mov {bit:r}, {val_mps:r}", "shr {tmp}, 6", - "and {tmp}, 3", + "mov {bit:r}, {val_mps:r}", "lea {range_lps:r}, {range_tab}[rip]", + "and {tmp}, 3", "lea {range_lps:r}, [{range_lps:r} + {state_idx} * 4]", "movzx {range_lps:x}, byte ptr [{range_lps:r} + {tmp}]", // self.cod_range -= range_lps; @@ -182,23 +182,23 @@ impl<'a> CABAC<'a> { // determine bit value "mov {tmp:x}, word ptr [{ctx} + 0x41A]", "cmp {tmp:x}, word ptr [{ctx} + 0x418]", - "jl 1f", + "jl 2f", "sub {tmp:x}, word ptr [{ctx} + 0x418]", "mov word ptr [{ctx} + 0x418], {range_lps:x}", "mov word ptr [{ctx} + 0x41A], {tmp:x}", "xor {bit:l}, 0x80", - "1:", + "2:", // update state[idx] "cmp {bit:x}, {val_mps:x}", - "jne 2f", + "jne 3f", "lea {tmp}, {trans_idx_mps}[rip]", - "jmp 3f", - "2:", + "jmp 4f", + "3:", "lea {tmp}, {trans_idx_lps}[rip]", "cmp {state_idx}, 0", - "jnz 3f", + "jnz 4f", "xor {val_mps:x}, 0x80", - "3:", + "4:", "movzx {tmp}, byte ptr [{tmp} + {state_idx}]", "or {tmp:x}, {val_mps:x}", "mov byte ptr [{ctx} + 0x18 + {idx}], {tmp:l}", @@ -235,8 +235,10 @@ impl<'a> CABAC<'a> { pub fn decode_012(&mut self, start: usize) -> u8 { if !self.decode_bit(start) { 0 + } else if !self.decode_bit(start + 1) { + 1 } else { - self.decode_bit(start + 1) as u8 + 1 + 2 } } fn refill(&mut self) {