亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bitstrm.cpp

?? 幾種圖像格式之間的轉換
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
    }

    Move( code_bits );
    if( val == RBS_HUFF_FORB )
        throw RBS_THROW_FORB;

    return val;
}


void  RMBitStream::Move( int shift )
{
    int new_bit_idx = m_bit_idx - shift;
    m_current -= (new_bit_idx >> 5)<<2;
    m_bit_idx  = new_bit_idx & 31;
}


void  RMBitStream::Skip( int bytes )
{
    Move( bytes*8 );
}


static const int huff_val_shift = 20, huff_code_mask = (1 << huff_val_shift) - 1;

bool bsCreateDecodeHuffmanTable( const int* src, short* table, int max_size )
{   
    const int forbidden_entry = (RBS_HUFF_FORB << 4)|1;
    int       first_bits = src[0];
    struct
    {
        int bits;
        int offset;
    }
    sub_tables[1 << 11];
    int  size = (1 << first_bits) + 1;
    int  i, k;
    
    /* calc bit depths of sub tables */
    memset( sub_tables, 0, (1 << first_bits)*sizeof(sub_tables[0]) );
    for( i = 1, k = 1; src[k] >= 0; i++ )
    {
        int code_count = src[k++];
        int sb = i - first_bits;
        
        if( sb <= 0 )
            k += code_count;
        else
            for( code_count += k; k < code_count; k++ )
            {
                int  code = src[k] & huff_code_mask;
                sub_tables[code >> sb].bits = sb;
            }
    }

    /* calc offsets of sub tables and whole size of table */
    for( i = 0; i < (1 << first_bits); i++ )
    {
        int b = sub_tables[i].bits;
        if( b > 0 )
        {
            b = 1 << b;
            sub_tables[i].offset = size;
            size += b + 1;
        }
    }

    if( size > max_size )
    {
        assert(0);
        return false;
    }

    /* fill first table and subtables with forbidden values */
    for( i = 0; i < size; i++ )
    {
        table[i] = (short)forbidden_entry;
    }

    /* write header of first table */
    table[0] = (short)first_bits;

    /* fill first table and sub tables */ 
    for( i = 1, k = 1; src[k] >= 0; i++ )
    {
        int code_count = src[k++];
        for( code_count += k; k < code_count; k++ )
        {
            int  table_bits= first_bits;
            int  code_bits = i;
            int  code = src[k] & huff_code_mask;
            int  val  = src[k] >>huff_val_shift;
            int  j, offset = 0;

            if( code_bits > table_bits )
            {
                int idx = code >> (code_bits -= table_bits);
                code &= (1 << code_bits) - 1;
                offset   = sub_tables[idx].offset;
                table_bits= sub_tables[idx].bits;
                /* write header of subtable */
                table[offset]  = (short)table_bits;
                /* write jump to subtable */
                table[idx + 1]= (short)(offset << 4);
            }
        
            table_bits -= code_bits;
            assert( table_bits >= 0 );
            val = (val << 4) | code_bits;
            offset += (code << table_bits) + 1;
        
            for( j = 0; j < (1 << table_bits); j++ )
            {
                assert( table[offset + j] == forbidden_entry );
                table[ offset + j ] = (short)val;
            }
        }
    }
    return true;
}


int*  bsCreateSourceHuffmanTable( const uchar* src, int* dst,
                                  int max_bits, int first_bits )
{
    int   i, val_idx, code = 0;
    int*  table = dst;
    *dst++ = first_bits;
    for( i = 1, val_idx = max_bits; i <= max_bits; i++ )
    {
        int code_count = src[i - 1];
        dst[0] = code_count;
        code <<= 1;
        for( int k = 0; k < code_count; k++ )
        {
            dst[k + 1] = (src[val_idx + k] << huff_val_shift)|(code + k);
        }
        code += code_count;
        dst += code_count + 1;
        val_idx += code_count;
    }
    dst[0] = -1;
    return  table;
}


/////////////////////////// WBaseStream /////////////////////////////////

// WBaseStream - base class for output streams
WBaseStream::WBaseStream()
{
    m_start = m_end = m_current = 0;
    m_file = 0;
    m_block_size = BS_DEF_BLOCK_SIZE;
    m_is_opened = false;
}


WBaseStream::~WBaseStream()
{
    Close();    // Close files
    Release();  // free  buffers
}


bool  WBaseStream::IsOpened()
{ 
    return m_is_opened;
}


void  WBaseStream::Allocate()
{
    if( !m_start )
        m_start = new uchar[m_block_size];

    m_end = m_start + m_block_size;
    m_current = m_start;
}


