diff --git a/doc/general.texi b/doc/general.texi index eb2545352c..cbba43d492 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -683,7 +683,7 @@ following image formats are supported: @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 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 QDesign Music Codec 2 @tab @tab X @tab There are still some distortions. diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 8e182553c9..d17a1648de 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -508,7 +508,6 @@ OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_U32LE_ENCODER) += 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_ADX_DECODER) += adxdec.o diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 7c8d74e857..117cd587ee 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2501,9 +2501,6 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out, int *out_size, int muxlength, err; GetBitContext gb; - if (avpkt->size == 0) - return 0; - init_get_bits(&gb, avpkt->data, avpkt->size * 8); // check for LOAS sync word diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 06bf6f8c78..4e143270a5 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -72,7 +72,7 @@ typedef struct { int32_t *outputsamples_buffer[MAX_CHANNELS]; - int32_t *wasted_bits_buffer[MAX_CHANNELS]; + int32_t *extra_bits_buffer[MAX_CHANNELS]; /* stuff from setinfo */ 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 */ /* end setinfo stuff */ - int wasted_bits; + int extra_bits; /**< number of extra bits beyond 16-bit */ } 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){ /* read x - number of 1s before 0 represent the rice */ 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], - int16_t *buffer_out, - int numchannels, int numsamples, - uint8_t interlacing_shift, - uint8_t interlacing_leftweight) +static void decorrelate_stereo(int32_t *buffer[MAX_CHANNELS], + int numsamples, uint8_t interlacing_shift, + uint8_t interlacing_leftweight) { 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++) { - int16_t left, right; + int32_t a, b; - left = buffer[0][i]; - right = buffer[1][i]; + a = buffer[0][i]; + b = buffer[1][i]; - buffer_out[i*numchannels] = left; - buffer_out[i*numchannels + 1] = right; + a -= (b * interlacing_leftweight) >> interlacing_shift; + b += a; + + buffer[0][i] = b; + buffer[1][i] = a; } } -static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], - int32_t *buffer_out, - int32_t *wasted_bits_buffer[MAX_CHANNELS], - int wasted_bits, - int numchannels, int numsamples, - uint8_t interlacing_shift, - uint8_t interlacing_leftweight) +static void append_extra_bits(int32_t *buffer[MAX_CHANNELS], + int32_t *extra_bits_buffer[MAX_CHANNELS], + int extra_bits, int numchannels, int numsamples) +{ + int i, ch; + + 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; - if (numsamples <= 0) - return; + for (i = 0; i < numsamples; i++) { + *buffer_out++ = buffer[0][i]; + *buffer_out++ = buffer[1][i]; + } +} - /* weighted interlacing */ - if (interlacing_leftweight) { - for (i = 0; i < numsamples; i++) { - int32_t a, b; +static void interleave_stereo_24(int32_t *buffer[MAX_CHANNELS], + int32_t *buffer_out, int numsamples) +{ + int i; - a = buffer[0][i]; - b = buffer[1][i]; - - 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; - } + for (i = 0; i < numsamples; i++) { + *buffer_out++ = buffer[0][i] << 8; + *buffer_out++ = buffer[1][i] << 8; } } @@ -452,18 +366,14 @@ static int alac_decode_frame(AVCodecContext *avctx, int isnotcompressed; uint8_t interlacing_shift; uint8_t interlacing_leftweight; - - /* short-circuit null buffers */ - if (!inbuffer || !input_buffer_size) - return -1; + int i, ch; init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8); channels = get_bits(&alac->gb, 3) + 1; - if (channels > MAX_CHANNELS) { - av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n", - MAX_CHANNELS); - return -1; + if (channels != avctx->channels) { + av_log(avctx, AV_LOG_ERROR, "frame header channel count mismatch\n"); + return AVERROR_INVALIDDATA; } /* 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 */ 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 */ isnotcompressed = get_bits1(&alac->gb); @@ -491,17 +401,7 @@ static int alac_decode_frame(AVCodecContext *avctx, } else outputsamples = alac->setinfo_max_samples_per_frame; - switch (alac->setinfo_sample_size) { - 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; - } + alac->bytespersample = channels * av_get_bytes_per_sample(avctx->sample_fmt); if(outputsamples > *outputsize / alac->bytespersample){ 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; - 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) { av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n", readsamplesize); return -1; @@ -522,51 +422,49 @@ static int alac_decode_frame(AVCodecContext *avctx, int prediction_type[MAX_CHANNELS]; int prediction_quantitization[MAX_CHANNELS]; int ricemodifier[MAX_CHANNELS]; - int i, chan; interlacing_shift = get_bits(&alac->gb, 8); interlacing_leftweight = get_bits(&alac->gb, 8); - for (chan = 0; chan < channels; chan++) { - prediction_type[chan] = get_bits(&alac->gb, 4); - prediction_quantitization[chan] = get_bits(&alac->gb, 4); + for (ch = 0; ch < channels; ch++) { + prediction_type[ch] = get_bits(&alac->gb, 4); + prediction_quantitization[ch] = get_bits(&alac->gb, 4); - ricemodifier[chan] = get_bits(&alac->gb, 3); - predictor_coef_num[chan] = get_bits(&alac->gb, 5); + ricemodifier[ch] = get_bits(&alac->gb, 3); + predictor_coef_num[ch] = get_bits(&alac->gb, 5); /* read the predictor table */ - for (i = 0; i < predictor_coef_num[chan]; i++) - predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16); + for (i = 0; i < predictor_coef_num[ch]; i++) + predictor_coef_table[ch][i] = (int16_t)get_bits(&alac->gb, 16); } - if (alac->wasted_bits) { - int i, ch; + if (alac->extra_bits) { for (i = 0; i < outputsamples; i++) { 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, - alac->predicterror_buffer[chan], + alac->predicterror_buffer[ch], outputsamples, readsamplesize, alac->setinfo_rice_initialhistory, alac->setinfo_rice_kmodifier, - ricemodifier[chan] * alac->setinfo_rice_historymult / 4, + ricemodifier[ch] * alac->setinfo_rice_historymult / 4, (1 << alac->setinfo_rice_kmodifier) - 1); - if (prediction_type[chan] == 0) { + if (prediction_type[ch] == 0) { /* adaptive fir */ - predictor_decompress_fir_adapt(alac->predicterror_buffer[chan], - alac->outputsamples_buffer[chan], + predictor_decompress_fir_adapt(alac->predicterror_buffer[ch], + alac->outputsamples_buffer[ch], outputsamples, readsamplesize, - predictor_coef_table[chan], - predictor_coef_num[chan], - prediction_quantitization[chan]); + predictor_coef_table[ch], + predictor_coef_num[ch], + prediction_quantitization[ch]); } 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 * just a boolean?) runs adaptive fir twice.. like: * predictor_decompress_fir_adapt(predictor_error, tempout, ...) @@ -577,44 +475,35 @@ static int alac_decode_frame(AVCodecContext *avctx, } } else { /* not compressed, easy case */ - int i, chan; - if (alac->setinfo_sample_size <= 16) { - for (i = 0; i < outputsamples; i++) - for (chan = 0; chan < channels; chan++) { - 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); - } + for (i = 0; i < outputsamples; i++) { + for (ch = 0; ch < channels; ch++) { + alac->outputsamples_buffer[ch][i] = get_sbits_long(&alac->gb, + alac->setinfo_sample_size); } } - alac->wasted_bits = 0; + alac->extra_bits = 0; interlacing_shift = 0; interlacing_leftweight = 0; } if (get_bits(&alac->gb, 3) != 7) 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) { case 16: if (channels == 2) { - reconstruct_stereo_16(alac->outputsamples_buffer, - (int16_t*)outbuffer, - alac->numchannels, - outputsamples, - interlacing_shift, - interlacing_leftweight); + interleave_stereo_16(alac->outputsamples_buffer, outbuffer, + outputsamples); } else { - int i; for (i = 0; i < outputsamples; i++) { ((int16_t*)outbuffer)[i] = alac->outputsamples_buffer[0][i]; } @@ -622,16 +511,9 @@ static int alac_decode_frame(AVCodecContext *avctx, break; case 24: if (channels == 2) { - decorrelate_stereo_24(alac->outputsamples_buffer, - outbuffer, - alac->wasted_bits_buffer, - alac->wasted_bits, - alac->numchannels, - outputsamples, - interlacing_shift, - interlacing_leftweight); + interleave_stereo_24(alac->outputsamples_buffer, outbuffer, + outputsamples); } else { - int i; for (i = 0; i < outputsamples; i++) ((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; } -static av_cold int alac_decode_init(AVCodecContext * avctx) +static av_cold int alac_decode_close(AVCodecContext *avctx) { 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->numchannels = alac->avctx->channels; /* initialize from the extradata */ if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) { @@ -661,18 +607,34 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) 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) -{ - ALACContext *alac = avctx->priv_data; + if (alac->numchannels < 1) { + av_log(avctx, AV_LOG_WARNING, "Invalid channel count\n"); + 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; - for (chan = 0; chan < MAX_CHANNELS; chan++) { - av_freep(&alac->predicterror_buffer[chan]); - av_freep(&alac->outputsamples_buffer[chan]); - av_freep(&alac->wasted_bits_buffer[chan]); + if ((ret = allocate_buffers(alac)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Error allocating buffers\n"); + return ret; } return 0; diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 2417382137..b8c28e3f4a 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -329,7 +329,7 @@ void avcodec_register_all(void) REGISTER_ENCDEC (PCM_U24LE, pcm_u24le); REGISTER_ENCDEC (PCM_U32BE, pcm_u32be); REGISTER_ENCDEC (PCM_U32LE, pcm_u32le); - REGISTER_ENCDEC (PCM_ZORK , pcm_zork); + REGISTER_DECODER (PCM_ZORK , pcm_zork); /* DPCM codecs */ REGISTER_DECODER (INTERPLAY_DPCM, interplay_dpcm); diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c index 7af773f581..e456c407a4 100644 --- a/libavcodec/libopencore-amr.c +++ b/libavcodec/libopencore-amr.c @@ -79,7 +79,6 @@ static int get_bitrate_mode(int bitrate, void *log_ctx) typedef struct AMRContext { AVClass *av_class; - int frame_count; void *dec_state; void *enc_state; int enc_bitrate; @@ -100,7 +99,6 @@ static av_cold int amr_nb_decode_init(AVCodecContext *avctx) { AMRContext *s = avctx->priv_data; - s->frame_count = 0; s->dec_state = Decoder_Interface_init(); if (!s->dec_state) { 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; 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; - int packet_size; + int packet_size, out_size; 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; packet_size = block_size[dec_mode] + 1; @@ -147,12 +151,11 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - s->frame_count++; av_dlog(avctx, "packet_size=%d buf= 0x%X %X %X %X\n", packet_size, buf[0], buf[1], buf[2], buf[3]); /* call decoder */ Decoder_Interface_Decode(s->dec_state, buf, data, 0); - *data_size = 160 * 2; + *data_size = out_size; return packet_size; } @@ -172,8 +175,6 @@ static av_cold int amr_nb_encode_init(AVCodecContext *avctx) { AMRContext *s = avctx->priv_data; - s->frame_count = 0; - if (avctx->sample_rate != 8000) { av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n"); return AVERROR(ENOSYS); @@ -276,12 +277,14 @@ static int amr_wb_decode_frame(AVCodecContext *avctx, void *data, int buf_size = avpkt->size; AMRWBContext *s = avctx->priv_data; 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}; - if (!buf_size) - /* nothing to do */ - return 0; + out_size = 320 * 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); + } mode = (buf[0] >> 3) & 0x000F; 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); - *data_size = 320 * 2; + *data_size = out_size; return packet_size; } diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 0c18e0f0d7..0bc0882081 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -95,11 +95,6 @@ static int pcm_encode_frame(AVCodecContext *avctx, samples = data; 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) { case CODEC_ID_PCM_U32LE: 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); dst += n*sample_size; 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: for(;n>0;n--) { v = *samples++; @@ -213,6 +200,11 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx) PCMDecode *s = avctx->priv_data; 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) { case CODEC_ID_PCM_ALAW: for(i=0;i<256;i++) @@ -255,34 +247,29 @@ static int pcm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { - const uint8_t *buf = avpkt->data; + const uint8_t *src = avpkt->data; int buf_size = avpkt->size; PCMDecode *s = avctx->priv_data; - int sample_size, c, n, i; + int sample_size, c, n, out_size; uint8_t *samples; - const uint8_t *src, *src8, *src2[MAX_CHANNELS]; int32_t *dst_int32_t; 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; /* 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 */ 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 */ sample_size = 5; @@ -301,11 +288,17 @@ static int pcm_decode_frame(AVCodecContext *avctx, buf_size -= buf_size % n; } - buf_size= FFMIN(buf_size, *data_size/2); - *data_size=0; - 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) { case CODEC_ID_PCM_U32LE: DECODE(32, le32, src, samples, n, 0, 0x80000000) @@ -335,6 +328,8 @@ static int pcm_decode_frame(AVCodecContext *avctx, } break; case CODEC_ID_PCM_S16LE_PLANAR: + { + const uint8_t *src2[MAX_CHANNELS]; n /= avctx->channels; for(c=0;cchannels;c++) 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])); samples += 2; } - src = src2[avctx->channels-1]; break; + } case CODEC_ID_PCM_U16LE: DECODE(16, le16, src, samples, n, 0, 0x8000) break; @@ -389,16 +384,14 @@ static int pcm_decode_frame(AVCodecContext *avctx, #endif /* HAVE_BIGENDIAN */ case CODEC_ID_PCM_U8: memcpy(samples, src, n*sample_size); - src += n*sample_size; samples += n * sample_size; break; case CODEC_ID_PCM_ZORK: - for(;n>0;n--) { - int x= *src++; - if(x&128) x-= 128; - else x = -x; - AV_WN16A(samples, x << 8); - samples += 2; + for (; n > 0; n--) { + int v = *src++; + if (v < 128) + v = 128 - v; + *samples++ = v; } break; case CODEC_ID_PCM_ALAW: @@ -409,6 +402,8 @@ static int pcm_decode_frame(AVCodecContext *avctx, } break; case CODEC_ID_PCM_DVD: + { + const uint8_t *src8; dst_int32_t = data; n /= avctx->channels; switch (avctx->bits_per_coded_sample) { @@ -434,15 +429,14 @@ static int pcm_decode_frame(AVCodecContext *avctx, src = src8; } 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; break; + } case CODEC_ID_PCM_LXF: + { + int i; + const uint8_t *src8; dst_int32_t = data; n /= avctx->channels; //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); } } - src += n * avctx->channels * 5; samples = (uint8_t *) dst_int32_t; break; + } default: return -1; } - *data_size = samples - (uint8_t *)data; - return src - buf; + *data_size = out_size; + return buf_size; } #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_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_ZORK, AV_SAMPLE_FMT_S16, pcm_zork, "PCM Zork"); +PCM_DECODER(CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork"); diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index b6ebea4407..96db9aec9c 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -686,6 +686,7 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count) av_freep(&fctx->threads); pthread_mutex_destroy(&fctx->buffer_mutex); av_freep(&avctx->thread_opaque); + avctx->has_b_frames -= avctx->thread_count - 1; } static int frame_thread_init(AVCodecContext *avctx) diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index 2322a29fb7..50955b8f2c 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -2666,18 +2666,18 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) } if(mm_flags & AV_CPU_FLAG_SSE2){ if (!high_bit_depth) { - H264_QPEL_FUNCS(0, 1, sse2); - H264_QPEL_FUNCS(0, 2, sse2); - H264_QPEL_FUNCS(0, 3, sse2); - H264_QPEL_FUNCS(1, 1, sse2); - H264_QPEL_FUNCS(1, 2, sse2); - H264_QPEL_FUNCS(1, 3, sse2); - H264_QPEL_FUNCS(2, 1, sse2); - H264_QPEL_FUNCS(2, 2, sse2); - H264_QPEL_FUNCS(2, 3, sse2); - H264_QPEL_FUNCS(3, 1, sse2); - H264_QPEL_FUNCS(3, 2, sse2); - H264_QPEL_FUNCS(3, 3, sse2); + H264_QPEL_FUNCS(0, 1, sse2); + H264_QPEL_FUNCS(0, 2, sse2); + H264_QPEL_FUNCS(0, 3, sse2); + H264_QPEL_FUNCS(1, 1, sse2); + H264_QPEL_FUNCS(1, 2, sse2); + H264_QPEL_FUNCS(1, 3, sse2); + H264_QPEL_FUNCS(2, 1, sse2); + H264_QPEL_FUNCS(2, 2, sse2); + H264_QPEL_FUNCS(2, 3, sse2); + H264_QPEL_FUNCS(3, 1, sse2); + H264_QPEL_FUNCS(3, 2, sse2); + H264_QPEL_FUNCS(3, 3, sse2); } #if HAVE_YASM #define H264_QPEL_FUNCS_10(x, y, CPU)\ diff --git a/tests/codec-regression.sh b/tests/codec-regression.sh index 0c8ad67208..21b510fda3 100755 --- a/tests/codec-regression.sh +++ b/tests/codec-regression.sh @@ -393,6 +393,5 @@ do_audio_enc_dec au flt pcm_f32be do_audio_enc_dec wav flt pcm_f32le do_audio_enc_dec au dbl pcm_f64be 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" fi diff --git a/tests/ref/acodec/pcm b/tests/ref/acodec/pcm index 696efe1663..5d810d04f2 100644 --- a/tests/ref/acodec/pcm +++ b/tests/ref/acodec/pcm @@ -62,10 +62,6 @@ ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav 4233680 ./tests/data/acodec/pcm_f64le.wav 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav 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 10368730 ./tests/data/acodec/pcm_s24daud.302 4708f86529c594e29404603c64bb208c *./tests/data/pcm.acodec.out.wav diff --git a/tests/ref/seek/pcm_zork_wav b/tests/ref/seek/pcm_zork_wav deleted file mode 100644 index 22d95bf27f..0000000000 --- a/tests/ref/seek/pcm_zork_wav +++ /dev/null @@ -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