|  | @@ -290,12 +290,12 @@ static av_cold int read_specific_config(ALSDecContext *ctx) | 
														
													
														
															
																|  |  | avctx->extradata_size * 8, 1); |  |  | avctx->extradata_size * 8, 1); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (config_offset < 0) |  |  | if (config_offset < 0) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | skip_bits_long(&gb, config_offset); |  |  | skip_bits_long(&gb, config_offset); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (get_bits_left(&gb) < (30 << 3)) |  |  | if (get_bits_left(&gb) < (30 << 3)) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // read the fixed items |  |  | // read the fixed items | 
														
													
														
															
																|  |  | als_id                      = get_bits_long(&gb, 32); |  |  | als_id                      = get_bits_long(&gb, 32); | 
														
													
												
													
														
															
																|  | @@ -330,7 +330,7 @@ static av_cold int read_specific_config(ALSDecContext *ctx) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // check for ALSSpecificConfig struct |  |  | // check for ALSSpecificConfig struct | 
														
													
														
															
																|  |  | if (als_id != MKBETAG('A','L','S','\0')) |  |  | if (als_id != MKBETAG('A','L','S','\0')) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | ctx->cur_frame_length = sconf->frame_length; |  |  | ctx->cur_frame_length = sconf->frame_length; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -345,7 +345,7 @@ static av_cold int read_specific_config(ALSDecContext *ctx) | 
														
													
														
															
																|  |  | int chan_pos_bits = av_ceil_log2(avctx->channels); |  |  | int chan_pos_bits = av_ceil_log2(avctx->channels); | 
														
													
														
															
																|  |  | int bits_needed  = avctx->channels * chan_pos_bits + 7; |  |  | int bits_needed  = avctx->channels * chan_pos_bits + 7; | 
														
													
														
															
																|  |  | if (get_bits_left(&gb) < bits_needed) |  |  | if (get_bits_left(&gb) < bits_needed) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!(sconf->chan_pos = av_malloc(avctx->channels * sizeof(*sconf->chan_pos)))) |  |  | if (!(sconf->chan_pos = av_malloc(avctx->channels * sizeof(*sconf->chan_pos)))) | 
														
													
														
															
																|  |  | return AVERROR(ENOMEM); |  |  | return AVERROR(ENOMEM); | 
														
													
												
													
														
															
																|  | @@ -363,7 +363,7 @@ static av_cold int read_specific_config(ALSDecContext *ctx) | 
														
													
														
															
																|  |  | // read fixed header and trailer sizes, |  |  | // read fixed header and trailer sizes, | 
														
													
														
															
																|  |  | // if size = 0xFFFFFFFF then there is no data field! |  |  | // if size = 0xFFFFFFFF then there is no data field! | 
														
													
														
															
																|  |  | if (get_bits_left(&gb) < 64) |  |  | if (get_bits_left(&gb) < 64) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | header_size  = get_bits_long(&gb, 32); |  |  | header_size  = get_bits_long(&gb, 32); | 
														
													
														
															
																|  |  | trailer_size = get_bits_long(&gb, 32); |  |  | trailer_size = get_bits_long(&gb, 32); | 
														
													
												
													
														
															
																|  | @@ -377,10 +377,10 @@ static av_cold int read_specific_config(ALSDecContext *ctx) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // skip the header and trailer data |  |  | // skip the header and trailer data | 
														
													
														
															
																|  |  | if (get_bits_left(&gb) < ht_size) |  |  | if (get_bits_left(&gb) < ht_size) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (ht_size > INT32_MAX) |  |  | if (ht_size > INT32_MAX) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_PATCHWELCOME; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | skip_bits_long(&gb, ht_size); |  |  | skip_bits_long(&gb, ht_size); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -388,7 +388,7 @@ static av_cold int read_specific_config(ALSDecContext *ctx) | 
														
													
														
															
																|  |  | // initialize CRC calculation |  |  | // initialize CRC calculation | 
														
													
														
															
																|  |  | if (sconf->crc_enabled) { |  |  | if (sconf->crc_enabled) { | 
														
													
														
															
																|  |  | if (get_bits_left(&gb) < 32) |  |  | if (get_bits_left(&gb) < 32) | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (avctx->err_recognition & AV_EF_CRCCHECK) { |  |  | if (avctx->err_recognition & AV_EF_CRCCHECK) { | 
														
													
														
															
																|  |  | ctx->crc_table = av_crc_get_table(AV_CRC_32_IEEE_LE); |  |  | ctx->crc_table = av_crc_get_table(AV_CRC_32_IEEE_LE); | 
														
													
												
													
														
															
																|  | @@ -629,7 +629,7 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd) | 
														
													
														
															
																|  |  | if (bd->block_length & (sub_blocks - 1)) { |  |  | if (bd->block_length & (sub_blocks - 1)) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_WARNING, |  |  | av_log(avctx, AV_LOG_WARNING, | 
														
													
														
															
																|  |  | "Block length is not evenly divisible by the number of subblocks.\n"); |  |  | "Block length is not evenly divisible by the number of subblocks.\n"); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | sb_length = bd->block_length >> log2_sub_blocks; |  |  | sb_length = bd->block_length >> log2_sub_blocks; | 
														
													
												
													
														
															
																|  | @@ -960,18 +960,18 @@ static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd) | 
														
													
														
															
																|  |  | */ |  |  | */ | 
														
													
														
															
																|  |  | static int read_block(ALSDecContext *ctx, ALSBlockData *bd) |  |  | static int read_block(ALSDecContext *ctx, ALSBlockData *bd) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  |  |  |  | int ret = 0; | 
														
													
														
															
																|  |  | GetBitContext *gb        = &ctx->gb; |  |  | GetBitContext *gb        = &ctx->gb; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | *bd->shift_lsbs = 0; |  |  | *bd->shift_lsbs = 0; | 
														
													
														
															
																|  |  | // read block type flag and read the samples accordingly |  |  | // read block type flag and read the samples accordingly | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { |  |  | if (get_bits1(gb)) { | 
														
													
														
															
																|  |  | if (read_var_block_data(ctx, bd)) |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = read_var_block_data(ctx, bd); | 
														
													
														
															
																|  |  | } else { |  |  | } else { | 
														
													
														
															
																|  |  | read_const_block_data(ctx, bd); |  |  | read_const_block_data(ctx, bd); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | return 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -980,12 +980,16 @@ static int read_block(ALSDecContext *ctx, ALSBlockData *bd) | 
														
													
														
															
																|  |  | static int decode_block(ALSDecContext *ctx, ALSBlockData *bd) |  |  | static int decode_block(ALSDecContext *ctx, ALSBlockData *bd) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | unsigned int smp; |  |  | unsigned int smp; | 
														
													
														
															
																|  |  |  |  |  | int ret = 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // read block type flag and read the samples accordingly |  |  | // read block type flag and read the samples accordingly | 
														
													
														
															
																|  |  | if (*bd->const_block) |  |  | if (*bd->const_block) | 
														
													
														
															
																|  |  | decode_const_block_data(ctx, bd); |  |  | decode_const_block_data(ctx, bd); | 
														
													
														
															
																|  |  | else if (decode_var_block_data(ctx, bd)) |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | else | 
														
													
														
															
																|  |  |  |  |  | ret = decode_var_block_data(ctx, bd); // always return 0 | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // TODO: read RLSLMS extension data |  |  | // TODO: read RLSLMS extension data | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1003,14 +1007,10 @@ static int read_decode_block(ALSDecContext *ctx, ALSBlockData *bd) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int ret; |  |  | int ret; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | ret = read_block(ctx, bd); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | if (ret) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((ret = read_block(ctx, bd)) < 0) | 
														
													
														
															
																|  |  | return ret; |  |  | return ret; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | ret = decode_block(ctx, bd); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | return ret; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return decode_block(ctx, bd); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1036,6 +1036,7 @@ static int decode_blocks_ind(ALSDecContext *ctx, unsigned int ra_frame, | 
														
													
														
															
																|  |  | unsigned int c, const unsigned int *div_blocks, |  |  | unsigned int c, const unsigned int *div_blocks, | 
														
													
														
															
																|  |  | unsigned int *js_blocks) |  |  | unsigned int *js_blocks) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  |  |  |  | int ret; | 
														
													
														
															
																|  |  | unsigned int b; |  |  | unsigned int b; | 
														
													
														
															
																|  |  | ALSBlockData bd = { 0 }; |  |  | ALSBlockData bd = { 0 }; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1056,10 +1057,10 @@ static int decode_blocks_ind(ALSDecContext *ctx, unsigned int ra_frame, | 
														
													
														
															
																|  |  | for (b = 0; b < ctx->num_blocks; b++) { |  |  | for (b = 0; b < ctx->num_blocks; b++) { | 
														
													
														
															
																|  |  | bd.block_length     = div_blocks[b]; |  |  | bd.block_length     = div_blocks[b]; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (read_decode_block(ctx, &bd)) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((ret = read_decode_block(ctx, &bd)) < 0) { | 
														
													
														
															
																|  |  | // damaged block, write zero for the rest of the frame |  |  | // damaged block, write zero for the rest of the frame | 
														
													
														
															
																|  |  | zero_remaining(b, ctx->num_blocks, div_blocks, bd.raw_samples); |  |  | zero_remaining(b, ctx->num_blocks, div_blocks, bd.raw_samples); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | bd.raw_samples += div_blocks[b]; |  |  | bd.raw_samples += div_blocks[b]; | 
														
													
														
															
																|  |  | bd.ra_block     = 0; |  |  | bd.ra_block     = 0; | 
														
													
												
													
														
															
																|  | @@ -1078,6 +1079,7 @@ static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame, | 
														
													
														
															
																|  |  | ALSSpecificConfig *sconf = &ctx->sconf; |  |  | ALSSpecificConfig *sconf = &ctx->sconf; | 
														
													
														
															
																|  |  | unsigned int offset = 0; |  |  | unsigned int offset = 0; | 
														
													
														
															
																|  |  | unsigned int b; |  |  | unsigned int b; | 
														
													
														
															
																|  |  |  |  |  | int ret; | 
														
													
														
															
																|  |  | ALSBlockData bd[2] = { { 0 } }; |  |  | ALSBlockData bd[2] = { { 0 } }; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | bd[0].ra_block         = ra_frame; |  |  | bd[0].ra_block         = ra_frame; | 
														
													
												
													
														
															
																|  | @@ -1119,12 +1121,9 @@ static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame, | 
														
													
														
															
																|  |  | bd[0].raw_other    = bd[1].raw_samples; |  |  | bd[0].raw_other    = bd[1].raw_samples; | 
														
													
														
															
																|  |  | bd[1].raw_other    = bd[0].raw_samples; |  |  | bd[1].raw_other    = bd[0].raw_samples; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if(read_decode_block(ctx, &bd[0]) || read_decode_block(ctx, &bd[1])) { |  |  |  | 
														
													
														
															
																|  |  | // damaged block, write zero for the rest of the frame |  |  |  | 
														
													
														
															
																|  |  | zero_remaining(b, ctx->num_blocks, div_blocks, bd[0].raw_samples); |  |  |  | 
														
													
														
															
																|  |  | zero_remaining(b, ctx->num_blocks, div_blocks, bd[1].raw_samples); |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((ret = read_decode_block(ctx, &bd[0])) < 0 || | 
														
													
														
															
																|  |  |  |  |  | (ret = read_decode_block(ctx, &bd[1])) < 0) | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // reconstruct joint-stereo blocks |  |  | // reconstruct joint-stereo blocks | 
														
													
														
															
																|  |  | if (bd[0].js_blocks) { |  |  | if (bd[0].js_blocks) { | 
														
													
												
													
														
															
																|  | @@ -1150,6 +1149,11 @@ static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame, | 
														
													
														
															
																|  |  | sizeof(*ctx->raw_samples[c]) * sconf->max_order); |  |  | sizeof(*ctx->raw_samples[c]) * sconf->max_order); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  |  |  |  | fail: | 
														
													
														
															
																|  |  |  |  |  | // damaged block, write zero for the rest of the frame | 
														
													
														
															
																|  |  |  |  |  | zero_remaining(b, ctx->num_blocks, div_blocks, bd[0].raw_samples); | 
														
													
														
															
																|  |  |  |  |  | zero_remaining(b, ctx->num_blocks, div_blocks, bd[1].raw_samples); | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | static inline int als_weighting(GetBitContext *gb, int k, int off) |  |  | static inline int als_weighting(GetBitContext *gb, int k, int off) | 
														
													
												
													
														
															
																|  | @@ -1173,7 +1177,7 @@ static int read_channel_data(ALSDecContext *ctx, ALSChannelData *cd, int c) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (current->master_channel >= channels) { |  |  | if (current->master_channel >= channels) { | 
														
													
														
															
																|  |  | av_log(ctx->avctx, AV_LOG_ERROR, "Invalid master channel!\n"); |  |  | av_log(ctx->avctx, AV_LOG_ERROR, "Invalid master channel!\n"); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (current->master_channel != c) { |  |  | if (current->master_channel != c) { | 
														
													
												
													
														
															
																|  | @@ -1198,7 +1202,7 @@ static int read_channel_data(ALSDecContext *ctx, ALSChannelData *cd, int c) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (entries == channels) { |  |  | if (entries == channels) { | 
														
													
														
															
																|  |  | av_log(ctx->avctx, AV_LOG_ERROR, "Damaged channel data!\n"); |  |  | av_log(ctx->avctx, AV_LOG_ERROR, "Damaged channel data!\n"); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | align_get_bits(gb); |  |  | align_get_bits(gb); | 
														
													
												
													
														
															
																|  | @@ -1230,7 +1234,7 @@ static int revert_channel_correlation(ALSDecContext *ctx, ALSBlockData *bd, | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (dep == channels) { |  |  | if (dep == channels) { | 
														
													
														
															
																|  |  | av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel correlation!\n"); |  |  | av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel correlation!\n"); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | bd->const_block = ctx->const_block + c; |  |  | bd->const_block = ctx->const_block + c; | 
														
													
												
													
														
															
																|  | @@ -1301,8 +1305,8 @@ static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame) | 
														
													
														
															
																|  |  | unsigned int div_blocks[32];                ///< block sizes. |  |  | unsigned int div_blocks[32];                ///< block sizes. | 
														
													
														
															
																|  |  | unsigned int c; |  |  | unsigned int c; | 
														
													
														
															
																|  |  | unsigned int js_blocks[2]; |  |  | unsigned int js_blocks[2]; | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | uint32_t bs_info = 0; |  |  | uint32_t bs_info = 0; | 
														
													
														
															
																|  |  |  |  |  | int ret; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // skip the size of the ra unit if present in the frame |  |  | // skip the size of the ra unit if present in the frame | 
														
													
														
															
																|  |  | if (sconf->ra_flag == RA_FLAG_FRAMES && ra_frame) |  |  | if (sconf->ra_flag == RA_FLAG_FRAMES && ra_frame) | 
														
													
												
													
														
															
																|  | @@ -1333,13 +1337,15 @@ static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame) | 
														
													
														
															
																|  |  | independent_bs = 1; |  |  | independent_bs = 1; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (independent_bs) { |  |  | if (independent_bs) { | 
														
													
														
															
																|  |  | if (decode_blocks_ind(ctx, ra_frame, c, div_blocks, js_blocks)) |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = decode_blocks_ind(ctx, ra_frame, c, | 
														
													
														
															
																|  |  |  |  |  | div_blocks, js_blocks); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | independent_bs--; |  |  | independent_bs--; | 
														
													
														
															
																|  |  | } else { |  |  | } else { | 
														
													
														
															
																|  |  | if (decode_blocks(ctx, ra_frame, c, div_blocks, js_blocks)) |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = decode_blocks(ctx, ra_frame, c, div_blocks, js_blocks); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | c++; |  |  | c++; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -1358,7 +1364,7 @@ static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame) | 
														
													
														
															
																|  |  | for (c = 0; c < avctx->channels; c++) |  |  | for (c = 0; c < avctx->channels; c++) | 
														
													
														
															
																|  |  | if (ctx->chan_data[c] < ctx->chan_data_buffer) { |  |  | if (ctx->chan_data[c] < ctx->chan_data_buffer) { | 
														
													
														
															
																|  |  | av_log(ctx->avctx, AV_LOG_ERROR, "Invalid channel data!\n"); |  |  | av_log(ctx->avctx, AV_LOG_ERROR, "Invalid channel data!\n"); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | memset(reverted_channels, 0, sizeof(*reverted_channels) * avctx->channels); |  |  | memset(reverted_channels, 0, sizeof(*reverted_channels) * avctx->channels); | 
														
													
												
													
														
															
																|  | @@ -1390,11 +1396,12 @@ static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame) | 
														
													
														
															
																|  |  | return ret; |  |  | return ret; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (c = 0; c < avctx->channels; c++) |  |  |  | 
														
													
														
															
																|  |  | if (revert_channel_correlation(ctx, &bd, ctx->chan_data, |  |  |  | 
														
													
														
															
																|  |  | reverted_channels, offset, c)) |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  |  |  |  | for (c = 0; c < avctx->channels; c++) { | 
														
													
														
															
																|  |  |  |  |  | ret = revert_channel_correlation(ctx, &bd, ctx->chan_data, | 
														
													
														
															
																|  |  |  |  |  | reverted_channels, offset, c); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | for (c = 0; c < avctx->channels; c++) { |  |  | for (c = 0; c < avctx->channels; c++) { | 
														
													
														
															
																|  |  | bd.const_block = ctx->const_block + c; |  |  | bd.const_block = ctx->const_block + c; | 
														
													
														
															
																|  |  | bd.shift_lsbs  = ctx->shift_lsbs + c; |  |  | bd.shift_lsbs  = ctx->shift_lsbs + c; | 
														
													
												
													
														
															
																|  | @@ -1591,30 +1598,30 @@ static av_cold int decode_init(AVCodecContext *avctx) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | unsigned int c; |  |  | unsigned int c; | 
														
													
														
															
																|  |  | unsigned int channel_size; |  |  | unsigned int channel_size; | 
														
													
														
															
																|  |  | int num_buffers; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | int num_buffers, ret; | 
														
													
														
															
																|  |  | ALSDecContext *ctx = avctx->priv_data; |  |  | ALSDecContext *ctx = avctx->priv_data; | 
														
													
														
															
																|  |  | ALSSpecificConfig *sconf = &ctx->sconf; |  |  | ALSSpecificConfig *sconf = &ctx->sconf; | 
														
													
														
															
																|  |  | ctx->avctx = avctx; |  |  | ctx->avctx = avctx; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!avctx->extradata) { |  |  | if (!avctx->extradata) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Missing required ALS extradata.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Missing required ALS extradata.\n"); | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return AVERROR_INVALIDDATA; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (read_specific_config(ctx)) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((ret = read_specific_config(ctx)) < 0) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Reading ALSSpecificConfig failed.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Reading ALSSpecificConfig failed.\n"); | 
														
													
														
															
																|  |  | decode_end(avctx); |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (check_specific_config(ctx)) { |  |  |  | 
														
													
														
															
																|  |  | decode_end(avctx); |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((ret = check_specific_config(ctx)) < 0) { | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (sconf->bgmc) |  |  |  | 
														
													
														
															
																|  |  | ff_bgmc_init(avctx, &ctx->bgmc_lut, &ctx->bgmc_lut_status); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (sconf->bgmc) { | 
														
													
														
															
																|  |  |  |  |  | ret = ff_bgmc_init(avctx, &ctx->bgmc_lut, &ctx->bgmc_lut_status); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | if (sconf->floating) { |  |  | if (sconf->floating) { | 
														
													
														
															
																|  |  | avctx->sample_fmt          = AV_SAMPLE_FMT_FLT; |  |  | avctx->sample_fmt          = AV_SAMPLE_FMT_FLT; | 
														
													
														
															
																|  |  | avctx->bits_per_raw_sample = 32; |  |  | avctx->bits_per_raw_sample = 32; | 
														
													
												
													
														
															
																|  | @@ -1649,7 +1656,8 @@ static av_cold int decode_init(AVCodecContext *avctx) | 
														
													
														
															
																|  |  | !ctx->quant_cof_buffer       || !ctx->lpc_cof_buffer || |  |  | !ctx->quant_cof_buffer       || !ctx->lpc_cof_buffer || | 
														
													
														
															
																|  |  | !ctx->lpc_cof_reversed_buffer) { |  |  | !ctx->lpc_cof_reversed_buffer) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | 
														
													
														
															
																|  |  | return AVERROR(ENOMEM); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // assign quantized parcor coefficient buffers |  |  | // assign quantized parcor coefficient buffers | 
														
													
												
													
														
															
																|  | @@ -1674,8 +1682,8 @@ static av_cold int decode_init(AVCodecContext *avctx) | 
														
													
														
															
																|  |  | !ctx->use_ltp  || !ctx->ltp_lag || |  |  | !ctx->use_ltp  || !ctx->ltp_lag || | 
														
													
														
															
																|  |  | !ctx->ltp_gain || !ctx->ltp_gain_buffer) { |  |  | !ctx->ltp_gain || !ctx->ltp_gain_buffer) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | 
														
													
														
															
																|  |  | decode_end(avctx); |  |  |  | 
														
													
														
															
																|  |  | return AVERROR(ENOMEM); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (c = 0; c < num_buffers; c++) |  |  | for (c = 0; c < num_buffers; c++) | 
														
													
												
													
														
															
																|  | @@ -1692,8 +1700,8 @@ static av_cold int decode_init(AVCodecContext *avctx) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!ctx->chan_data_buffer || !ctx->chan_data || !ctx->reverted_channels) { |  |  | if (!ctx->chan_data_buffer || !ctx->chan_data || !ctx->reverted_channels) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | 
														
													
														
															
																|  |  | decode_end(avctx); |  |  |  | 
														
													
														
															
																|  |  | return AVERROR(ENOMEM); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (c = 0; c < num_buffers; c++) |  |  | for (c = 0; c < num_buffers; c++) | 
														
													
												
													
														
															
																|  | @@ -1713,8 +1721,8 @@ static av_cold int decode_init(AVCodecContext *avctx) | 
														
													
														
															
																|  |  | // allocate previous raw sample buffer |  |  | // allocate previous raw sample buffer | 
														
													
														
															
																|  |  | if (!ctx->prev_raw_samples || !ctx->raw_buffer|| !ctx->raw_samples) { |  |  | if (!ctx->prev_raw_samples || !ctx->raw_buffer|| !ctx->raw_samples) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | 
														
													
														
															
																|  |  | decode_end(avctx); |  |  |  | 
														
													
														
															
																|  |  | return AVERROR(ENOMEM); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // assign raw samples buffers |  |  | // assign raw samples buffers | 
														
													
												
													
														
															
																|  | @@ -1731,14 +1739,18 @@ static av_cold int decode_init(AVCodecContext *avctx) | 
														
													
														
															
																|  |  | av_get_bytes_per_sample(avctx->sample_fmt)); |  |  | av_get_bytes_per_sample(avctx->sample_fmt)); | 
														
													
														
															
																|  |  | if (!ctx->crc_buffer) { |  |  | if (!ctx->crc_buffer) { | 
														
													
														
															
																|  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); |  |  | av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | 
														
													
														
															
																|  |  | decode_end(avctx); |  |  |  | 
														
													
														
															
																|  |  | return AVERROR(ENOMEM); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ret = AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | goto fail; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | ff_dsputil_init(&ctx->dsp, avctx); |  |  | ff_dsputil_init(&ctx->dsp, avctx); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | fail: | 
														
													
														
															
																|  |  |  |  |  | decode_end(avctx); | 
														
													
														
															
																|  |  |  |  |  | return ret; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | 
 |