void  WBaseStream::WriteBlock()
{
    int written, size = m_current - m_start;
    assert( m_file != 0 );

    //fseek( m_file, m_block_pos, SEEK_SET );
    written = fwrite( m_start, 1, size, m_file );
    m_current = m_start;

    if( written < size ) throw RBS_THROW_EOS;
    
    m_block_pos += size;
}


bool  WBaseStream::Open( const char* filename )
{
    Close();
    Allocate();
    
    m_file = fopen( filename, "wb" );
    
    if( m_file )
    {
        m_is_opened = true;
        m_block_pos = 0;
        m_current = m_start;
    }
    return m_file != 0;
}


void  WBaseStream::Close()
{
    if( m_file )
    {
        WriteBlock();
        fclose( m_file );
        m_file = 0;
    }
    m_is_opened = false;
}


void  WBaseStream::Release()
{
    if( m_start )
    {
        delete m_start;
    }
    m_start = m_end = m_current = 0;
}


void  WBaseStream::SetBlockSize( int block_size )
{
    assert( block_size > 0 && (block_size & (block_size-1)) == 0 );

    if( m_start && block_size == m_block_size ) return;
    Release();
    m_block_size = block_size;
    Allocate();
}


int  WBaseStream::GetPos()
{
    assert( IsOpened() );
    return m_block_pos + (m_current - m_start);
}


///////////////////////////// WLByteStream /////////////////////////////////// 

WLByteStream::~WLByteStream()
{
}

void WLByteStream::PutByte( int val )
{
    *m_current++ = (uchar)val;
    if( m_current >= m_end )
        WriteBlock();
}


void WLByteStream::PutBytes( const void* buffer, int count )
{
    uchar* data = (uchar*)buffer;
    
    assert( data && m_current && count >= 0 );

    while( count )
    {
        int l = m_end - m_current;
        
        if( l > count )
            l = count;
        
        if( l > 0 )
        {
            memcpy( m_current, data, l );
            m_current += l;
            data += l;
            count -= l;
        }
        if( m_current == m_end )
            WriteBlock();
    }
}


void WLByteStream::PutWord( int val )
{
    uchar *current = m_current;

    if( current+1 < m_end )
    {
        current[0] = (uchar)val;
        current[1] = (uchar)(val >> 8);
        m_current = current + 2;
        if( m_current == m_end )
            WriteBlock();
    }
    else
    {
        PutByte(val);
        PutByte(val >> 8);
    }
}


void WLByteStream::PutDWord( int val )
{
    uchar *current = m_current;

    if( current+3 < m_end )
    {
        current[0] = (uchar)val;
        current[1] = (uchar)(val >> 8);
        current[2] = (uchar)(val >> 16);
        current[3] = (uchar)(val >> 24);
        m_current = current + 4;
        if( m_current == m_end )
            WriteBlock();
    }
    else
    {
        PutByte(val);
        PutByte(val >> 8);
        PutByte(val >> 16);
        PutByte(val >> 24);
    }
}


///////////////////////////// WMByteStream /////////////////////////////////// 

WMByteStream::~WMByteStream()
{
}


void WMByteStream::PutWord( int val )
{
    uchar *current = m_current;

    if( current+1 < m_end )
    {
        current[1] = (uchar)val;
        current[0] = (uchar)(val >> 8);
        m_current = current + 2;
        if( m_current == m_end )
            WriteBlock();
    }
    else
    {
        PutByte(val >> 8);
        PutByte(val);
    }
}


void WMByteStream::PutDWord( int val )
{
    uchar *current = m_current;

    if( current+3 < m_end )
    {
        current[3] = (uchar)(val >> 24);
        current[2] = (uchar)(val >> 16);
        current[1] = (uchar)(val >> 8);
        current[0] = (uchar)val;
        m_current = current + 4;
        if( m_current == m_end )
            WriteBlock();
    }
    else
    {
        PutByte(val >> 24);
        PutByte(val >> 16);
        PutByte(val >> 8);
        PutByte(val);
    }
}


///////////////////////////// WMBitStream /////////////////////////////////// 

WMBitStream::WMBitStream()
{
    m_pad_val = 0;
    ResetBuffer();
}


WMBitStream::~WMBitStream()
{
}


bool  WMBitStream::Open( const char* filename )
{
    ResetBuffer();
    return WBaseStream::Open( filename );
}


void  WMBitStream::ResetBuffer()
{
    m_val = 0;
    m_bit_idx = 32;
    m_current = m_start;
}

void  WMBitStream::Flush()
{
    if( m_bit_idx < 32 )
    {
        Put( m_pad_val, m_bit_idx & 7 );
        *((ulong*&)m_current)++ = m_val;
    }
}


