mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-06-29 12:26:20 +08:00
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>
This commit is contained in:
2
configure
vendored
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
|
||||
|
Reference in New Issue
Block a user