mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-06-29 20:36:47 +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
|
# protocols
|
||||||
gopher_protocol_deps="network"
|
gopher_protocol_deps="network"
|
||||||
|
httpproxy_protocol_deps="network"
|
||||||
|
httpproxy_protocol_select="tcp_protocol"
|
||||||
http_protocol_deps="network"
|
http_protocol_deps="network"
|
||||||
http_protocol_select="tcp_protocol"
|
http_protocol_select="tcp_protocol"
|
||||||
https_protocol_select="tls_protocol"
|
https_protocol_select="tls_protocol"
|
||||||
|
@ -139,11 +139,9 @@ typedef struct {
|
|||||||
float* coeffs; ///< pointer to the subframe decode buffer
|
float* coeffs; ///< pointer to the subframe decode buffer
|
||||||
uint16_t num_vec_coeffs; ///< number of vector coded coefficients
|
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
|
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;
|
} WmallChannelCtx;
|
||||||
|
|
||||||
/* XXX: probably we don't need subframe_config[],
|
|
||||||
WmallChannelCtx holds all the necessary data. */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief channel group for channel transformations
|
* @brief channel group for channel transformations
|
||||||
*/
|
*/
|
||||||
@ -310,6 +308,19 @@ static void av_cold dump_context(WmallDecodeCtx *s)
|
|||||||
PRINT("num channels", s->num_channels);
|
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.
|
*@brief Uninitialize the decoder and free all resources.
|
||||||
*@param avctx codec context
|
*@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)
|
if (offset == s->samples_per_frame - s->min_samples_per_subframe)
|
||||||
return s->min_samples_per_subframe;
|
return s->min_samples_per_subframe;
|
||||||
|
|
||||||
len = av_log2(s->max_num_subframes - 1) + 1; // XXX: 5.3.3
|
len = av_log2(s->max_num_subframes - 1) + 1;
|
||||||
frame_len_ratio = get_bits(&s->gb, len); // XXX: tile_size_ratio
|
frame_len_ratio = get_bits(&s->gb, len);
|
||||||
|
|
||||||
subframe_len = s->min_samples_per_subframe * (frame_len_ratio + 1);
|
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
|
*@param s context
|
||||||
*@return 0 on success, < 0 in case of an error
|
*@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 */
|
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 */
|
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));
|
memset(num_samples, 0, sizeof(num_samples));
|
||||||
|
|
||||||
if (s->max_num_subframes == 1 || get_bits1(&s->gb)) // XXX: locate in the spec
|
if (s->max_num_subframes == 1 || get_bits1(&s->gb))
|
||||||
fixed_channel_layout = 1; // XXX: tile_aligned ?
|
fixed_channel_layout = 1;
|
||||||
|
|
||||||
/** loop until the frame data is split between the subframes */
|
/** loop until the frame data is split between the subframes */
|
||||||
do {
|
do {
|
||||||
@ -505,14 +516,14 @@ static int decode_tilehdr(WmallDecodeCtx *s) /* XXX: decode_tile_configur
|
|||||||
contains_subframe[c] = 1;
|
contains_subframe[c] = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
contains_subframe[c] = get_bits1(&s->gb); // XXX: locate in the spec
|
contains_subframe[c] = get_bits1(&s->gb);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
contains_subframe[c] = 0;
|
contains_subframe[c] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** get subframe length, subframe_len == 0 is not allowed */
|
/** 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;
|
return AVERROR_INVALIDDATA;
|
||||||
/** add subframes to the individual channels and find new min_channel_len */
|
/** add subframes to the individual channels and find new min_channel_len */
|
||||||
min_channel_len += subframe_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;
|
int i = 0;
|
||||||
unsigned int ave_mean;
|
unsigned int ave_mean;
|
||||||
s->transient[ch] = get_bits1(&s->gb);
|
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));
|
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) {
|
if(s->seekable_tile) {
|
||||||
ave_mean = get_bits(&s->gb, s->bits_per_sample);
|
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);
|
s->channel_residues[ch][0] = get_sbits(&s->gb, s->bits_per_sample);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
av_log(0, 0, "%8d: ", num_logged_tiles++);
|
//av_log(0, 0, "%8d: ", num_logged_tiles++);
|
||||||
for(; i < tile_size; i++) {
|
for(; i < tile_size; i++) {
|
||||||
int quo = 0, rem, rem_bits, residue;
|
int quo = 0, rem, rem_bits, residue;
|
||||||
while(get_bits1(&s->gb))
|
while(get_bits1(&s->gb))
|
||||||
@ -700,11 +717,10 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
|
|||||||
residue = residue >> 1;
|
residue = residue >> 1;
|
||||||
s->channel_residues[ch][i] = residue;
|
s->channel_residues[ch][i] = residue;
|
||||||
|
|
||||||
//if (num_logged_tiles < 1)
|
/*if (num_logged_tiles < 1)
|
||||||
av_log(0, 0, "%4d ", residue);
|
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));
|
|
||||||
}
|
}
|
||||||
av_log(0, 0, "\n Tile size = %d\n", tile_size);
|
dump_int_buffer(s->channel_residues[ch], tile_size, 16);
|
||||||
|
|
||||||
return 0;
|
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)
|
static void reset_codec(WmallDecodeCtx *s)
|
||||||
{
|
{
|
||||||
int ich, ilms;
|
int ich, ilms;
|
||||||
s->mclms_recent = s->mclms_order * s->num_channels;
|
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++)
|
for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++)
|
||||||
s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order;
|
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).
|
*@brief Decode a single subframe (block).
|
||||||
*@param s codec context
|
*@param s codec context
|
||||||
@ -996,7 +1053,7 @@ static int decode_subframe(WmallDecodeCtx *s)
|
|||||||
av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
|
av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
++s->channel[c].cur_subframe; // XXX: 6.4
|
++s->channel[c].cur_subframe;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1025,17 +1082,17 @@ static int decode_frame(WmallDecodeCtx *s)
|
|||||||
|
|
||||||
/** get frame length */
|
/** get frame length */
|
||||||
if (s->len_prefix)
|
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 */
|
/** decode tile information */
|
||||||
if (decode_tilehdr(s)) { // should include decode_tile_configuration() [Table 9]
|
if (decode_tilehdr(s)) {
|
||||||
s->packet_loss = 1;
|
s->packet_loss = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** read drc info */
|
/** read drc info */
|
||||||
if (s->dynamic_range_compression) {
|
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
|
/** 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_FILE_PROTOCOL) += file.o
|
||||||
OBJS-$(CONFIG_GOPHER_PROTOCOL) += gopher.o
|
OBJS-$(CONFIG_GOPHER_PROTOCOL) += gopher.o
|
||||||
OBJS-$(CONFIG_HTTP_PROTOCOL) += http.o httpauth.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_HTTPS_PROTOCOL) += http.o httpauth.o
|
||||||
OBJS-$(CONFIG_MMSH_PROTOCOL) += mmsh.o mms.o asf.o
|
OBJS-$(CONFIG_MMSH_PROTOCOL) += mmsh.o mms.o asf.o
|
||||||
OBJS-$(CONFIG_MMST_PROTOCOL) += mmst.o mms.o asf.o
|
OBJS-$(CONFIG_MMST_PROTOCOL) += mmst.o mms.o asf.o
|
||||||
|
Reference in New Issue
Block a user