Merge remote-tracking branch 'shariman/wmall'

* shariman/wmall: (24 commits)
  Clean-up
  dump_int_buffer() to dump samples from a buffer
  Implement revert_cdlms()
  Doxy for reset_codec()
  Store transient state and position of transient area
  Implement use_high_update_speed() and use_normal_update_speed()
  Initialize num_logged_tiles and remove unnecessary codes
  Log index for each line of output
  Log tile size
  Output decoded residues
  Replace placeholders with actual calls to clear_codec_buffers() and reset_codec()
  Implement lms_update()
  Implement lms_predict()
  Implement reset_codec()
  Add missing syntax elements to WmallDecodeCtx
  Add .recent syntax element to cdlms struct
  Implement clear_codec_buffers()
  Add buffers to context necessary for reverting cdmls and mclms filter
  Use avpriv_copy_bits() instead of ff_copy_bits()
  Cosmetics
  ...

Conflicts:
	libavcodec/wmalosslessdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
pull/2/head
Michael Niedermayer 13 years ago
commit 34465bbcb4
  1. 2
      configure
  2. 99
      libavcodec/wmalosslessdec.c
  3. 1
      libavformat/Makefile

2
configure vendored

@ -1596,6 +1596,8 @@ x11_grab_device_indev_extralibs="-lX11 -lXext -lXfixes"
# protocols
gopher_protocol_deps="network"
httpproxy_protocol_deps="network"
httpproxy_protocol_select="tcp_protocol"
http_protocol_deps="network"
http_protocol_select="tcp_protocol"
https_protocol_select="tls_protocol"

