| 
																	
																	
																		
																	
																	
																 | 
																@@ -426,9 +426,8 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp, | 
															
														
														
													
														
															
																 | 
																 | 
																        cp->huff_lsbs        = 24; | 
																 | 
																 | 
																        cp->huff_lsbs        = 24; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (substr == m->max_decoded_substream) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if (substr == m->max_decoded_substream) | 
															
														
														
													
														
															
																 | 
																 | 
																        m->avctx->channels = s->max_matrix_channel + 1; | 
																 | 
																 | 
																        m->avctx->channels = s->max_matrix_channel + 1; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    return 0; | 
																 | 
																 | 
																    return 0; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -624,8 +623,8 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp, | 
															
														
														
													
														
															
																 | 
																 | 
																    unsigned int ch; | 
																 | 
																 | 
																    unsigned int ch; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_PRESENCE) | 
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_PRESENCE) | 
															
														
														
													
														
															
																 | 
																 | 
																    if (get_bits1(gbp)) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        s->param_presence_flags = get_bits(gbp, 8); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (get_bits1(gbp)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            s->param_presence_flags = get_bits(gbp, 8); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_BLOCKSIZE) | 
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_BLOCKSIZE) | 
															
														
														
													
														
															
																 | 
																 | 
																        if (get_bits1(gbp)) { | 
																 | 
																 | 
																        if (get_bits1(gbp)) { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -638,16 +637,14 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp, | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_MATRIX) | 
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_MATRIX) | 
															
														
														
													
														
															
																 | 
																 | 
																        if (get_bits1(gbp)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (get_bits1(gbp)) | 
															
														
														
													
														
															
																 | 
																 | 
																            if (read_matrix_params(m, substr, gbp) < 0) | 
																 | 
																 | 
																            if (read_matrix_params(m, substr, gbp) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                return -1; | 
																 | 
																 | 
																                return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_OUTSHIFT) | 
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_OUTSHIFT) | 
															
														
														
													
														
															
																 | 
																 | 
																        if (get_bits1(gbp)) | 
																 | 
																 | 
																        if (get_bits1(gbp)) | 
															
														
														
													
														
															
																 | 
																 | 
																            for (ch = 0; ch <= s->max_matrix_channel; ch++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            for (ch = 0; ch <= s->max_matrix_channel; ch++) | 
															
														
														
													
														
															
																 | 
																 | 
																                s->output_shift[ch] = get_sbits(gbp, 4); | 
																 | 
																 | 
																                s->output_shift[ch] = get_sbits(gbp, 4); | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_QUANTSTEP) | 
																 | 
																 | 
																    if (s->param_presence_flags & PARAM_QUANTSTEP) | 
															
														
														
													
														
															
																 | 
																 | 
																        if (get_bits1(gbp)) | 
																 | 
																 | 
																        if (get_bits1(gbp)) | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -660,10 +657,9 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp, | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    for (ch = s->min_channel; ch <= s->max_channel; ch++) | 
																 | 
																 | 
																    for (ch = s->min_channel; ch <= s->max_channel; ch++) | 
															
														
														
													
														
															
																 | 
																 | 
																        if (get_bits1(gbp)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (get_bits1(gbp)) | 
															
														
														
													
														
															
																 | 
																 | 
																            if (read_channel_params(m, substr, gbp, ch) < 0) | 
																 | 
																 | 
																            if (read_channel_params(m, substr, gbp, ch) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                return -1; | 
																 | 
																 | 
																                return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    return 0; | 
																 | 
																 | 
																    return 0; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -740,14 +736,12 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp, | 
															
														
														
													
														
															
																 | 
																 | 
																    memset(&m->bypassed_lsbs[s->blockpos][0], 0, | 
																 | 
																 | 
																    memset(&m->bypassed_lsbs[s->blockpos][0], 0, | 
															
														
														
													
														
															
																 | 
																 | 
																           s->blocksize * sizeof(m->bypassed_lsbs[0])); | 
																 | 
																 | 
																           s->blocksize * sizeof(m->bypassed_lsbs[0])); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    for (i = 0; i < s->blocksize; i++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    for (i = 0; i < s->blocksize; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																        if (read_huff_channels(m, gbp, substr, i) < 0) | 
																 | 
																 | 
																        if (read_huff_channels(m, gbp, substr, i) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																            return -1; | 
																 | 
																 | 
																            return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    for (ch = s->min_channel; ch <= s->max_channel; ch++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    for (ch = s->min_channel; ch <= s->max_channel; ch++) | 
															
														
														
													
														
															
																 | 
																 | 
																        filter_channel(m, substr, ch); | 
																 | 
																 | 
																        filter_channel(m, substr, ch); | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    s->blockpos += s->blocksize; | 
																 | 
																 | 
																    s->blockpos += s->blocksize; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -857,17 +851,18 @@ static void rematrix_channels(MLPDecodeContext *m, unsigned int substr) | 
															
														
														
													
														
															
																 | 
																 | 
																        for (i = 0; i < s->blockpos; i++) { | 
																 | 
																 | 
																        for (i = 0; i < s->blockpos; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																            int32_t *samples = m->sample_buffer[i]; | 
																 | 
																 | 
																            int32_t *samples = m->sample_buffer[i]; | 
															
														
														
													
														
															
																 | 
																 | 
																            int64_t accum = 0; | 
																 | 
																 | 
																            int64_t accum = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																            for (src_ch = 0; src_ch <= maxchan; src_ch++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                accum += (int64_t)samples[src_ch] | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                                  * coeffs[src_ch]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            for (src_ch = 0; src_ch <= maxchan; src_ch++) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                accum += (int64_t) samples[src_ch] * coeffs[src_ch]; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            if (matrix_noise_shift) { | 
																 | 
																 | 
																            if (matrix_noise_shift) { | 
															
														
														
													
														
															
																 | 
																 | 
																                index &= m->access_unit_size_pow2 - 1; | 
																 | 
																 | 
																                index &= m->access_unit_size_pow2 - 1; | 
															
														
														
													
														
															
																 | 
																 | 
																                accum += m->noise_buffer[index] << (matrix_noise_shift + 7); | 
																 | 
																 | 
																                accum += m->noise_buffer[index] << (matrix_noise_shift + 7); | 
															
														
														
													
														
															
																 | 
																 | 
																                index += index2; | 
																 | 
																 | 
																                index += index2; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																            samples[dest_ch] = ((accum >> 14) & mask) | 
																 | 
																 | 
																            samples[dest_ch] = ((accum >> 14) & mask) | 
															
														
														
													
														
															
																 | 
																 | 
																                                             + m->bypassed_lsbs[i][mat]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                             + m->bypassed_lsbs[i][mat]; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -1033,17 +1028,14 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size, | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->restart_seen = 1; | 
																 | 
																 | 
																                    s->restart_seen = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																                if (!s->restart_seen) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                if (!s->restart_seen) | 
															
														
														
													
														
															
																 | 
																 | 
																                    goto next_substr; | 
																 | 
																 | 
																                    goto next_substr; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                if (read_decoding_params(m, &gb, substr) < 0) | 
																 | 
																 | 
																                if (read_decoding_params(m, &gb, substr) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                    goto next_substr; | 
																 | 
																 | 
																                    goto next_substr; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																            if (!s->restart_seen) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (!s->restart_seen) | 
															
														
														
													
														
															
																 | 
																 | 
																                goto next_substr; | 
																 | 
																 | 
																                goto next_substr; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																            if (read_block_data(m, &gb, substr) < 0) | 
																 | 
																 | 
																            if (read_block_data(m, &gb, substr) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                return -1; | 
																 | 
																 | 
																                return -1; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1054,6 +1046,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size, | 
															
														
														
													
														
															
																 | 
																 | 
																        } while (!get_bits1(&gb)); | 
																 | 
																 | 
																        } while (!get_bits1(&gb)); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        skip_bits(&gb, (-get_bits_count(&gb)) & 15); | 
																 | 
																 | 
																        skip_bits(&gb, (-get_bits_count(&gb)) & 15); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        if (substream_data_len[substr] * 8 - get_bits_count(&gb) >= 32) { | 
																 | 
																 | 
																        if (substream_data_len[substr] * 8 - get_bits_count(&gb) >= 32) { | 
															
														
														
													
														
															
																 | 
																 | 
																            int shorten_by; | 
																 | 
																 | 
																            int shorten_by; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1069,6 +1062,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size, | 
															
														
														
													
														
															
																 | 
																 | 
																            if (substr == m->max_decoded_substream) | 
																 | 
																 | 
																            if (substr == m->max_decoded_substream) | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(m->avctx, AV_LOG_INFO, "End of stream indicated.\n"); | 
																 | 
																 | 
																                av_log(m->avctx, AV_LOG_INFO, "End of stream indicated.\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        if (substream_parity_present[substr]) { | 
																 | 
																 | 
																        if (substream_parity_present[substr]) { | 
															
														
														
													
														
															
																 | 
																 | 
																            uint8_t parity, checksum; | 
																 | 
																 | 
																            uint8_t parity, checksum; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1083,15 +1077,14 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size, | 
															
														
														
													
														
															
																 | 
																 | 
																            if ( get_bits(&gb, 8)           != checksum) | 
																 | 
																 | 
																            if ( get_bits(&gb, 8)           != checksum) | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(m->avctx, AV_LOG_ERROR, "Substream %d checksum failed.\n"    , substr); | 
																 | 
																 | 
																                av_log(m->avctx, AV_LOG_ERROR, "Substream %d checksum failed.\n"    , substr); | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        if (substream_data_len[substr] * 8 != get_bits_count(&gb)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (substream_data_len[substr] * 8 != get_bits_count(&gb)) | 
															
														
														
													
														
															
																 | 
																 | 
																            goto substream_length_mismatch; | 
																 | 
																 | 
																            goto substream_length_mismatch; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																next_substr: | 
																 | 
																 | 
																next_substr: | 
															
														
														
													
														
															
																 | 
																 | 
																        if (!s->restart_seen) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (!s->restart_seen) | 
															
														
														
													
														
															
																 | 
																 | 
																            av_log(m->avctx, AV_LOG_ERROR, | 
																 | 
																 | 
																            av_log(m->avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																                   "No restart header present in substream %d.\n", substr); | 
																 | 
																 | 
																                   "No restart header present in substream %d.\n", substr); | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        buf += substream_data_len[substr]; | 
																 | 
																 | 
																        buf += substream_data_len[substr]; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																	
																 | 
																
  |