void  WMBitStream::Close()
{
    if( m_is_opened )
    {
        Flush();
        WBaseStream::Close();
    }
}


void  WMBitStream::WriteBlock()
{
#ifdef  LITTLE_ENDIAN
    bsBSwapBlock( m_start, m_current );
#endif
    WBaseStream::WriteBlock();
}


int  WMBitStream::GetPos()
{
    return WBaseStream::GetPos() + ((32 - m_bit_idx) >> 3);
}


void  WMBitStream::Put( int val, int bits )
{
    int  bit_idx = m_bit_idx - bits;
    ulong  curval = m_val;

    assert( 0 <= bits && bits < 32 );

    val &= bs_bit_mask[bits];

    if( bit_idx >= 0 )
    {
        curval |= val << bit_idx;
    }
    else
    {
        *((ulong*&)m_current)++ = curval | ((unsigned)val >> -bit_idx);
        if( m_current >= m_end )
        {
            WriteBlock();
        }
        bit_idx += 32;
        curval = val << bit_idx;
    }

    m_val = curval;
    m_bit_idx = bit_idx;
}


void  WMBitStream::PutHuff( int val, const ulong* table )
{
    int min_val = (int)table[0];
    val -= min_val;
    
    assert( (unsigned)val < table[1] );

    ulong code = table[val + 2];
    assert( code != 0 );
    
    Put( code >> 8, code & 255 );
}


