-
Notifications
You must be signed in to change notification settings - Fork 0
/
BitTreeDecoder.pm
executable file
·75 lines (61 loc) · 1.77 KB
/
BitTreeDecoder.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/perl
##########################################################################
# Bit Tree Decoder
# Copyright (C) 2012 Tomonobu Saito All Rights Reserverd.
package BitTreeDecoder;
use warnings;
use strict;
use Carp qw(croak);
use RangeCoderDecoder;
sub new {
my $pkg = shift;
my $numBitLevels = shift;
bless {
NumBitLevels => $numBitLevels,
ref_Models => [ (undef) x (1 << $numBitLevels) ],
}, $pkg;
}
sub Init {
my $self = shift;
RangeCoderDecoder::InitBitModels($self->{ ref_Models });
}
sub Decode {
my $self = shift;
my $rangeDecoder = shift;
my $m = 1;
for (my $bitIndex = $self->{ NumBitLevels }; 0 != $bitIndex ; --$bitIndex) {
$m = ($m << 1) + $rangeDecoder->DecodeBit($self->{ ref_Models }, $m);
}
return $m - (1 << $self->{ NumBitLevels });
}
sub ReverseDecode {
my $self = shift;
my $rangeDecoder = shift;
my $m = 1;
my $symbol = 0;
for (my $bitIndex = 0; $bitIndex < $self->{ NumBitLevels }; ++$bitIndex) {
my $bit = $rangeDecoder->DecodeBit($self->{ ref_Models }, $m);
$m = $m << 1;
$m += $bit;
$symbol |= ($bit << $bitIndex);
}
return $symbol;
}
# static
sub ReverseDecode_static {
my $ref_Models = shift;
my $startIndex = shift;
my $rangeDecoder = shift;
my $NumBitLevels = shift;
my $m = 1;
my $symbol = 0;
for (my $bitIndex = 0; $bitIndex < $NumBitLevels; ++$bitIndex) {
my $bit = $rangeDecoder->DecodeBit($ref_Models, $startIndex + $m);
$m = $m << 1;
$m += $bit;
$symbol |= ($bit << $bitIndex);
}
return $symbol;
}
1;