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); }