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 test4 (void) { SchroBuffer *buffer = schro_buffer_new_and_alloc (100); SchroPack *pack; SchroUnpack unpack; int i; int16_t x; int ok = 1; for(i=-1000;i<1000;i++){ pack = schro_pack_new (); schro_pack_encode_init (pack, buffer); schro_pack_encode_sint (pack, i); schro_pack_flush(pack); schro_pack_free (pack); schro_unpack_init_with_data (&unpack, buffer->data, buffer->length, 1); schro_unpack_decode_sint_s16 (&x, &unpack, 1); if (i != x) { printf("%d %d %c\n", i, x, (i==x)?' ':'x'); ok = 0; } } schro_buffer_unref (buffer); return ok; }
int test3 (void) { SchroBuffer *buffer = schro_buffer_new_and_alloc (1000); SchroPack *pack; SchroUnpack unpack; SchroUnpack unpack2; int i; int ref[100]; int x; int n_bytes; int n_bits = 0; int n_bits2 = 0; memset (buffer->data, 0, 1000); for(i=0;i<100;i++){ ref[i] = (rand()&0xff) - 128; } pack = schro_pack_new (); schro_pack_encode_init (pack, buffer); n_bits = 0; for(i=0;i<50;i++){ schro_pack_encode_sint (pack, ref[i]); n_bits += schro_pack_estimate_sint (ref[i]); } n_bits2 = 0; for(i=50;i<100;i++){ schro_pack_encode_sint (pack, ref[i]); n_bits2 += schro_pack_estimate_sint (ref[i]); } schro_pack_flush(pack); n_bytes = schro_pack_get_offset (pack); schro_pack_free (pack); schro_unpack_init_with_data (&unpack, buffer->data, n_bytes, 1); schro_unpack_copy (&unpack2, &unpack); schro_unpack_limit_bits_remaining (&unpack, n_bits); for(i=0;i<50;i++){ x = schro_unpack_decode_sint (&unpack); if (x != ref[i]) { SCHRO_ERROR("test3 failed at symbol %d (%d should be %d)", i, x, ref[i]); schro_unpack_dump(&unpack); return 0; } } for(i=0;i<10;i++){ x = schro_unpack_decode_sint (&unpack); if (x != 0) { SCHRO_ERROR("test3 failed at symbol %d (%d should be 0)", i, x); schro_unpack_dump(&unpack); return 0; } } schro_unpack_skip_bits (&unpack2, n_bits); schro_unpack_limit_bits_remaining (&unpack2, n_bits2); for(i=50;i<100;i++){ x = schro_unpack_decode_sint (&unpack2); if (x != ref[i]) { SCHRO_ERROR("test3 failed at symbol %d (%d should be %d)", i, x, ref[i]); schro_unpack_dump(&unpack2); return 0; } } for(i=0;i<10;i++){ x = schro_unpack_decode_sint (&unpack2); if (x != 0) { SCHRO_ERROR("test3 failed at symbol %d (%d should be 0)", i, x); schro_unpack_dump(&unpack2); return 0; } } schro_buffer_unref (buffer); return 1; }