mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-26 13:00:33 +00:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: (35 commits) libopencore-amr: check output buffer size before decoding libopencore-amr: remove unneeded buf_size==0 check. libopencore-amr: remove unneeded frame_count field. aac_latm: remove unneeded check for zero-size packet. pcmdec: fix output buffer size check by calculating the actual output size prior to decoding. pcmdec: move codec-specific variable declarations to the corresponding codec blocks. pcmdec: return buf_size instead of src-buf. avcodec: remove the Zork PCM encoder. pcm_zork: use AV_SAMPLE_FMT_U8 instead of shifting all samples by 8. pcmenc: remove unneeded sample_fmt check. pcmdec: move number of channels check to pcm_decode_init() pcmdec: remove unnecessary check for sample_fmt change pcmdec: move DVD PCM bits_per_coded_sample check near to the code that sets the sample size. pcmdec: do not needlessly set *data_size to 0 alacdec: remove unneeded NULL or zero-size packet checks. alacdec: simplify buffer allocation by using FF_ALLOC_OR_GOTO() alacdec: ask for a sample for unsupported sample depths. alacdec: cosmetics: use 'ch' instead of 'chan' to iterate channels alacdec: move some declarations to the top of the function alacdec: always use get_sbits_long() for uncompressed samples ... Conflicts: libavcodec/pcm.c tests/ref/acodec/pcm Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
173715d291
@ -683,7 +683,7 @@ following image formats are supported:
|
|||||||
@item PCM unsigned 24-bit little-endian @tab X @tab X
|
@item PCM unsigned 24-bit little-endian @tab X @tab X
|
||||||
@item PCM unsigned 32-bit big-endian @tab X @tab X
|
@item PCM unsigned 32-bit big-endian @tab X @tab X
|
||||||
@item PCM unsigned 32-bit little-endian @tab X @tab X
|
@item PCM unsigned 32-bit little-endian @tab X @tab X
|
||||||
@item PCM Zork @tab X @tab X
|
@item PCM Zork @tab @tab X
|
||||||
@item QCELP / PureVoice @tab @tab X
|
@item QCELP / PureVoice @tab @tab X
|
||||||
@item QDesign Music Codec 2 @tab @tab X
|
@item QDesign Music Codec 2 @tab @tab X
|
||||||
@tab There are still some distortions.
|
@tab There are still some distortions.
|
||||||
|
@ -508,7 +508,6 @@ OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o
|
|||||||
OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o
|
OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o
|
||||||
OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o
|
OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o
|
||||||
OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o
|
OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o
|
||||||
OBJS-$(CONFIG_PCM_ZORK_ENCODER) += pcm.o
|
|
||||||
|
|
||||||
OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o
|
OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o
|
||||||
OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o
|
OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o
|
||||||
|
@ -2501,9 +2501,6 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out, int *out_size,
|
|||||||
int muxlength, err;
|
int muxlength, err;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
|
|
||||||
if (avpkt->size == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
init_get_bits(&gb, avpkt->data, avpkt->size * 8);
|
init_get_bits(&gb, avpkt->data, avpkt->size * 8);
|
||||||
|
|
||||||
// check for LOAS sync word
|
// check for LOAS sync word
|
||||||
|
@ -72,7 +72,7 @@ typedef struct {
|
|||||||
|
|
||||||
int32_t *outputsamples_buffer[MAX_CHANNELS];
|
int32_t *outputsamples_buffer[MAX_CHANNELS];
|
||||||
|
|
||||||
int32_t *wasted_bits_buffer[MAX_CHANNELS];
|
int32_t *extra_bits_buffer[MAX_CHANNELS];
|
||||||
|
|
||||||
/* stuff from setinfo */
|
/* stuff from setinfo */
|
||||||
uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
|
uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
|
||||||
@ -82,58 +82,9 @@ typedef struct {
|
|||||||
uint8_t setinfo_rice_kmodifier; /* 0x0e */
|
uint8_t setinfo_rice_kmodifier; /* 0x0e */
|
||||||
/* end setinfo stuff */
|
/* end setinfo stuff */
|
||||||
|
|
||||||
int wasted_bits;
|
int extra_bits; /**< number of extra bits beyond 16-bit */
|
||||||
} ALACContext;
|
} ALACContext;
|
||||||
|
|
||||||
static void allocate_buffers(ALACContext *alac)
|
|
||||||
{
|
|
||||||
int chan;
|
|
||||||
for (chan = 0; chan < MAX_CHANNELS; chan++) {
|
|
||||||
alac->predicterror_buffer[chan] =
|
|
||||||
av_malloc(alac->setinfo_max_samples_per_frame * 4);
|
|
||||||
|
|
||||||
alac->outputsamples_buffer[chan] =
|
|
||||||
av_malloc(alac->setinfo_max_samples_per_frame * 4);
|
|
||||||
|
|
||||||
alac->wasted_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int alac_set_info(ALACContext *alac)
|
|
||||||
{
|
|
||||||
const unsigned char *ptr = alac->avctx->extradata;
|
|
||||||
|
|
||||||
ptr += 4; /* size */
|
|
||||||
ptr += 4; /* alac */
|
|
||||||
ptr += 4; /* 0 ? */
|
|
||||||
|
|
||||||
if(AV_RB32(ptr) >= UINT_MAX/4){
|
|
||||||
av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* buffer size / 2 ? */
|
|
||||||
alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr);
|
|
||||||
ptr++; /* ??? */
|
|
||||||
alac->setinfo_sample_size = *ptr++;
|
|
||||||
if (alac->setinfo_sample_size > 32) {
|
|
||||||
av_log(alac->avctx, AV_LOG_ERROR, "setinfo_sample_size too large\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
alac->setinfo_rice_historymult = *ptr++;
|
|
||||||
alac->setinfo_rice_initialhistory = *ptr++;
|
|
||||||
alac->setinfo_rice_kmodifier = *ptr++;
|
|
||||||
ptr++; /* channels? */
|
|
||||||
bytestream_get_be16(&ptr); /* ??? */
|
|
||||||
bytestream_get_be32(&ptr); /* max coded frame size */
|
|
||||||
bytestream_get_be32(&ptr); /* bitrate ? */
|
|
||||||
bytestream_get_be32(&ptr); /* samplerate */
|
|
||||||
|
|
||||||
allocate_buffers(alac);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){
|
static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){
|
||||||
/* read x - number of 1s before 0 represent the rice */
|
/* read x - number of 1s before 0 represent the rice */
|
||||||
int x = get_unary_0_9(gb);
|
int x = get_unary_0_9(gb);
|
||||||
@ -347,93 +298,56 @@ static void predictor_decompress_fir_adapt(int32_t *error_buffer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS],
|
static void decorrelate_stereo(int32_t *buffer[MAX_CHANNELS],
|
||||||
int16_t *buffer_out,
|
int numsamples, uint8_t interlacing_shift,
|
||||||
int numchannels, int numsamples,
|
uint8_t interlacing_leftweight)
|
||||||
uint8_t interlacing_shift,
|
|
||||||
uint8_t interlacing_leftweight)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if (numsamples <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* weighted interlacing */
|
|
||||||
if (interlacing_leftweight) {
|
|
||||||
for (i = 0; i < numsamples; i++) {
|
|
||||||
int32_t a, b;
|
|
||||||
|
|
||||||
a = buffer[0][i];
|
|
||||||
b = buffer[1][i];
|
|
||||||
|
|
||||||
a -= (b * interlacing_leftweight) >> interlacing_shift;
|
|
||||||
b += a;
|
|
||||||
|
|
||||||
buffer_out[i*numchannels] = b;
|
|
||||||
buffer_out[i*numchannels + 1] = a;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* otherwise basic interlacing took place */
|
|
||||||
for (i = 0; i < numsamples; i++) {
|
for (i = 0; i < numsamples; i++) {
|
||||||
int16_t left, right;
|
int32_t a, b;
|
||||||
|
|
||||||
left = buffer[0][i];
|
a = buffer[0][i];
|
||||||
right = buffer[1][i];
|
b = buffer[1][i];
|
||||||
|
|
||||||
buffer_out[i*numchannels] = left;
|
a -= (b * interlacing_leftweight) >> interlacing_shift;
|
||||||
buffer_out[i*numchannels + 1] = right;
|
b += a;
|
||||||
|
|
||||||
|
buffer[0][i] = b;
|
||||||
|
buffer[1][i] = a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS],
|
static void append_extra_bits(int32_t *buffer[MAX_CHANNELS],
|
||||||
int32_t *buffer_out,
|
int32_t *extra_bits_buffer[MAX_CHANNELS],
|
||||||
int32_t *wasted_bits_buffer[MAX_CHANNELS],
|
int extra_bits, int numchannels, int numsamples)
|
||||||
int wasted_bits,
|
{
|
||||||
int numchannels, int numsamples,
|
int i, ch;
|
||||||
uint8_t interlacing_shift,
|
|
||||||
uint8_t interlacing_leftweight)
|
for (ch = 0; ch < numchannels; ch++)
|
||||||
|
for (i = 0; i < numsamples; i++)
|
||||||
|
buffer[ch][i] = (buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void interleave_stereo_16(int32_t *buffer[MAX_CHANNELS],
|
||||||
|
int16_t *buffer_out, int numsamples)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (numsamples <= 0)
|
for (i = 0; i < numsamples; i++) {
|
||||||
return;
|
*buffer_out++ = buffer[0][i];
|
||||||
|
*buffer_out++ = buffer[1][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* weighted interlacing */
|
static void interleave_stereo_24(int32_t *buffer[MAX_CHANNELS],
|
||||||
if (interlacing_leftweight) {
|
int32_t *buffer_out, int numsamples)
|
||||||
for (i = 0; i < numsamples; i++) {
|
{
|
||||||
int32_t a, b;
|
int i;
|
||||||
|
|
||||||
a = buffer[0][i];
|
for (i = 0; i < numsamples; i++) {
|
||||||
b = buffer[1][i];
|
*buffer_out++ = buffer[0][i] << 8;
|
||||||
|
*buffer_out++ = buffer[1][i] << 8;
|
||||||
a -= (b * interlacing_leftweight) >> interlacing_shift;
|
|
||||||
b += a;
|
|
||||||
|
|
||||||
if (wasted_bits) {
|
|
||||||
b = (b << wasted_bits) | wasted_bits_buffer[0][i];
|
|
||||||
a = (a << wasted_bits) | wasted_bits_buffer[1][i];
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer_out[i * numchannels] = b << 8;
|
|
||||||
buffer_out[i * numchannels + 1] = a << 8;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < numsamples; i++) {
|
|
||||||
int32_t left, right;
|
|
||||||
|
|
||||||
left = buffer[0][i];
|
|
||||||
right = buffer[1][i];
|
|
||||||
|
|
||||||
if (wasted_bits) {
|
|
||||||
left = (left << wasted_bits) | wasted_bits_buffer[0][i];
|
|
||||||
right = (right << wasted_bits) | wasted_bits_buffer[1][i];
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer_out[i * numchannels] = left << 8;
|
|
||||||
buffer_out[i * numchannels + 1] = right << 8;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,18 +366,14 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
int isnotcompressed;
|
int isnotcompressed;
|
||||||
uint8_t interlacing_shift;
|
uint8_t interlacing_shift;
|
||||||
uint8_t interlacing_leftweight;
|
uint8_t interlacing_leftweight;
|
||||||
|
int i, ch;
|
||||||
/* short-circuit null buffers */
|
|
||||||
if (!inbuffer || !input_buffer_size)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
|
init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
|
||||||
|
|
||||||
channels = get_bits(&alac->gb, 3) + 1;
|
channels = get_bits(&alac->gb, 3) + 1;
|
||||||
if (channels > MAX_CHANNELS) {
|
if (channels != avctx->channels) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n",
|
av_log(avctx, AV_LOG_ERROR, "frame header channel count mismatch\n");
|
||||||
MAX_CHANNELS);
|
return AVERROR_INVALIDDATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 2^result = something to do with output waiting.
|
/* 2^result = something to do with output waiting.
|
||||||
@ -476,7 +386,7 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
/* the output sample size is stored soon */
|
/* the output sample size is stored soon */
|
||||||
hassize = get_bits1(&alac->gb);
|
hassize = get_bits1(&alac->gb);
|
||||||
|
|
||||||
alac->wasted_bits = get_bits(&alac->gb, 2) << 3;
|
alac->extra_bits = get_bits(&alac->gb, 2) << 3;
|
||||||
|
|
||||||
/* whether the frame is compressed */
|
/* whether the frame is compressed */
|
||||||
isnotcompressed = get_bits1(&alac->gb);
|
isnotcompressed = get_bits1(&alac->gb);
|
||||||
@ -491,17 +401,7 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
} else
|
} else
|
||||||
outputsamples = alac->setinfo_max_samples_per_frame;
|
outputsamples = alac->setinfo_max_samples_per_frame;
|
||||||
|
|
||||||
switch (alac->setinfo_sample_size) {
|
alac->bytespersample = channels * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||||
case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
|
||||||
alac->bytespersample = channels << 1;
|
|
||||||
break;
|
|
||||||
case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32;
|
|
||||||
alac->bytespersample = channels << 2;
|
|
||||||
break;
|
|
||||||
default: av_log(avctx, AV_LOG_ERROR, "Sample depth %d is not supported.\n",
|
|
||||||
alac->setinfo_sample_size);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(outputsamples > *outputsize / alac->bytespersample){
|
if(outputsamples > *outputsize / alac->bytespersample){
|
||||||
av_log(avctx, AV_LOG_ERROR, "sample buffer too small\n");
|
av_log(avctx, AV_LOG_ERROR, "sample buffer too small\n");
|
||||||
@ -509,7 +409,7 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
*outputsize = outputsamples * alac->bytespersample;
|
*outputsize = outputsamples * alac->bytespersample;
|
||||||
readsamplesize = alac->setinfo_sample_size - (alac->wasted_bits) + channels - 1;
|
readsamplesize = alac->setinfo_sample_size - alac->extra_bits + channels - 1;
|
||||||
if (readsamplesize > MIN_CACHE_BITS) {
|
if (readsamplesize > MIN_CACHE_BITS) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n", readsamplesize);
|
av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n", readsamplesize);
|
||||||
return -1;
|
return -1;
|
||||||
@ -522,51 +422,49 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
int prediction_type[MAX_CHANNELS];
|
int prediction_type[MAX_CHANNELS];
|
||||||
int prediction_quantitization[MAX_CHANNELS];
|
int prediction_quantitization[MAX_CHANNELS];
|
||||||
int ricemodifier[MAX_CHANNELS];
|
int ricemodifier[MAX_CHANNELS];
|
||||||
int i, chan;
|
|
||||||
|
|
||||||
interlacing_shift = get_bits(&alac->gb, 8);
|
interlacing_shift = get_bits(&alac->gb, 8);
|
||||||
interlacing_leftweight = get_bits(&alac->gb, 8);
|
interlacing_leftweight = get_bits(&alac->gb, 8);
|
||||||
|
|
||||||
for (chan = 0; chan < channels; chan++) {
|
for (ch = 0; ch < channels; ch++) {
|
||||||
prediction_type[chan] = get_bits(&alac->gb, 4);
|
prediction_type[ch] = get_bits(&alac->gb, 4);
|
||||||
prediction_quantitization[chan] = get_bits(&alac->gb, 4);
|
prediction_quantitization[ch] = get_bits(&alac->gb, 4);
|
||||||
|
|
||||||
ricemodifier[chan] = get_bits(&alac->gb, 3);
|
ricemodifier[ch] = get_bits(&alac->gb, 3);
|
||||||
predictor_coef_num[chan] = get_bits(&alac->gb, 5);
|
predictor_coef_num[ch] = get_bits(&alac->gb, 5);
|
||||||
|
|
||||||
/* read the predictor table */
|
/* read the predictor table */
|
||||||
for (i = 0; i < predictor_coef_num[chan]; i++)
|
for (i = 0; i < predictor_coef_num[ch]; i++)
|
||||||
predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16);
|
predictor_coef_table[ch][i] = (int16_t)get_bits(&alac->gb, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alac->wasted_bits) {
|
if (alac->extra_bits) {
|
||||||
int i, ch;
|
|
||||||
for (i = 0; i < outputsamples; i++) {
|
for (i = 0; i < outputsamples; i++) {
|
||||||
for (ch = 0; ch < channels; ch++)
|
for (ch = 0; ch < channels; ch++)
|
||||||
alac->wasted_bits_buffer[ch][i] = get_bits(&alac->gb, alac->wasted_bits);
|
alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb, alac->extra_bits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (chan = 0; chan < channels; chan++) {
|
for (ch = 0; ch < channels; ch++) {
|
||||||
bastardized_rice_decompress(alac,
|
bastardized_rice_decompress(alac,
|
||||||
alac->predicterror_buffer[chan],
|
alac->predicterror_buffer[ch],
|
||||||
outputsamples,
|
outputsamples,
|
||||||
readsamplesize,
|
readsamplesize,
|
||||||
alac->setinfo_rice_initialhistory,
|
alac->setinfo_rice_initialhistory,
|
||||||
alac->setinfo_rice_kmodifier,
|
alac->setinfo_rice_kmodifier,
|
||||||
ricemodifier[chan] * alac->setinfo_rice_historymult / 4,
|
ricemodifier[ch] * alac->setinfo_rice_historymult / 4,
|
||||||
(1 << alac->setinfo_rice_kmodifier) - 1);
|
(1 << alac->setinfo_rice_kmodifier) - 1);
|
||||||
|
|
||||||
if (prediction_type[chan] == 0) {
|
if (prediction_type[ch] == 0) {
|
||||||
/* adaptive fir */
|
/* adaptive fir */
|
||||||
predictor_decompress_fir_adapt(alac->predicterror_buffer[chan],
|
predictor_decompress_fir_adapt(alac->predicterror_buffer[ch],
|
||||||
alac->outputsamples_buffer[chan],
|
alac->outputsamples_buffer[ch],
|
||||||
outputsamples,
|
outputsamples,
|
||||||
readsamplesize,
|
readsamplesize,
|
||||||
predictor_coef_table[chan],
|
predictor_coef_table[ch],
|
||||||
predictor_coef_num[chan],
|
predictor_coef_num[ch],
|
||||||
prediction_quantitization[chan]);
|
prediction_quantitization[ch]);
|
||||||
} else {
|
} else {
|
||||||
av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]);
|
av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[ch]);
|
||||||
/* I think the only other prediction type (or perhaps this is
|
/* I think the only other prediction type (or perhaps this is
|
||||||
* just a boolean?) runs adaptive fir twice.. like:
|
* just a boolean?) runs adaptive fir twice.. like:
|
||||||
* predictor_decompress_fir_adapt(predictor_error, tempout, ...)
|
* predictor_decompress_fir_adapt(predictor_error, tempout, ...)
|
||||||
@ -577,44 +475,35 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* not compressed, easy case */
|
/* not compressed, easy case */
|
||||||
int i, chan;
|
for (i = 0; i < outputsamples; i++) {
|
||||||
if (alac->setinfo_sample_size <= 16) {
|
for (ch = 0; ch < channels; ch++) {
|
||||||
for (i = 0; i < outputsamples; i++)
|
alac->outputsamples_buffer[ch][i] = get_sbits_long(&alac->gb,
|
||||||
for (chan = 0; chan < channels; chan++) {
|
alac->setinfo_sample_size);
|
||||||
int32_t audiobits;
|
|
||||||
|
|
||||||
audiobits = get_sbits_long(&alac->gb, alac->setinfo_sample_size);
|
|
||||||
|
|
||||||
alac->outputsamples_buffer[chan][i] = audiobits;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < outputsamples; i++) {
|
|
||||||
for (chan = 0; chan < channels; chan++) {
|
|
||||||
alac->outputsamples_buffer[chan][i] = get_bits(&alac->gb,
|
|
||||||
alac->setinfo_sample_size);
|
|
||||||
alac->outputsamples_buffer[chan][i] = sign_extend(alac->outputsamples_buffer[chan][i],
|
|
||||||
alac->setinfo_sample_size);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alac->wasted_bits = 0;
|
alac->extra_bits = 0;
|
||||||
interlacing_shift = 0;
|
interlacing_shift = 0;
|
||||||
interlacing_leftweight = 0;
|
interlacing_leftweight = 0;
|
||||||
}
|
}
|
||||||
if (get_bits(&alac->gb, 3) != 7)
|
if (get_bits(&alac->gb, 3) != 7)
|
||||||
av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n");
|
av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n");
|
||||||
|
|
||||||
|
if (channels == 2 && interlacing_leftweight) {
|
||||||
|
decorrelate_stereo(alac->outputsamples_buffer, outputsamples,
|
||||||
|
interlacing_shift, interlacing_leftweight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alac->extra_bits) {
|
||||||
|
append_extra_bits(alac->outputsamples_buffer, alac->extra_bits_buffer,
|
||||||
|
alac->extra_bits, alac->numchannels, outputsamples);
|
||||||
|
}
|
||||||
|
|
||||||
switch(alac->setinfo_sample_size) {
|
switch(alac->setinfo_sample_size) {
|
||||||
case 16:
|
case 16:
|
||||||
if (channels == 2) {
|
if (channels == 2) {
|
||||||
reconstruct_stereo_16(alac->outputsamples_buffer,
|
interleave_stereo_16(alac->outputsamples_buffer, outbuffer,
|
||||||
(int16_t*)outbuffer,
|
outputsamples);
|
||||||
alac->numchannels,
|
|
||||||
outputsamples,
|
|
||||||
interlacing_shift,
|
|
||||||
interlacing_leftweight);
|
|
||||||
} else {
|
} else {
|
||||||
int i;
|
|
||||||
for (i = 0; i < outputsamples; i++) {
|
for (i = 0; i < outputsamples; i++) {
|
||||||
((int16_t*)outbuffer)[i] = alac->outputsamples_buffer[0][i];
|
((int16_t*)outbuffer)[i] = alac->outputsamples_buffer[0][i];
|
||||||
}
|
}
|
||||||
@ -622,16 +511,9 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
if (channels == 2) {
|
if (channels == 2) {
|
||||||
decorrelate_stereo_24(alac->outputsamples_buffer,
|
interleave_stereo_24(alac->outputsamples_buffer, outbuffer,
|
||||||
outbuffer,
|
outputsamples);
|
||||||
alac->wasted_bits_buffer,
|
|
||||||
alac->wasted_bits,
|
|
||||||
alac->numchannels,
|
|
||||||
outputsamples,
|
|
||||||
interlacing_shift,
|
|
||||||
interlacing_leftweight);
|
|
||||||
} else {
|
} else {
|
||||||
int i;
|
|
||||||
for (i = 0; i < outputsamples; i++)
|
for (i = 0; i < outputsamples; i++)
|
||||||
((int32_t *)outbuffer)[i] = alac->outputsamples_buffer[0][i] << 8;
|
((int32_t *)outbuffer)[i] = alac->outputsamples_buffer[0][i] << 8;
|
||||||
}
|
}
|
||||||
@ -644,11 +526,75 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
|||||||
return input_buffer_size;
|
return input_buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_cold int alac_decode_init(AVCodecContext * avctx)
|
static av_cold int alac_decode_close(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
ALACContext *alac = avctx->priv_data;
|
ALACContext *alac = avctx->priv_data;
|
||||||
|
|
||||||
|
int ch;
|
||||||
|
for (ch = 0; ch < alac->numchannels; ch++) {
|
||||||
|
av_freep(&alac->predicterror_buffer[ch]);
|
||||||
|
av_freep(&alac->outputsamples_buffer[ch]);
|
||||||
|
av_freep(&alac->extra_bits_buffer[ch]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int allocate_buffers(ALACContext *alac)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
for (ch = 0; ch < alac->numchannels; ch++) {
|
||||||
|
int buf_size = alac->setinfo_max_samples_per_frame * sizeof(int32_t);
|
||||||
|
|
||||||
|
FF_ALLOC_OR_GOTO(alac->avctx, alac->predicterror_buffer[ch],
|
||||||
|
buf_size, buf_alloc_fail);
|
||||||
|
|
||||||
|
FF_ALLOC_OR_GOTO(alac->avctx, alac->outputsamples_buffer[ch],
|
||||||
|
buf_size, buf_alloc_fail);
|
||||||
|
|
||||||
|
FF_ALLOC_OR_GOTO(alac->avctx, alac->extra_bits_buffer[ch],
|
||||||
|
buf_size, buf_alloc_fail);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
buf_alloc_fail:
|
||||||
|
alac_decode_close(alac->avctx);
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int alac_set_info(ALACContext *alac)
|
||||||
|
{
|
||||||
|
const unsigned char *ptr = alac->avctx->extradata;
|
||||||
|
|
||||||
|
ptr += 4; /* size */
|
||||||
|
ptr += 4; /* alac */
|
||||||
|
ptr += 4; /* 0 ? */
|
||||||
|
|
||||||
|
if(AV_RB32(ptr) >= UINT_MAX/4){
|
||||||
|
av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* buffer size / 2 ? */
|
||||||
|
alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr);
|
||||||
|
ptr++; /* ??? */
|
||||||
|
alac->setinfo_sample_size = *ptr++;
|
||||||
|
alac->setinfo_rice_historymult = *ptr++;
|
||||||
|
alac->setinfo_rice_initialhistory = *ptr++;
|
||||||
|
alac->setinfo_rice_kmodifier = *ptr++;
|
||||||
|
alac->numchannels = *ptr++;
|
||||||
|
bytestream_get_be16(&ptr); /* ??? */
|
||||||
|
bytestream_get_be32(&ptr); /* max coded frame size */
|
||||||
|
bytestream_get_be32(&ptr); /* bitrate ? */
|
||||||
|
bytestream_get_be32(&ptr); /* samplerate */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static av_cold int alac_decode_init(AVCodecContext * avctx)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ALACContext *alac = avctx->priv_data;
|
||||||
alac->avctx = avctx;
|
alac->avctx = avctx;
|
||||||
alac->numchannels = alac->avctx->channels;
|
|
||||||
|
|
||||||
/* initialize from the extradata */
|
/* initialize from the extradata */
|
||||||
if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
|
if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
|
||||||
@ -661,18 +607,34 @@ static av_cold int alac_decode_init(AVCodecContext * avctx)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
switch (alac->setinfo_sample_size) {
|
||||||
}
|
case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||||
|
break;
|
||||||
|
case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32;
|
||||||
|
break;
|
||||||
|
default: av_log_ask_for_sample(avctx, "Sample depth %d is not supported.\n",
|
||||||
|
alac->setinfo_sample_size);
|
||||||
|
return AVERROR_PATCHWELCOME;
|
||||||
|
}
|
||||||
|
|
||||||
static av_cold int alac_decode_close(AVCodecContext *avctx)
|
if (alac->numchannels < 1) {
|
||||||
{
|
av_log(avctx, AV_LOG_WARNING, "Invalid channel count\n");
|
||||||
ALACContext *alac = avctx->priv_data;
|
alac->numchannels = avctx->channels;
|
||||||
|
} else {
|
||||||
|
if (alac->numchannels > MAX_CHANNELS)
|
||||||
|
alac->numchannels = avctx->channels;
|
||||||
|
else
|
||||||
|
avctx->channels = alac->numchannels;
|
||||||
|
}
|
||||||
|
if (avctx->channels > MAX_CHANNELS) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Unsupported channel count: %d\n",
|
||||||
|
avctx->channels);
|
||||||
|
return AVERROR_PATCHWELCOME;
|
||||||
|
}
|
||||||
|
|
||||||
int chan;
|
if ((ret = allocate_buffers(alac)) < 0) {
|
||||||
for (chan = 0; chan < MAX_CHANNELS; chan++) {
|
av_log(avctx, AV_LOG_ERROR, "Error allocating buffers\n");
|
||||||
av_freep(&alac->predicterror_buffer[chan]);
|
return ret;
|
||||||
av_freep(&alac->outputsamples_buffer[chan]);
|
|
||||||
av_freep(&alac->wasted_bits_buffer[chan]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -329,7 +329,7 @@ void avcodec_register_all(void)
|
|||||||
REGISTER_ENCDEC (PCM_U24LE, pcm_u24le);
|
REGISTER_ENCDEC (PCM_U24LE, pcm_u24le);
|
||||||
REGISTER_ENCDEC (PCM_U32BE, pcm_u32be);
|
REGISTER_ENCDEC (PCM_U32BE, pcm_u32be);
|
||||||
REGISTER_ENCDEC (PCM_U32LE, pcm_u32le);
|
REGISTER_ENCDEC (PCM_U32LE, pcm_u32le);
|
||||||
REGISTER_ENCDEC (PCM_ZORK , pcm_zork);
|
REGISTER_DECODER (PCM_ZORK , pcm_zork);
|
||||||
|
|
||||||
/* DPCM codecs */
|
/* DPCM codecs */
|
||||||
REGISTER_DECODER (INTERPLAY_DPCM, interplay_dpcm);
|
REGISTER_DECODER (INTERPLAY_DPCM, interplay_dpcm);
|
||||||
|
@ -79,7 +79,6 @@ static int get_bitrate_mode(int bitrate, void *log_ctx)
|
|||||||
|
|
||||||
typedef struct AMRContext {
|
typedef struct AMRContext {
|
||||||
AVClass *av_class;
|
AVClass *av_class;
|
||||||
int frame_count;
|
|
||||||
void *dec_state;
|
void *dec_state;
|
||||||
void *enc_state;
|
void *enc_state;
|
||||||
int enc_bitrate;
|
int enc_bitrate;
|
||||||
@ -100,7 +99,6 @@ static av_cold int amr_nb_decode_init(AVCodecContext *avctx)
|
|||||||
{
|
{
|
||||||
AMRContext *s = avctx->priv_data;
|
AMRContext *s = avctx->priv_data;
|
||||||
|
|
||||||
s->frame_count = 0;
|
|
||||||
s->dec_state = Decoder_Interface_init();
|
s->dec_state = Decoder_Interface_init();
|
||||||
if (!s->dec_state) {
|
if (!s->dec_state) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\n");
|
av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\n");
|
||||||
@ -133,10 +131,16 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
AMRContext *s = avctx->priv_data;
|
AMRContext *s = avctx->priv_data;
|
||||||
static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
|
static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
enum Mode dec_mode;
|
enum Mode dec_mode;
|
||||||
int packet_size;
|
int packet_size, out_size;
|
||||||
|
|
||||||
av_dlog(avctx, "amr_decode_frame buf=%p buf_size=%d frame_count=%d!!\n",
|
av_dlog(avctx, "amr_decode_frame buf=%p buf_size=%d frame_count=%d!!\n",
|
||||||
buf, buf_size, s->frame_count);
|
buf, buf_size, avctx->frame_number);
|
||||||
|
|
||||||
|
out_size = 160 * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||||
|
if (*data_size < out_size) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
dec_mode = (buf[0] >> 3) & 0x000F;
|
dec_mode = (buf[0] >> 3) & 0x000F;
|
||||||
packet_size = block_size[dec_mode] + 1;
|
packet_size = block_size[dec_mode] + 1;
|
||||||
@ -147,12 +151,11 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->frame_count++;
|
|
||||||
av_dlog(avctx, "packet_size=%d buf= 0x%X %X %X %X\n",
|
av_dlog(avctx, "packet_size=%d buf= 0x%X %X %X %X\n",
|
||||||
packet_size, buf[0], buf[1], buf[2], buf[3]);
|
packet_size, buf[0], buf[1], buf[2], buf[3]);
|
||||||
/* call decoder */
|
/* call decoder */
|
||||||
Decoder_Interface_Decode(s->dec_state, buf, data, 0);
|
Decoder_Interface_Decode(s->dec_state, buf, data, 0);
|
||||||
*data_size = 160 * 2;
|
*data_size = out_size;
|
||||||
|
|
||||||
return packet_size;
|
return packet_size;
|
||||||
}
|
}
|
||||||
@ -172,8 +175,6 @@ static av_cold int amr_nb_encode_init(AVCodecContext *avctx)
|
|||||||
{
|
{
|
||||||
AMRContext *s = avctx->priv_data;
|
AMRContext *s = avctx->priv_data;
|
||||||
|
|
||||||
s->frame_count = 0;
|
|
||||||
|
|
||||||
if (avctx->sample_rate != 8000) {
|
if (avctx->sample_rate != 8000) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
|
av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
|
||||||
return AVERROR(ENOSYS);
|
return AVERROR(ENOSYS);
|
||||||
@ -276,12 +277,14 @@ static int amr_wb_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
int buf_size = avpkt->size;
|
int buf_size = avpkt->size;
|
||||||
AMRWBContext *s = avctx->priv_data;
|
AMRWBContext *s = avctx->priv_data;
|
||||||
int mode;
|
int mode;
|
||||||
int packet_size;
|
int packet_size, out_size;
|
||||||
static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
|
static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
|
||||||
|
|
||||||
if (!buf_size)
|
out_size = 320 * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||||
/* nothing to do */
|
if (*data_size < out_size) {
|
||||||
return 0;
|
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
mode = (buf[0] >> 3) & 0x000F;
|
mode = (buf[0] >> 3) & 0x000F;
|
||||||
packet_size = block_size[mode];
|
packet_size = block_size[mode];
|
||||||
@ -293,7 +296,7 @@ static int amr_wb_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
D_IF_decode(s->state, buf, data, _good_frame);
|
D_IF_decode(s->state, buf, data, _good_frame);
|
||||||
*data_size = 320 * 2;
|
*data_size = out_size;
|
||||||
return packet_size;
|
return packet_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,11 +95,6 @@ static int pcm_encode_frame(AVCodecContext *avctx,
|
|||||||
samples = data;
|
samples = data;
|
||||||
dst = frame;
|
dst = frame;
|
||||||
|
|
||||||
if (avctx->sample_fmt!=avctx->codec->sample_fmts[0]) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "invalid sample_fmt\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(avctx->codec->id) {
|
switch(avctx->codec->id) {
|
||||||
case CODEC_ID_PCM_U32LE:
|
case CODEC_ID_PCM_U32LE:
|
||||||
ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000)
|
ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000)
|
||||||
@ -176,14 +171,6 @@ static int pcm_encode_frame(AVCodecContext *avctx,
|
|||||||
memcpy(dst, samples, n*sample_size);
|
memcpy(dst, samples, n*sample_size);
|
||||||
dst += n*sample_size;
|
dst += n*sample_size;
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_PCM_ZORK:
|
|
||||||
for(;n>0;n--) {
|
|
||||||
v= *samples++ >> 8;
|
|
||||||
if(v<0) v = -v;
|
|
||||||
else v+= 128;
|
|
||||||
*dst++ = v;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CODEC_ID_PCM_ALAW:
|
case CODEC_ID_PCM_ALAW:
|
||||||
for(;n>0;n--) {
|
for(;n>0;n--) {
|
||||||
v = *samples++;
|
v = *samples++;
|
||||||
@ -213,6 +200,11 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx)
|
|||||||
PCMDecode *s = avctx->priv_data;
|
PCMDecode *s = avctx->priv_data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (avctx->channels <= 0 || avctx->channels > MAX_CHANNELS) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
switch(avctx->codec->id) {
|
switch(avctx->codec->id) {
|
||||||
case CODEC_ID_PCM_ALAW:
|
case CODEC_ID_PCM_ALAW:
|
||||||
for(i=0;i<256;i++)
|
for(i=0;i<256;i++)
|
||||||
@ -255,34 +247,29 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
void *data, int *data_size,
|
void *data, int *data_size,
|
||||||
AVPacket *avpkt)
|
AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *src = avpkt->data;
|
||||||
int buf_size = avpkt->size;
|
int buf_size = avpkt->size;
|
||||||
PCMDecode *s = avctx->priv_data;
|
PCMDecode *s = avctx->priv_data;
|
||||||
int sample_size, c, n, i;
|
int sample_size, c, n, out_size;
|
||||||
uint8_t *samples;
|
uint8_t *samples;
|
||||||
const uint8_t *src, *src8, *src2[MAX_CHANNELS];
|
|
||||||
int32_t *dst_int32_t;
|
int32_t *dst_int32_t;
|
||||||
|
|
||||||
samples = data;
|
samples = data;
|
||||||
src = buf;
|
|
||||||
|
|
||||||
if (avctx->sample_fmt!=avctx->codec->sample_fmts[0]) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "invalid sample_fmt\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sample_size = av_get_bits_per_sample(avctx->codec_id)/8;
|
sample_size = av_get_bits_per_sample(avctx->codec_id)/8;
|
||||||
|
|
||||||
/* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */
|
/* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */
|
||||||
if (CODEC_ID_PCM_DVD == avctx->codec_id)
|
if (CODEC_ID_PCM_DVD == avctx->codec_id) {
|
||||||
|
if (avctx->bits_per_coded_sample != 20 &&
|
||||||
|
avctx->bits_per_coded_sample != 24) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"PCM DVD unsupported sample depth %i\n",
|
||||||
|
avctx->bits_per_coded_sample);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
/* 2 samples are interleaved per block in PCM_DVD */
|
/* 2 samples are interleaved per block in PCM_DVD */
|
||||||
sample_size = avctx->bits_per_coded_sample * 2 / 8;
|
sample_size = avctx->bits_per_coded_sample * 2 / 8;
|
||||||
else if (avctx->codec_id == CODEC_ID_PCM_LXF)
|
} else if (avctx->codec_id == CODEC_ID_PCM_LXF)
|
||||||
/* we process 40-bit blocks per channel for LXF */
|
/* we process 40-bit blocks per channel for LXF */
|
||||||
sample_size = 5;
|
sample_size = 5;
|
||||||
|
|
||||||
@ -301,11 +288,17 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
buf_size -= buf_size % n;
|
buf_size -= buf_size % n;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_size= FFMIN(buf_size, *data_size/2);
|
|
||||||
*data_size=0;
|
|
||||||
|
|
||||||
n = buf_size/sample_size;
|
n = buf_size/sample_size;
|
||||||
|
|
||||||
|
out_size = n * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||||
|
if (avctx->codec_id == CODEC_ID_PCM_DVD ||
|
||||||
|
avctx->codec_id == CODEC_ID_PCM_LXF)
|
||||||
|
out_size *= 2;
|
||||||
|
if (*data_size < out_size) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "output buffer too small\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
switch(avctx->codec->id) {
|
switch(avctx->codec->id) {
|
||||||
case CODEC_ID_PCM_U32LE:
|
case CODEC_ID_PCM_U32LE:
|
||||||
DECODE(32, le32, src, samples, n, 0, 0x80000000)
|
DECODE(32, le32, src, samples, n, 0, 0x80000000)
|
||||||
@ -335,6 +328,8 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_PCM_S16LE_PLANAR:
|
case CODEC_ID_PCM_S16LE_PLANAR:
|
||||||
|
{
|
||||||
|
const uint8_t *src2[MAX_CHANNELS];
|
||||||
n /= avctx->channels;
|
n /= avctx->channels;
|
||||||
for(c=0;c<avctx->channels;c++)
|
for(c=0;c<avctx->channels;c++)
|
||||||
src2[c] = &src[c*n*2];
|
src2[c] = &src[c*n*2];
|
||||||
@ -343,8 +338,8 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
AV_WN16A(samples, bytestream_get_le16(&src2[c]));
|
AV_WN16A(samples, bytestream_get_le16(&src2[c]));
|
||||||
samples += 2;
|
samples += 2;
|
||||||
}
|
}
|
||||||
src = src2[avctx->channels-1];
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case CODEC_ID_PCM_U16LE:
|
case CODEC_ID_PCM_U16LE:
|
||||||
DECODE(16, le16, src, samples, n, 0, 0x8000)
|
DECODE(16, le16, src, samples, n, 0, 0x8000)
|
||||||
break;
|
break;
|
||||||
@ -389,16 +384,14 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
#endif /* HAVE_BIGENDIAN */
|
#endif /* HAVE_BIGENDIAN */
|
||||||
case CODEC_ID_PCM_U8:
|
case CODEC_ID_PCM_U8:
|
||||||
memcpy(samples, src, n*sample_size);
|
memcpy(samples, src, n*sample_size);
|
||||||
src += n*sample_size;
|
|
||||||
samples += n * sample_size;
|
samples += n * sample_size;
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_PCM_ZORK:
|
case CODEC_ID_PCM_ZORK:
|
||||||
for(;n>0;n--) {
|
for (; n > 0; n--) {
|
||||||
int x= *src++;
|
int v = *src++;
|
||||||
if(x&128) x-= 128;
|
if (v < 128)
|
||||||
else x = -x;
|
v = 128 - v;
|
||||||
AV_WN16A(samples, x << 8);
|
*samples++ = v;
|
||||||
samples += 2;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_PCM_ALAW:
|
case CODEC_ID_PCM_ALAW:
|
||||||
@ -409,6 +402,8 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_PCM_DVD:
|
case CODEC_ID_PCM_DVD:
|
||||||
|
{
|
||||||
|
const uint8_t *src8;
|
||||||
dst_int32_t = data;
|
dst_int32_t = data;
|
||||||
n /= avctx->channels;
|
n /= avctx->channels;
|
||||||
switch (avctx->bits_per_coded_sample) {
|
switch (avctx->bits_per_coded_sample) {
|
||||||
@ -434,15 +429,14 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
src = src8;
|
src = src8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
av_log(avctx, AV_LOG_ERROR,
|
|
||||||
"PCM DVD unsupported sample depth %i\n",
|
|
||||||
avctx->bits_per_coded_sample);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
samples = (uint8_t *) dst_int32_t;
|
samples = (uint8_t *) dst_int32_t;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case CODEC_ID_PCM_LXF:
|
case CODEC_ID_PCM_LXF:
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const uint8_t *src8;
|
||||||
dst_int32_t = data;
|
dst_int32_t = data;
|
||||||
n /= avctx->channels;
|
n /= avctx->channels;
|
||||||
//unpack and de-planerize
|
//unpack and de-planerize
|
||||||
@ -459,14 +453,14 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
|||||||
((src8[2] & 0xF0) << 8) | (src8[4] << 4) | (src8[3] >> 4);
|
((src8[2] & 0xF0) << 8) | (src8[4] << 4) | (src8[3] >> 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
src += n * avctx->channels * 5;
|
|
||||||
samples = (uint8_t *) dst_int32_t;
|
samples = (uint8_t *) dst_int32_t;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*data_size = samples - (uint8_t *)data;
|
*data_size = out_size;
|
||||||
return src - buf;
|
return buf_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_ENCODERS
|
#if CONFIG_ENCODERS
|
||||||
@ -529,4 +523,4 @@ PCM_CODEC (CODEC_ID_PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be, "PCM unsigned 24-b
|
|||||||
PCM_CODEC (CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian");
|
PCM_CODEC (CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian");
|
||||||
PCM_CODEC (CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian");
|
PCM_CODEC (CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian");
|
||||||
PCM_CODEC (CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian");
|
PCM_CODEC (CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian");
|
||||||
PCM_CODEC (CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_S16, pcm_zork, "PCM Zork");
|
PCM_DECODER(CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork");
|
||||||
|
@ -686,6 +686,7 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count)
|
|||||||
av_freep(&fctx->threads);
|
av_freep(&fctx->threads);
|
||||||
pthread_mutex_destroy(&fctx->buffer_mutex);
|
pthread_mutex_destroy(&fctx->buffer_mutex);
|
||||||
av_freep(&avctx->thread_opaque);
|
av_freep(&avctx->thread_opaque);
|
||||||
|
avctx->has_b_frames -= avctx->thread_count - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int frame_thread_init(AVCodecContext *avctx)
|
static int frame_thread_init(AVCodecContext *avctx)
|
||||||
|
@ -2666,18 +2666,18 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
|
|||||||
}
|
}
|
||||||
if(mm_flags & AV_CPU_FLAG_SSE2){
|
if(mm_flags & AV_CPU_FLAG_SSE2){
|
||||||
if (!high_bit_depth) {
|
if (!high_bit_depth) {
|
||||||
H264_QPEL_FUNCS(0, 1, sse2);
|
H264_QPEL_FUNCS(0, 1, sse2);
|
||||||
H264_QPEL_FUNCS(0, 2, sse2);
|
H264_QPEL_FUNCS(0, 2, sse2);
|
||||||
H264_QPEL_FUNCS(0, 3, sse2);
|
H264_QPEL_FUNCS(0, 3, sse2);
|
||||||
H264_QPEL_FUNCS(1, 1, sse2);
|
H264_QPEL_FUNCS(1, 1, sse2);
|
||||||
H264_QPEL_FUNCS(1, 2, sse2);
|
H264_QPEL_FUNCS(1, 2, sse2);
|
||||||
H264_QPEL_FUNCS(1, 3, sse2);
|
H264_QPEL_FUNCS(1, 3, sse2);
|
||||||
H264_QPEL_FUNCS(2, 1, sse2);
|
H264_QPEL_FUNCS(2, 1, sse2);
|
||||||
H264_QPEL_FUNCS(2, 2, sse2);
|
H264_QPEL_FUNCS(2, 2, sse2);
|
||||||
H264_QPEL_FUNCS(2, 3, sse2);
|
H264_QPEL_FUNCS(2, 3, sse2);
|
||||||
H264_QPEL_FUNCS(3, 1, sse2);
|
H264_QPEL_FUNCS(3, 1, sse2);
|
||||||
H264_QPEL_FUNCS(3, 2, sse2);
|
H264_QPEL_FUNCS(3, 2, sse2);
|
||||||
H264_QPEL_FUNCS(3, 3, sse2);
|
H264_QPEL_FUNCS(3, 3, sse2);
|
||||||
}
|
}
|
||||||
#if HAVE_YASM
|
#if HAVE_YASM
|
||||||
#define H264_QPEL_FUNCS_10(x, y, CPU)\
|
#define H264_QPEL_FUNCS_10(x, y, CPU)\
|
||||||
|
@ -393,6 +393,5 @@ do_audio_enc_dec au flt pcm_f32be
|
|||||||
do_audio_enc_dec wav flt pcm_f32le
|
do_audio_enc_dec wav flt pcm_f32le
|
||||||
do_audio_enc_dec au dbl pcm_f64be
|
do_audio_enc_dec au dbl pcm_f64be
|
||||||
do_audio_enc_dec wav dbl pcm_f64le
|
do_audio_enc_dec wav dbl pcm_f64le
|
||||||
do_audio_enc_dec wav s16 pcm_zork
|
|
||||||
do_audio_enc_dec 302 s16 pcm_s24daud "-ac 6 -ar 96000"
|
do_audio_enc_dec 302 s16 pcm_s24daud "-ac 6 -ar 96000"
|
||||||
fi
|
fi
|
||||||
|
@ -62,10 +62,6 @@ ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav
|
|||||||
4233680 ./tests/data/acodec/pcm_f64le.wav
|
4233680 ./tests/data/acodec/pcm_f64le.wav
|
||||||
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
|
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
|
||||||
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
|
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
|
||||||
ebd38ed390ebdefe0bdf00d21bf12c6b *./tests/data/acodec/pcm_zork.wav
|
|
||||||
529258 ./tests/data/acodec/pcm_zork.wav
|
|
||||||
7b02646acdd063650bb3ebc444543ace *./tests/data/pcm.acodec.out.wav
|
|
||||||
stddev: 633.11 PSNR: 40.30 MAXDIFF:32768 bytes: 1058400/ 1058400
|
|
||||||
1b75d5198ae789ab3c48f7024e08f4a9 *./tests/data/acodec/pcm_s24daud.302
|
1b75d5198ae789ab3c48f7024e08f4a9 *./tests/data/acodec/pcm_s24daud.302
|
||||||
10368730 ./tests/data/acodec/pcm_s24daud.302
|
10368730 ./tests/data/acodec/pcm_s24daud.302
|
||||||
4708f86529c594e29404603c64bb208c *./tests/data/pcm.acodec.out.wav
|
4708f86529c594e29404603c64bb208c *./tests/data/pcm.acodec.out.wav
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts:-1.000000
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts: 1.894167
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.894127 pts: 1.894127 pos: 30364 size: 4096
|
|
||||||
ret: 0 st: 0 flags:0 ts: 0.788345
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.788367 pts: 0.788367 pos: 12672 size: 4096
|
|
||||||
ret: 0 st: 0 flags:1 ts:-0.317506
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts: 2.576668
|
|
||||||
ret: 0 st: 0 flags:1 dts: 2.576757 pts: 2.576757 pos: 41286 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts: 1.470835
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.470748 pts: 1.470748 pos: 23590 size: 4096
|
|
||||||
ret: 0 st: 0 flags:0 ts: 0.365011
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.365125 pts: 0.365125 pos: 5900 size: 4096
|
|
||||||
ret: 0 st: 0 flags:1 ts:-0.740839
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts: 2.153336
|
|
||||||
ret: 0 st: 0 flags:1 dts: 2.153379 pts: 2.153379 pos: 34512 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts: 1.047503
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 16818 size: 4096
|
|
||||||
ret: 0 st: 0 flags:0 ts:-0.058322
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st: 0 flags:1 ts: 2.835828
|
|
||||||
ret: 0 st: 0 flags:1 dts: 2.835760 pts: 2.835760 pos: 45430 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts: 1.730004
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 27738 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts: 0.624171
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.624127 pts: 0.624127 pos: 10044 size: 4096
|
|
||||||
ret: 0 st: 0 flags:0 ts:-0.481655
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st: 0 flags:1 ts: 2.412494
|
|
||||||
ret: 0 st: 0 flags:1 dts: 2.412381 pts: 2.412381 pos: 38656 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts: 1.306672
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.306757 pts: 1.306757 pos: 20966 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts: 0.200839
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.200748 pts: 0.200748 pos: 3270 size: 4096
|
|
||||||
ret: 0 st: 0 flags:0 ts:-0.904989
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st: 0 flags:1 ts: 1.989184
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.989116 pts: 1.989116 pos: 31884 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts: 0.883340
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.883379 pts: 0.883379 pos: 14192 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts:-0.222493
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
||||||
ret: 0 st: 0 flags:0 ts: 2.671678
|
|
||||||
ret: 0 st: 0 flags:1 dts: 2.671746 pts: 2.671746 pos: 42806 size: 4096
|
|
||||||
ret: 0 st: 0 flags:1 ts: 1.565850
|
|
||||||
ret: 0 st: 0 flags:1 dts: 1.565760 pts: 1.565760 pos: 25110 size: 4096
|
|
||||||
ret: 0 st:-1 flags:0 ts: 0.460008
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 7418 size: 4096
|
|
||||||
ret: 0 st:-1 flags:1 ts:-0.645825
|
|
||||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
|
|
Loading…
Reference in New Issue
Block a user