X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fwmalosslessdec.c;h=56e9aad399ca27f04c2483799e6ae1e8340d721d;hb=97cfa55eea39cef30abe14682c56c1e4e7f6f10d;hp=e86cf6004ed086ec4f0ab3d9094a8f146db20b73;hpb=07933b44dd72cdc5df34a66991cc0f0386614720;p=ffmpeg diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index e86cf6004ed..56e9aad399c 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -22,6 +22,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/attributes.h" #include "avcodec.h" #include "internal.h" #include "get_bits.h" @@ -654,9 +655,9 @@ static void mclms_predict(WmallDecodeCtx *s, int icoef, int *pred) int num_channels = s->num_channels; for (ich = 0; ich < num_channels; ich++) { + pred[ich] = 0; if (!s->is_channel_coded[ich]) continue; - pred[ich] = 0; for (i = 0; i < order * num_channels; i++) pred[ich] += s->mclms_prevvalues[i + s->mclms_recent] * s->mclms_coeffs[i + order * num_channels * ich]; @@ -789,7 +790,7 @@ static void revert_inter_ch_decorr(WmallDecodeCtx *s, int tile_size) { if (s->num_channels != 2) return; - else if (s->is_channel_coded[0] && s->is_channel_coded[1]) { + else if (s->is_channel_coded[0] || s->is_channel_coded[1]) { int icoef; for (icoef = 0; icoef < tile_size; icoef++) { s->channel_residues[0][icoef] -= s->channel_residues[1][icoef] >> 1; @@ -955,6 +956,8 @@ static int decode_subframe(WmallDecodeCtx *s) else use_normal_update_speed(s, i); revert_cdlms(s, i, 0, subframe_len); + } else { + memset(s->channel_residues[i], 0, sizeof(**s->channel_residues) * subframe_len); } } if (s->do_mclms) @@ -977,10 +980,10 @@ static int decode_subframe(WmallDecodeCtx *s) for (j = 0; j < subframe_len; j++) { if (s->bits_per_sample == 16) { - *s->samples_16[c] = (int16_t) s->channel_residues[c][j]; + *s->samples_16[c] = (int16_t) s->channel_residues[c][j] << padding_zeroes; s->samples_16[c] += s->num_channels; } else { - *s->samples_32[c] = s->channel_residues[c][j]; + *s->samples_32[c] = s->channel_residues[c][j] << padding_zeroes; s->samples_32[c] += s->num_channels; } } @@ -1039,7 +1042,7 @@ static int decode_frame(WmallDecodeCtx *s) /* no idea what these are for, might be the number of samples that need to be skipped at the beginning or end of a stream */ if (get_bits1(gb)) { - int skip; + int av_unused skip; /* usually true for the first frame */ if (get_bits1(gb)) { @@ -1164,8 +1167,9 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, GetBitContext* gb = &s->pgb; const uint8_t* buf = avpkt->data; int buf_size = avpkt->size; - int num_bits_prev_frame, packet_sequence_number, - seekable_frame_in_packet, spliced_packet; + int num_bits_prev_frame, packet_sequence_number, spliced_packet; + + s->frame.nb_samples = 0; if (s->packet_done || s->packet_loss) { s->packet_done = 0; @@ -1180,9 +1184,11 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, /* parse packet header */ init_get_bits(gb, buf, s->buf_bit_size); - packet_sequence_number = get_bits(gb, 4); - seekable_frame_in_packet = get_bits1(gb); - spliced_packet = get_bits1(gb); + packet_sequence_number = get_bits(gb, 4); + skip_bits(gb, 1); // Skip seekable_frame_in_packet, currently ununused + spliced_packet = get_bits1(gb); + if (spliced_packet) + av_log_missing_feature(avctx, "Bitstream splicing", 1); /* get number of bits that need to be added to the previous frame */ num_bits_prev_frame = get_bits(gb, s->log2_frame_size); @@ -1208,7 +1214,7 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, save_bits(s, gb, num_bits_prev_frame, 1); /* decode the cross packet frame if it is valid */ - if (!s->packet_loss) + if (num_bits_prev_frame < remaining_packet_bits && !s->packet_loss) decode_frame(s); } else if (s->num_saved_bits - s->frame_offset) { av_dlog(avctx, "ignoring %x previously saved bits\n", @@ -1277,7 +1283,7 @@ static void flush(AVCodecContext *avctx) AVCodec ff_wmalossless_decoder = { .name = "wmalossless", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_WMALOSSLESS, + .id = AV_CODEC_ID_WMALOSSLESS, .priv_data_size = sizeof(WmallDecodeCtx), .init = decode_init, .decode = decode_packet,