|
|
|
|
|
#ifndef DLIB_ENTROPY_DECODER_KERNEL_2_CPp_ |
|
#define DLIB_ENTROPY_DECODER_KERNEL_2_CPp_ |
|
#include "entropy_decoder_kernel_2.h" |
|
#include <iostream> |
|
#include <streambuf> |
|
#include <sstream> |
|
|
|
#include "../assert.h" |
|
|
|
namespace dlib |
|
{ |
|
|
|
|
|
|
|
entropy_decoder_kernel_2:: |
|
entropy_decoder_kernel_2( |
|
) : |
|
initial_low(0x00000001), |
|
initial_high(0xffffffff), |
|
in(0), |
|
low(initial_low), |
|
high(initial_high), |
|
target(0x00000000), |
|
r(0) |
|
{ |
|
} |
|
|
|
|
|
|
|
entropy_decoder_kernel_2:: |
|
~entropy_decoder_kernel_2 ( |
|
) |
|
{ |
|
} |
|
|
|
|
|
|
|
void entropy_decoder_kernel_2:: |
|
clear( |
|
) |
|
{ |
|
in = 0; |
|
r = 0; |
|
low = initial_low; |
|
high = initial_high; |
|
target = 0x00000000; |
|
} |
|
|
|
|
|
|
|
void entropy_decoder_kernel_2:: |
|
set_stream ( |
|
std::istream& in_ |
|
) |
|
{ |
|
r = 0; |
|
low = initial_low; |
|
high = initial_high; |
|
target = 0x00000000; |
|
|
|
in = &in_; |
|
streambuf = in_.rdbuf(); |
|
|
|
|
|
|
|
unsigned char ch; |
|
|
|
|
|
streambuf->sgetn((char*)&ch,1); |
|
target = ch; |
|
|
|
target <<= 8; |
|
if (streambuf->sgetn((char*)&ch,1)) |
|
target += ch; |
|
|
|
|
|
target <<= 8; |
|
if (streambuf->sgetn((char*)&ch,1)) |
|
target += ch; |
|
|
|
|
|
target <<= 8; |
|
if (streambuf->sgetn((char*)&ch,1)) |
|
target += ch; |
|
} |
|
|
|
|
|
|
|
bool entropy_decoder_kernel_2:: |
|
stream_is_set ( |
|
) const |
|
{ |
|
if (in != 0) |
|
return true; |
|
else |
|
return false; |
|
} |
|
|
|
|
|
|
|
std::istream& entropy_decoder_kernel_2:: |
|
get_stream ( |
|
) const |
|
{ |
|
return *in; |
|
} |
|
|
|
|
|
|
|
void entropy_decoder_kernel_2:: |
|
decode ( |
|
uint32 low_count, |
|
uint32 high_count |
|
) |
|
{ |
|
|
|
|
|
high = low + r*high_count - 1; |
|
low = low + r*low_count; |
|
r = 0; |
|
|
|
|
|
while (true ) |
|
{ |
|
|
|
|
|
if ((high&0xFF000000) != (low&0xFF000000)) |
|
{ |
|
|
|
|
|
|
|
if ((high-low < 0x10000)) |
|
{ |
|
if (high-low > 0x1000) |
|
{ |
|
high>>=1; |
|
low>>=1; |
|
high = low = high+low; |
|
high += 0xFF; |
|
low -= 0xFF; |
|
} |
|
else |
|
{ |
|
high>>=1; |
|
low>>=1; |
|
high = low = high+low; |
|
} |
|
} |
|
else |
|
{ |
|
|
|
|
|
break; |
|
} |
|
|
|
} |
|
|
|
else |
|
{ |
|
unsigned char buf; |
|
if (streambuf->sgetn(reinterpret_cast<char*>(&buf),1)==0) |
|
{ |
|
|
|
|
|
buf = 0; |
|
} |
|
|
|
|
|
target <<= 8; |
|
|
|
|
|
high <<= 8; |
|
low <<= 8; |
|
high |= 0xFF; |
|
|
|
|
|
|
|
|
|
|
|
|
|
if (low == 0) |
|
low = 1; |
|
|
|
|
|
|
|
target |= static_cast<uint32>(buf); |
|
} |
|
|
|
} |
|
} |
|
|
|
|
|
|
|
bool entropy_decoder_kernel_2:: |
|
get_target_called ( |
|
) const |
|
{ |
|
return (r != 0); |
|
} |
|
|
|
|
|
|
|
uint32 entropy_decoder_kernel_2:: |
|
get_target ( |
|
uint32 total |
|
) |
|
{ |
|
|
|
|
|
r = (high-low+1)/total; |
|
uint32 temp = (target-low)/r; |
|
if (temp < total) |
|
return temp; |
|
else |
|
return total-1; |
|
} |
|
|
|
|
|
|
|
} |
|
#endif |
|
|
|
|