/* initialize buffer, call once before first getbits or showbits */ void _apeg_initialize_buffer(APEG_LAYER *layer) { layer->Incnt = 0; layer->got_last = FALSE; switch(layer->buffer_type) { case DISK_BUFFER: // (Re)open the file if(layer->pf) pack_fclose(layer->pf); layer->pf = pack_fopen(layer->fname, F_READ); if(!layer->pf) { sprintf(apeg_error, "Couldn't open %s", layer->fname); apeg_error_jump(NULL); } break; case MEMORY_BUFFER: layer->mem_data.buf -= layer->buffer_size - layer->mem_data.bytes_left; layer->mem_data.bytes_left = layer->buffer_size; break; case USER_BUFFER: if(!layer->ext_data.request || !layer->ext_data.skip || !layer->ext_data.init) apeg_error_jump("Unable to request data"); layer->buffer_size = layer->ext_data.init(layer->ext_data.ptr); if(layer->buffer_size <= 0) apeg_error_jump("Data init failed"); layer->buffer_size = (layer->buffer_size+3) & (~3); break; default: sprintf(apeg_error, "Unknown buffer type: %d", layer->buffer_type); apeg_error_jump(NULL); } layer->Bfr = 0; layer->Incnt = 0; layer->Rdmax = 0; if(layer->system_stream_flag != MPEG_SYSTEM) layer->Rdmax = ~0u; if(layer->system_stream_flag != OGG_SYSTEM) apeg_flush_bits(layer, 0); /* fills valid data into Bfr */ }
static int Get_Chroma_DC_dct_diff(APEG_LAYER *layer) { int code, size; /* decode length */ code = show_bits(layer, 5); if (code<31) { /* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */ static const VLCtab DCchromtab0[32] = { {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {0, 0} }; size = DCchromtab0[code].val; apeg_flush_bits8(layer, DCchromtab0[code].len); if(size == 0) return 0; } else { /* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */ static const VLCtab DCchromtab1[32] = { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, { 6, 6}, { 6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, { 6, 6}, { 6, 6}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, { 7, 7}, { 7, 7}, {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10} }; code = show_bits(layer, 10) - 992; size = DCchromtab1[code].val; apeg_flush_bits(layer, DCchromtab1[code].len); } { const int dct_diff = apeg_get_bits(layer, size); const int f = ((dct_diff >> (size-1))&1)^1; return dct_diff - ((f<<size) - f); /* int dct_diff = apeg_get_bits(layer, size); if (( dct_diff & (1 << (size-1)) ) == 0) return dct_diff - ((1<<size) - 1); return dct_diff;*/ } }