@ -139,11 +139,9 @@ 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;
/* XXX: probably we don't need subframe_config[],
WmallChannelCtx holds all the necessary data. */
/**
* @brief channel group for channel transformations
*/
@ -310,6 +308,19 @@ static void av_cold dump_context(WmallDecodeCtx *s)
PRINT("num channels", s->num_channels);
}
static int dump_int_buffer(int *buffer, int length, int delimiter)
{
int i;
for (i=0 ; i<length ; i++) {
if (!(i%delimiter))
av_log(0, 0, "\n[%d] ", i);
av_log(0, 0, "%d, ", buffer[i]);
}
av_log(0, 0, "\n");
}
/**
*@brief Uninitialize the decoder and free all resources.
*@param avctx codec context
@ -434,8 +445,8 @@ static int decode_subframe_length(WmallDecodeCtx *s, int offset)
if (offset == s->samples_per_frame - s->min_samples_per_subframe)
return s->min_samples_per_subframe;
len = av_log2(s->max_num_subframes - 1) + 1; // XXX: 5.3.3
frame_len_ratio = get_bits(&s->gb, len); // XXX: tile_size_ratio
len = av_log2(s->max_num_subframes - 1) + 1;
frame_len_ratio = get_bits(&s->gb, len);
subframe_len = s->min_samples_per_subframe * (frame_len_ratio + 1);
@ -469,7 +480,7 @@ static int decode_subframe_length(WmallDecodeCtx *s, int offset)
*@param s context
*@return 0 on success, < 0 in case of an error
*/
static int decode_tilehdr(WmallDecodeCtx *s) /* XXX: decode_tile_configuration() [Table 9] */
static int decode_tilehdr(WmallDecodeCtx *s)
{
uint16_t num_samples[WMALL_MAX_CHANNELS]; /**< sum of samples for all currently known subframes of a channel */
uint8_t contains_subframe[WMALL_MAX_CHANNELS]; /**< flag indicating if a channel contains the current subframe */
@ -490,8 +501,8 @@ static int decode_tilehdr(WmallDecodeCtx *s) /* XXX: decode_tile_configur
memset(num_samples, 0, sizeof(num_samples));
if (s->max_num_subframes == 1 || get_bits1(&s->gb)) // XXX: locate in the spec
fixed_channel_layout = 1; // XXX: tile_aligned ?
if (s->max_num_subframes == 1 || get_bits1(&s->gb))
fixed_channel_layout = 1;
/** loop until the frame data is split between the subframes */
do {
@ -505,14 +516,14 @@ static int decode_tilehdr(WmallDecodeCtx *s) /* XXX: decode_tile_configur
contains_subframe[c] = 1;
}
else {
contains_subframe[c] = get_bits1(&s->gb); // XXX: locate in the spec
contains_subframe[c] = get_bits1(&s->gb);
}
} else
contains_subframe[c] = 0;
}
/** get subframe length, subframe_len == 0 is not allowed */
if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0) //XXX: this reads tile_size_ratio
if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0)
return AVERROR_INVALIDDATA;
/** add subframes to the individual channels and find new min_channel_len */
min_channel_len += subframe_len;
@ -663,8 +674,14 @@ 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])
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);
@ -679,7 +696,7 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
s->channel_residues[ch][0] = get_sbits(&s->gb, s->bits_per_sample);
i++;
}
av_log(0, 0, "%8d: ", num_logged_tiles++);
//av_log(0, 0, "%8d: ", num_logged_tiles++);
for(; i < tile_size; i++) {
int quo = 0, rem, rem_bits, residue;
while(get_bits1(&s->gb))
@ -700,11 +717,10 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
residue = residue >> 1;
s->channel_residues[ch][i] = residue;
//if (num_logged_tiles < 1)
av_log(0, 0, "%4d ", residue);
// dprintf(s->avctx, "%5d: %5d %10d %12d %12d %5d %-16d %04x\n",i, quo, ave_mean, s->ave_sum[ch], rem, rem_bits, s->channel_residues[ch][i], show_bits(&s->gb, 16));
/*if (num_logged_tiles < 1)
av_log(0, 0, "%4d ", residue); */
}
av_log(0, 0, "\n Tile size = %d\n", tile_size);
dump_int_buffer(s->channel_residues[ch], tile_size, 16);
return 0;
@ -752,13 +768,21 @@ static void clear_codec_buffers(WmallDecodeCtx *s)
}
}
/**
*@brief Resets filter parameters and transient area at new seekable tile
*/
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;
}
}
@ -861,6 +885,39 @@ static void use_normal_update_speed(WmallDecodeCtx *s, int ich)
}
}
static void revert_cdlms(WmallDecodeCtx *s, int tile_size)
{
int icoef, ich;
int32_t pred, channel_coeff;
int ilms, num_lms;
for (ich = 0; ich < s->num_channels; ich++) {
if (!s->is_channel_coded[ich])
continue;
for (icoef = 0; icoef < tile_size; icoef++) {
num_lms = s->cdlms_ttl[ich];
channel_coeff = s->channel_residues[ich][icoef];
if (icoef == s->transient_pos[ich]) {
s->transient[ich] = 1;
use_high_update_speed(s, ich);
}
for (ilms = num_lms; ilms >= 0; ilms--) {
pred = lms_predict(s, ich, ilms);
channel_coeff += pred;
lms_update(s, ich, ilms, channel_coeff, pred);
}
if (s->transient[ich]) {
--s->channel[ich].transient_counter;
if(!s->channel[ich].transient_counter)
use_normal_update_speed(s, ich);
}
s->channel_coeffs[ich][icoef] = channel_coeff;
}
}
}
/**
*@brief Decode a single subframe (block).
*@param s codec context
@ -996,7 +1053,7 @@ static int decode_subframe(WmallDecodeCtx *s)
av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
return AVERROR_INVALIDDATA;
}
++s->channel[c].cur_subframe; // XXX: 6.4
++s->channel[c].cur_subframe;
}
return 0;
}
@ -1025,17 +1082,17 @@ static int decode_frame(WmallDecodeCtx *s)
/** get frame length */
if (s->len_prefix)
len = get_bits(gb, s->log2_frame_size); // XXX: compressed_frame_size_bits [Table 8]
len = get_bits(gb, s->log2_frame_size);
/** decode tile information */
if (decode_tilehdr(s)) { // should include decode_tile_configuration() [Table 9]
if (decode_tilehdr(s)) {
s->packet_loss = 1;
return 0;
}
/** read drc info */
if (s->dynamic_range_compression) {
s->drc_gain = get_bits(gb, 8); // XXX: drc_frame_scale_factor [Table 8]
s->drc_gain = get_bits(gb, 8);
}
/** no idea what these are for, might be the number of samples

@ -346,6 +346,7 @@ OBJS-$(CONFIG_CRYPTO_PROTOCOL) += crypto.o
OBJS-$(CONFIG_FILE_PROTOCOL) += file.o
OBJS-$(CONFIG_GOPHER_PROTOCOL) += gopher.o
OBJS-$(CONFIG_HTTP_PROTOCOL) += http.o httpauth.o
OBJS-$(CONFIG_HTTPPROXY_PROTOCOL) += http.o httpauth.o
OBJS-$(CONFIG_HTTPS_PROTOCOL) += http.o httpauth.o
OBJS-$(CONFIG_MMSH_PROTOCOL) += mmsh.o mms.o asf.o
OBJS-$(CONFIG_MMST_PROTOCOL) += mmst.o mms.o asf.o

Loading…
Cancel
Save