1 // Copyright (C) 2003  Davis E. King (davis@dlib.net)\r
3 #ifndef DLIB_ENTROPY_DECODER_KERNEl_1_\r
4 #define DLIB_ENTROPY_DECODER_KERNEl_1_\r
5 \r
6 #include "../algs.h"\r
7 #include "entropy_decoder_kernel_abstract.h"\r
8 #include <iosfwd>\r
9 #include "../uintn.h"\r
10 \r
11 namespace dlib\r
12 {\r
13 \r
14     class entropy_decoder_kernel_1 \r
15     {\r
16         /*!\r
17             GENERAL NOTES\r
18                 this decoder is implemented using arithmetic coding\r
19 \r
20             INITIAL VALUE\r
21                 in       == 0\r
22                 buf_used == 0\r
23                 buf      == 0\r
24                 initial_low      == 0x00000001  (slightly more than zero)\r
25                 initial_high     == 0xffffffff  (slightly less than one, 0.99999999976717)\r
26                 target   == 0x00000000  (zero)\r
27                 low      == initial_low\r
28                 high     == initial_high\r
29                 r        == 0\r
30 \r
31             CONVENTION\r
32                 if (in != 0)\r
33                     *in       == get_stream()\r
34                     true      == stream_is_set()\r
35                     streambuf == in->rdbuf()\r
36                 else\r
37                     false   == stream_is_set()\r
38 \r
39                 buf      == used to hold fractional byte values which are fed to target.  \r
40                 buf_used == the number of low order bits in buf that are currently \r
41                             in use\r
42                 low      == the low end of the range used for arithmetic encoding.\r
43                             this number is used as a 32bit fixed point real number. \r
44                             the point is fixed just before the first bit, so it is\r
45                             always in the range [0,1)\r
46 \r
47                             low is also never allowed to be zero to avoid overflow\r
48                             in the calculation (high-low+1)/total.\r
49 \r
50                 high     == the high end of the range - 1 used for arithmetic encoding.\r
51                             this number is used as a 32bit fixed point real number. \r
52                             the point is fixed just before the first bit, so when we\r
53                             interpret high as a real number then it is always in the\r
54                             range [0,1)\r
55 \r
56                             the range for arithmetic encoding is always \r
57                             [low,high + 0.9999999...)   the 0.9999999... is why\r
58                             high == real upper range - 1\r
59 \r
60                 target  ==  32 bits of the fraction produced from an arithmetic encoder.\r
61                             this number is used as a 32bit fixed point real number. \r
62                             the point is fixed just before the first bit, so it is\r
63                             always in the range [0,1)      \r
64 \r
65                 r       ==  the value (high-low+1)/total from the last call to \r
66                             get_target() or 0 if get_target_called() should be false\r
67 \r
68                 get_target_called() == (r != 0)\r
69 \r
70         !*/\r
71 \r
72     public:\r
73 \r
74         entropy_decoder_kernel_1 (\r
75         );\r
76 \r
77         virtual ~entropy_decoder_kernel_1 (\r
78         );\r
79 \r
80         void clear(\r
81         );\r
82 \r
83         void set_stream (\r
84             std::istream& in\r
85         );\r
86 \r
87         bool stream_is_set (\r
88         ) const;\r
89 \r
90         std::istream& get_stream (\r
91         ) const;\r
92 \r
93         void decode (\r
94             uint32 low_count,\r
95             uint32 high_count\r
96         );\r
97 \r
98         bool get_target_called (\r
99         ) const;\r
100 \r
101         uint32 get_target (\r
102             uint32 total\r
103         );\r
104 \r
105     private:\r
106 \r
107         // restricted functions\r
108         entropy_decoder_kernel_1(entropy_decoder_kernel_1&);        // copy constructor\r
109         entropy_decoder_kernel_1& operator=(entropy_decoder_kernel_1&);    // assignment operator\r
110 \r
111         // data members\r
112         const uint32 initial_low;\r
113         const uint32 initial_high;\r
114         std::istream* in;\r
115         uint32 low;\r
116         uint32 high;\r
117         unsigned char buf; \r
118         uint32 buf_used; \r
119         uint32 target;\r
120         uint32 r;\r
121         std::streambuf* streambuf;\r
122 \r
123     };   \r
124 \r
125 }\r
126 \r
127 #ifdef NO_MAKEFILE\r
128 #include "entropy_decoder_kernel_1.cpp"\r
129 #endif\r
130 \r
131 #endif // DLIB_ENTROPY_DECODER_KERNEl_1_\r
132 \r