summaryrefslogtreecommitdiff
path: root/libavcodec/wmalosslessdec.c
diff options
context:
space:
mode:
authorMashiat Sarker Shakkhar <shahriman_ams@yahoo.com>2011-11-12 16:03:54 +0600
committerMashiat Sarker Shakkhar <shahriman_ams@yahoo.com>2011-11-20 14:51:40 +0600
commit3e4901b24e26d795edcb694a4730791476c50297 (patch)
treef61d9c15c93c4fe0a475a9e7e3fea21b76f0034c /libavcodec/wmalosslessdec.c
parent3f3d2b5f65b7d803cb1c2fef41b99a7b17e87117 (diff)
Store transient state and position of transient area
Diffstat (limited to 'libavcodec/wmalosslessdec.c')
-rw-r--r--libavcodec/wmalosslessdec.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c
index 7aab5eebb7..39cb27eeee 100644
--- a/libavcodec/wmalosslessdec.c
+++ b/libavcodec/wmalosslessdec.c
@@ -139,6 +139,7 @@ typedef struct {
float* coeffs; ///< pointer to the subframe decode buffer
uint16_t num_vec_coeffs; ///< number of vector coded coefficients
DECLARE_ALIGNED(16, float, out)[WMALL_BLOCK_MAX_SIZE + WMALL_BLOCK_MAX_SIZE / 2]; ///< output buffer
+ int transient_counter; ///< number of transient samples from the beginning of transient zone
} WmallChannelCtx;
/**
@@ -660,9 +661,15 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
int i = 0;
unsigned int ave_mean;
s->transient[ch] = get_bits1(&s->gb);
- if(s->transient[ch])
- s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size));
-
+ if(s->transient[ch]) {
+ s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size));
+ if (s->transient_pos[ch])
+ s->transient[ch] = 0;
+ s->channel[ch].transient_counter =
+ FFMAX(s->channel[ch].transient_counter, s->samples_per_frame / 2);
+ } else if (s->channel[ch].transient_counter)
+ s->transient[ch] = 1;
+
if(s->seekable_tile) {
ave_mean = get_bits(&s->gb, s->bits_per_sample);
s->ave_sum[ch] = ave_mean << (s->movave_scaling + 1);
@@ -753,9 +760,14 @@ static void reset_codec(WmallDecodeCtx *s)
{
int ich, ilms;
s->mclms_recent = s->mclms_order * s->num_channels;
- for (ich = 0; ich < s->num_channels; ich++)
+ for (ich = 0; ich < s->num_channels; ich++) {
for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++)
s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order;
+ /* first sample of a seekable subframe is considered as the starting of
+ a transient area which is samples_per_frame samples long */
+ s->channel[ich].transient_counter = s->samples_per_frame;
+ s->transient[ich] = 1;
+ }
}