bool bsCreateEncodeHuffmanTable( const int* src, ulong* table, int max_size )
{   
    int  i, k;
    int  min_val = INT_MAX, max_val = INT_MIN;
    int  size;
    
    /* calc min and max values in the table */
    for( i = 1, k = 1; src[k] >= 0; i++ )
    {
        int code_count = src[k++];

        for( code_count += k; k < code_count; k++ )
        {
            int  val = src[k] >> huff_val_shift;
            if( val < min_val )
                min_val = val;
            if( val > max_val )
                max_val = val;
        }
    }

    size = max_val - min_val + 3;

    if( size > max_size )
    {
        assert(0);
        return false;
    }

    memset( table, 0, size*sizeof(table[0]));

    table[0] = min_val;
    table[1] = size - 2;

    for( i = 1, k = 1; src[k] >= 0; i++ )
    {
        int code_count = src[k++];

        for( code_count += k; k < code_count; k++ )
        {
            int  val = src[k] >> huff_val_shift;
            int  code = src[k] & huff_code_mask;

            table[val - min_val + 2] = (code << 8) | i;
        }
    }
    return true;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九**精品视频免费播放| 成人免费黄色在线| 久久久亚洲欧洲日产国码αv| 成人av电影在线观看| 激情成人综合网| 美日韩一级片在线观看| 亚洲第一精品在线| 亚洲欧美电影院| 国产精品三级av在线播放| 久久久久久毛片| 午夜国产精品影院在线观看| 免费观看在线综合| 久久99久久99小草精品免视看| aaa欧美色吧激情视频| 99久久免费国产| 欧美日韩一区二区三区四区| 欧美日韩亚洲国产综合| 国产精品久久99| 亚洲国产日韩a在线播放| 久久精品国内一区二区三区| 国产成人精品网址| eeuss鲁片一区二区三区| 久久综合色天天久久综合图片| 欧美国产成人精品| 亚洲黄色av一区| 午夜国产精品一区| 91麻豆6部合集magnet| 欧美精品123区| 国产精品美女久久久久久久久| 蜜桃视频在线一区| 91精品国产91久久久久久最新毛片 | 婷婷丁香久久五月婷婷| 色哟哟一区二区三区| 在线电影国产精品| 亚洲成人中文在线| 欧美一区二区福利在线| 日韩精品亚洲一区| 99久久99久久久精品齐齐| 国产精品久久看| 色综合久久久久综合体桃花网| 亚洲免费观看在线视频| 色av成人天堂桃色av| 精品卡一卡二卡三卡四在线| 国产精品国产三级国产aⅴ原创| 成人教育av在线| 亚洲乱码国产乱码精品精小说 | 精品一区二区三区香蕉蜜桃| 精品国偷自产国产一区| 亚洲在线观看免费视频| 成人精品国产一区二区4080| 日韩毛片高清在线播放| 成人听书哪个软件好| 亚洲欧美一区二区三区久本道91| 欧美亚洲综合色| 亚洲欧洲综合另类| 91精品国产综合久久香蕉的特点 | 国内精品国产成人| 欧美国产综合一区二区| 色综合久久久久综合| 天天综合网 天天综合色| 欧美精品一区二区三区很污很色的 | 国产精品久久久久久久久免费丝袜 | 午夜视黄欧洲亚洲| 精品国产一区a| 91小视频在线观看| 日本不卡123| 国产精品免费观看视频| 欧美色综合久久| 国产一二精品视频| 欧美电影免费观看完整版| 午夜电影网一区| 国产网站一区二区| 国产精品白丝av| 欧美大尺度电影在线| 99精品桃花视频在线观看| 奇米精品一区二区三区在线观看| 久久久99精品久久| 欧美乱妇一区二区三区不卡视频| 国产成人精品免费| 丝袜诱惑制服诱惑色一区在线观看| 国产视频一区在线观看| 欧美日韩国产一级二级| 亚洲视频图片小说| 精品国产3级a| 欧美无砖专区一中文字| aaa欧美色吧激情视频| 国产又黄又大久久| 天使萌一区二区三区免费观看| 国产精品久久久久久亚洲毛片 | 精品在线播放免费| 亚洲一区二三区| 亚洲欧美一区二区在线观看| av一本久道久久综合久久鬼色| 另类的小说在线视频另类成人小视频在线 | 成人av在线资源网站| 美腿丝袜亚洲三区| 日韩专区中文字幕一区二区| 亚洲黄一区二区三区| 国产日韩精品一区二区三区| 一本一道综合狠狠老| 国产盗摄女厕一区二区三区| 免费成人性网站| 婷婷综合在线观看| 亚洲一二三四久久| 一区二区三区不卡在线观看 | 亚洲免费观看高清完整版在线 | 精品一区二区在线视频| 亚洲成a人v欧美综合天堂下载| 一色桃子久久精品亚洲| 国产精品久久毛片| 1000部国产精品成人观看| 中文字幕精品在线不卡| 国产亚洲精品免费| 26uuu色噜噜精品一区二区| 精品国内二区三区| 久久久国产精品午夜一区ai换脸| 精品成人免费观看| 久久理论电影网| 国产拍揄自揄精品视频麻豆 | 精品日韩成人av| 日韩精品专区在线影院重磅| 日韩视频一区二区| 9人人澡人人爽人人精品| 成人av网在线| 99久久亚洲一区二区三区青草| 一本到三区不卡视频| 在线看国产一区二区| 国产盗摄一区二区三区| 不卡视频在线看| 日本高清免费不卡视频| 欧美视频一区二| 日韩一区二区在线免费观看| 欧美sm美女调教| 国产精品人成在线观看免费| 国产精品久久久久久妇女6080| 亚洲人成小说网站色在线| 亚洲午夜在线观看视频在线| 日韩电影免费在线| 亚洲一区二三区| 久久精品国产精品亚洲红杏| 国产成人av电影在线| 男女男精品视频网| 国产成人综合视频| 91视频精品在这里| 91麻豆精品91久久久久同性| 欧美精品一区二区三区久久久| 综合av第一页| 免费在线观看视频一区| av不卡免费电影| 日韩视频中午一区| 亚洲欧洲在线观看av| 亚洲成a人在线观看| 国产伦精品一区二区三区视频青涩 | 亚洲国产cao| 国产曰批免费观看久久久| 91国产丝袜在线播放| 精品国产99国产精品| 亚洲综合视频在线| 国产老妇另类xxxxx| 91精彩视频在线| 国产女人aaa级久久久级| 午夜视频在线观看一区| 成人免费av资源| 精品国产一区二区在线观看| 一区二区久久久久久| 国产福利91精品一区| 欧美日韩视频一区二区| 日韩国产欧美一区二区三区| 国产成人av影院| 91精品国产综合久久香蕉麻豆 | 久久精品亚洲精品国产欧美| 亚洲午夜久久久久久久久电影院| 国产成人精品三级麻豆| 日韩区在线观看| 亚洲.国产.中文慕字在线| 国产99精品视频| 欧美xxxx老人做受| 日韩成人一级片| 欧美人xxxx| 亚洲福利一区二区| 色天天综合色天天久久| 国产精品视频线看| 国产精品一卡二卡| 欧美电影免费观看高清完整版在| 亚洲国产乱码最新视频| 欧美中文字幕一区二区三区亚洲| 国产精品你懂的| 成人动漫av在线| 国产精品国产三级国产a| 粉嫩一区二区三区在线看| 精品国产乱码久久久久久久| 日韩av高清在线观看| 欧美乱妇一区二区三区不卡视频| 亚洲二区在线视频| 欧美午夜一区二区| 亚洲国产精品久久久久秋霞影院 | 婷婷开心久久网| 欧美久久久久久久久久| 五月激情综合色| 欧美一区二区三区在线视频|