static int schro_encoder_encode_slice (SchroEncoderFrame *frame, SchroLowDelay *lowdelay, int slice_x, int slice_y, int slice_bytes, int base_index) { int length_bits; int slice_y_length; int i; int start_bits; int end_bits; int16_t *quant_data = frame->quant_data; start_bits = schro_pack_get_bit_offset (frame->pack); schro_pack_encode_bits (frame->pack, 7, base_index); length_bits = ilog2up(8*slice_bytes); slice_y_length = frame->slice_y_bits - frame->slice_y_trailing_zeros; schro_pack_encode_bits (frame->pack, length_bits, slice_y_length); for(i=0;i<lowdelay->slice_y_size - frame->slice_y_trailing_zeros;i++) { schro_pack_encode_sint (frame->pack, quant_data[i]); } quant_data += lowdelay->slice_y_size; for(i=0;i<lowdelay->slice_uv_size - frame->slice_uv_trailing_zeros/2;i++) { schro_pack_encode_sint (frame->pack, quant_data[i]); schro_pack_encode_sint (frame->pack, quant_data[i+lowdelay->slice_uv_size]); } end_bits = schro_pack_get_bit_offset (frame->pack); SCHRO_DEBUG("total bits %d used bits %d expected %d", slice_bytes*8, end_bits - start_bits, 7 + length_bits + frame->slice_y_bits + frame->slice_uv_bits - frame->slice_y_trailing_zeros - frame->slice_uv_trailing_zeros); SCHRO_ASSERT(end_bits - start_bits == 7 + length_bits + frame->slice_y_bits + frame->slice_uv_bits - frame->slice_y_trailing_zeros - frame->slice_uv_trailing_zeros); if (end_bits - start_bits > slice_bytes*8) { SCHRO_ERROR("slice overran buffer by %d bits (slice_bytes %d base_index %d)", end_bits - start_bits - slice_bytes*8, slice_bytes, base_index); SCHRO_ASSERT(0); } else { int left = slice_bytes*8 - (end_bits - start_bits); for(i=0;i<left; i++) { schro_pack_encode_bit (frame->pack, 1); } } return end_bits - start_bits; }
int test1 (void) { SchroBuffer *buffer = schro_buffer_new_and_alloc (100); SchroPack *pack; SchroUnpack unpack; int i; int ref[800]; int x; int guard; for(i=0;i<800;i++){ ref[i] = rand()&1; } guard = rand()&1; pack = schro_pack_new (); schro_pack_encode_init (pack, buffer); for(i=0;i<800;i++){ schro_pack_encode_bit (pack, ref[i]); } schro_pack_flush(pack); schro_pack_free (pack); schro_unpack_init_with_data (&unpack, buffer->data, buffer->length, guard); for(i=0;i<800;i++){ x = schro_unpack_decode_bit (&unpack); if (x != ref[i]) { printf("test1 failed at bit %d\n", i); schro_unpack_dump(&unpack); return 0; } } for(i=0;i<100;i++){ x = schro_unpack_decode_bit (&unpack); if (x != guard) { printf("test1 failed at guard bit %d\n", i); schro_unpack_dump(&unpack); return 0; } } schro_buffer_unref (buffer); return 1; }