mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge commit 'f5962229bfcb14c2879e69ccdf7f1a4934168609'
* commit 'f5962229bfcb14c2879e69ccdf7f1a4934168609': avplay: use audio parameters from the decoded frame instead of AVCodecContext dca: allocate a secondary buffer for extra channels when downmixing configure: use utilities from /usr/xpg4/bin if it exists avstring-test: fix memory leaks Conflicts: ffplay.c libavcodec/dcadec.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
15ef1cfe64
2
configure
vendored
2
configure
vendored
@ -54,6 +54,8 @@ if test "$E1" != 0 || test "$E2" = 0; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH
|
||||||
|
|
||||||
show_help(){
|
show_help(){
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
Usage: configure [options]
|
Usage: configure [options]
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "libavutil/intreadwrite.h"
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/audioconvert.h"
|
#include "libavutil/audioconvert.h"
|
||||||
|
#include "libavutil/samplefmt.h"
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "fft.h"
|
#include "fft.h"
|
||||||
@ -420,6 +421,9 @@ typedef struct {
|
|||||||
|
|
||||||
DECLARE_ALIGNED(32, float, subband_samples)[DCA_BLOCKS_MAX][DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8];
|
DECLARE_ALIGNED(32, float, subband_samples)[DCA_BLOCKS_MAX][DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8];
|
||||||
float *samples_chanptr[DCA_PRIM_CHANNELS_MAX + 1];
|
float *samples_chanptr[DCA_PRIM_CHANNELS_MAX + 1];
|
||||||
|
float *extra_channels[DCA_PRIM_CHANNELS_MAX + 1];
|
||||||
|
uint8_t *extra_channels_buffer;
|
||||||
|
unsigned int extra_channels_buffer_size;
|
||||||
|
|
||||||
uint8_t dca_buffer[DCA_MAX_FRAME_SIZE + DCA_MAX_EXSS_HEADER_SIZE + DCA_BUFFER_PADDING_SIZE];
|
uint8_t dca_buffer[DCA_MAX_FRAME_SIZE + DCA_MAX_EXSS_HEADER_SIZE + DCA_BUFFER_PADDING_SIZE];
|
||||||
int dca_buffer_size; ///< how much data is in the dca_buffer
|
int dca_buffer_size; ///< how much data is in the dca_buffer
|
||||||
@ -2070,7 +2074,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
float *dst_chan;
|
float *dst_chan;
|
||||||
DCAContext *s = avctx->priv_data;
|
DCAContext *s = avctx->priv_data;
|
||||||
int core_ss_end;
|
int core_ss_end;
|
||||||
int channels;
|
int channels, full_channels;
|
||||||
float scale;
|
float scale;
|
||||||
int achan;
|
int achan;
|
||||||
int chset;
|
int chset;
|
||||||
@ -2211,7 +2215,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
avctx->profile = s->profile;
|
avctx->profile = s->profile;
|
||||||
|
|
||||||
channels = s->prim_channels + !!s->lfe;
|
full_channels = channels = s->prim_channels + !!s->lfe;
|
||||||
|
|
||||||
/* If we have XXCH then the channel layout is managed differently */
|
/* If we have XXCH then the channel layout is managed differently */
|
||||||
/* note that XLL will also have another way to do things */
|
/* note that XLL will also have another way to do things */
|
||||||
@ -2340,12 +2344,35 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
}
|
}
|
||||||
samples_flt = (float **) s->frame.extended_data;
|
samples_flt = (float **) s->frame.extended_data;
|
||||||
|
|
||||||
|
/* allocate buffer for extra channels if downmixing */
|
||||||
|
if (avctx->channels < full_channels) {
|
||||||
|
ret = av_samples_get_buffer_size(NULL, full_channels - channels,
|
||||||
|
s->frame.nb_samples,
|
||||||
|
avctx->sample_fmt, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
av_fast_malloc(&s->extra_channels_buffer,
|
||||||
|
&s->extra_channels_buffer_size, ret);
|
||||||
|
if (!s->extra_channels_buffer)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
ret = av_samples_fill_arrays((uint8_t **)s->extra_channels, NULL,
|
||||||
|
s->extra_channels_buffer,
|
||||||
|
full_channels - channels,
|
||||||
|
s->frame.nb_samples, avctx->sample_fmt, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* filter to get final output */
|
/* filter to get final output */
|
||||||
for (i = 0; i < (s->sample_blocks / 8); i++) {
|
for (i = 0; i < (s->sample_blocks / 8); i++) {
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
for (ch = 0; ch < channels; ch++)
|
for (ch = 0; ch < channels; ch++)
|
||||||
s->samples_chanptr[ch] = samples_flt[ch] + i * 256;
|
s->samples_chanptr[ch] = samples_flt[ch] + i * 256;
|
||||||
|
for (; ch < full_channels; ch++)
|
||||||
|
s->samples_chanptr[ch] = s->extra_channels[ch - channels] + i * 256;
|
||||||
|
|
||||||
dca_filter_channels(s, i);
|
dca_filter_channels(s, i);
|
||||||
|
|
||||||
@ -2457,6 +2484,7 @@ static av_cold int dca_decode_end(AVCodecContext *avctx)
|
|||||||
{
|
{
|
||||||
DCAContext *s = avctx->priv_data;
|
DCAContext *s = avctx->priv_data;
|
||||||
ff_mdct_end(&s->imdct);
|
ff_mdct_end(&s->imdct);
|
||||||
|
av_freep(&s->extra_channels_buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,10 +252,12 @@ int main(void)
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (i=0; i < FF_ARRAY_ELEMS(strings); i++) {
|
for (i=0; i < FF_ARRAY_ELEMS(strings); i++) {
|
||||||
const char *p= strings[i];
|
const char *p = strings[i], *q;
|
||||||
printf("|%s|", p);
|
printf("|%s|", p);
|
||||||
printf(" -> |%s|", av_get_token(&p, ":"));
|
q = av_get_token(&p, ":");
|
||||||
|
printf(" -> |%s|", q);
|
||||||
printf(" + |%s|\n", p);
|
printf(" + |%s|\n", p);
|
||||||
|
av_free(q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user