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; }
static void schro_decoder_decode_slice (SchroPicture *picture, SchroLowDelay *lowdelay, int slice_x, int slice_y, int offset, int slice_bytes) { SchroParams *params = &picture->params; SchroUnpack y_unpack; SchroUnpack uv_unpack; int quant_index; int base_index; int length_bits; int slice_y_length; int i; int j; int x,y; int value; schro_unpack_init_with_data (&y_unpack, OFFSET(picture->lowdelay_buffer->data, offset), slice_bytes, 1); base_index = schro_unpack_decode_bits (&y_unpack, 7); length_bits = ilog2up(8*slice_bytes); slice_y_length = schro_unpack_decode_bits (&y_unpack, length_bits); schro_unpack_copy (&uv_unpack, &y_unpack); schro_unpack_limit_bits_remaining (&y_unpack, slice_y_length); schro_unpack_skip_bits (&uv_unpack, slice_y_length); j = 0; for(i=0;i<1+3*params->transform_depth;i++) { int quant_factor; int quant_offset; int16_t *line; SchroFrameData block; schro_frame_data_get_codeblock (&block, lowdelay->luma_subbands + i, slice_x, slice_y, lowdelay->n_horiz_slices, lowdelay->n_vert_slices); quant_index = CLAMP(base_index - params->quant_matrix[i], 0, 60); quant_factor = schro_table_quant[quant_index]; quant_offset = schro_table_offset_1_2[quant_index]; for(y=0;y<block.height;y++){ line = OFFSET(block.data, block.stride * y); for (x=0; x<block.width; x++){ value = schro_unpack_decode_sint (&y_unpack); line[x] = schro_dequantise (value, quant_factor, quant_offset); } } } j = 0; for(i=0;i<1+3*params->transform_depth;i++) { int quant_factor; int quant_offset; int16_t *line1; int16_t *line2; SchroFrameData block1; SchroFrameData block2; schro_frame_data_get_codeblock (&block1, lowdelay->chroma1_subbands + i, slice_x, slice_y, lowdelay->n_horiz_slices, lowdelay->n_vert_slices); schro_frame_data_get_codeblock (&block2, lowdelay->chroma2_subbands + i, slice_x, slice_y, lowdelay->n_horiz_slices, lowdelay->n_vert_slices); quant_index = CLAMP(base_index - params->quant_matrix[i], 0, 60); quant_factor = schro_table_quant[quant_index]; quant_offset = schro_table_offset_1_2[quant_index]; for(y=0;y<block1.height;y++){ line1 = OFFSET(block1.data, block1.stride * y); line2 = OFFSET(block2.data, block2.stride * y); for (x=0; x<block1.width; x++){ value = schro_unpack_decode_sint (&uv_unpack); line1[x] = schro_dequantise (value, quant_factor, quant_offset); value = schro_unpack_decode_sint (&uv_unpack); line2[x] = schro_dequantise (value, quant_factor, quant_offset); } } } }
static void handle_packet (unsigned char *data, int size) { SchroUnpack unpack; const char *parse_code; int next; int prev; if (memcmp (data, "BBCD", 4) != 0) { printf("non-Dirac packet\n"); dump_hex (data, MIN(size, 100), " "); return; } switch (data[4]) { case SCHRO_PARSE_CODE_SEQUENCE_HEADER: parse_code = "access unit header"; break; case SCHRO_PARSE_CODE_AUXILIARY_DATA: parse_code = "auxiliary data"; break; case SCHRO_PARSE_CODE_INTRA_REF: parse_code = "intra ref"; break; case SCHRO_PARSE_CODE_INTRA_NON_REF: parse_code = "intra non-ref"; break; case SCHRO_PARSE_CODE_INTER_REF_1: parse_code = "inter ref 1"; break; case SCHRO_PARSE_CODE_INTER_REF_2: parse_code = "inter ref 2"; break; case SCHRO_PARSE_CODE_INTER_NON_REF_1: parse_code = "inter non-ref 1"; break; case SCHRO_PARSE_CODE_INTER_NON_REF_2: parse_code = "inter non-ref 2"; break; case SCHRO_PARSE_CODE_END_OF_SEQUENCE: parse_code = "end of sequence"; break; case SCHRO_PARSE_CODE_LD_INTRA_REF: parse_code = "low-delay intra ref"; break; case SCHRO_PARSE_CODE_LD_INTRA_NON_REF: parse_code = "low-delay intra non-ref"; break; case SCHRO_PARSE_CODE_INTRA_REF_NOARITH: parse_code = "intra ref noarith"; break; case SCHRO_PARSE_CODE_INTRA_NON_REF_NOARITH: parse_code = "intra non-ref noarith"; break; case SCHRO_PARSE_CODE_INTER_REF_1_NOARITH: parse_code = "inter ref 1 noarith"; break; case SCHRO_PARSE_CODE_INTER_REF_2_NOARITH: parse_code = "inter ref 2 noarith"; break; case SCHRO_PARSE_CODE_INTER_NON_REF_1_NOARITH: parse_code = "inter non-ref 1 noarith"; break; case SCHRO_PARSE_CODE_INTER_NON_REF_2_NOARITH: parse_code = "inter non-ref 2 noarith"; break; default: parse_code = "unknown"; break; } schro_unpack_init_with_data (&unpack, data + 5, size - 5, 1); next = schro_unpack_decode_bits (&unpack, 32); prev = schro_unpack_decode_bits (&unpack, 32); if (data[4] == SCHRO_PARSE_CODE_SEQUENCE_HEADER) { printf("AU\n"); printf("pictur: "); printf(" "); printf(" "); printf(" ref1 "); printf(" ref2 "); printf("retire "); printf(" size \n"); } else if (SCHRO_PARSE_CODE_IS_PICTURE(data[4])) { int num_refs = SCHRO_PARSE_CODE_NUM_REFS(data[4]); int pic_num; char ref_chars[3] = { 'I', 'P', 'B' }; schro_unpack_byte_sync(&unpack); pic_num = schro_unpack_decode_bits(&unpack, 32); printf("%6d: ", pic_num); if (SCHRO_PARSE_CODE_IS_REFERENCE(data[4])) { printf("ref "); } else { printf(" "); } printf("%c ", ref_chars[num_refs]); if (num_refs > 0) { printf("%6d ", pic_num + schro_unpack_decode_sint(&unpack)); } else { printf(" "); } if (num_refs > 1) { printf("%6d ", pic_num + schro_unpack_decode_sint(&unpack)); } else { printf(" "); } if (SCHRO_PARSE_CODE_IS_REFERENCE(data[4])) { int r = schro_unpack_decode_sint(&unpack); if (r == 0) { printf(" none "); } else { printf("%6d ", pic_num + r); } } else { printf(" "); } printf(" %8d\n", next); } else if (data[4] == SCHRO_PARSE_CODE_AUXILIARY_DATA) { } schro_unpack_byte_sync (&unpack); }