Merge remote-tracking branch 'qatar/master'
* qatar/master: aac_latm: reconfigure decoder on audio specific config changes latmdec: fix audio specific config parsing Add avcodec_decode_audio4(). avcodec: change number of plane pointers from 4 to 8 at next major bump. Update developers documentation with coding conventions. svq1dec: avoid undefined get_bits(0) call ARM: h264dsp_neon cosmetics ARM: make some NEON macros reusable Do not memcpy raw video frames when using null muxer fate: update asf seektest vp8: flush buffers on size changes. doc: improve general documentation for MacOSX asf: use packet dts as approximation of pts asf: do not call av_read_frame rtsp: Initialize the media_type_mask in the rtp guessing demuxer Cleaned up alacenc.c Conflicts: doc/APIchanges doc/developer.texi libavcodec/8svx.c libavcodec/aacdec.c libavcodec/ac3dec.c libavcodec/avcodec.h libavcodec/nellymoserdec.c libavcodec/tta.c libavcodec/utils.c libavcodec/version.h libavcodec/wmadec.c libavformat/asfdec.c tests/ref/seek/lavf_asf Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -559,31 +559,43 @@ static av_cold int decode_end(AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
|
||||
typedef struct SmackerAudioContext {
|
||||
AVFrame frame;
|
||||
} SmackerAudioContext;
|
||||
|
||||
static av_cold int smka_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
SmackerAudioContext *s = avctx->priv_data;
|
||||
|
||||
if (avctx->channels < 1 || avctx->channels > 2) {
|
||||
av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
|
||||
avctx->sample_fmt = avctx->bits_per_coded_sample == 8 ? AV_SAMPLE_FMT_U8 : AV_SAMPLE_FMT_S16;
|
||||
|
||||
avcodec_get_frame_defaults(&s->frame);
|
||||
avctx->coded_frame = &s->frame;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode Smacker audio data
|
||||
*/
|
||||
static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
|
||||
static int smka_decode_frame(AVCodecContext *avctx, void *data,
|
||||
int *got_frame_ptr, AVPacket *avpkt)
|
||||
{
|
||||
SmackerAudioContext *s = avctx->priv_data;
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
GetBitContext gb;
|
||||
HuffContext h[4];
|
||||
VLC vlc[4];
|
||||
int16_t *samples = data;
|
||||
uint8_t *samples8 = data;
|
||||
int16_t *samples;
|
||||
uint8_t *samples8;
|
||||
int val;
|
||||
int i, res;
|
||||
int i, res, ret;
|
||||
int unp_size;
|
||||
int bits, stereo;
|
||||
int pred[2] = {0, 0};
|
||||
@@ -599,15 +611,11 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
|
||||
if(!get_bits1(&gb)){
|
||||
av_log(avctx, AV_LOG_INFO, "Sound: no data\n");
|
||||
*data_size = 0;
|
||||
*got_frame_ptr = 0;
|
||||
return 1;
|
||||
}
|
||||
stereo = get_bits1(&gb);
|
||||
bits = get_bits1(&gb);
|
||||
if (unp_size & 0xC0000000 || unp_size > *data_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
|
||||
return -1;
|
||||
}
|
||||
if (stereo ^ (avctx->channels != 1)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "channels mismatch\n");
|
||||
return AVERROR(EINVAL);
|
||||
@@ -617,6 +625,15 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
/* get output buffer */
|
||||
s->frame.nb_samples = unp_size / (avctx->channels * (bits + 1));
|
||||
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return ret;
|
||||
}
|
||||
samples = (int16_t *)s->frame.data[0];
|
||||
samples8 = s->frame.data[0];
|
||||
|
||||
memset(vlc, 0, sizeof(VLC) * 4);
|
||||
memset(h, 0, sizeof(HuffContext) * 4);
|
||||
// Initialize
|
||||
@@ -706,7 +723,9 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
av_free(h[i].values);
|
||||
}
|
||||
|
||||
*data_size = unp_size;
|
||||
*got_frame_ptr = 1;
|
||||
*(AVFrame *)data = s->frame;
|
||||
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
@@ -726,8 +745,10 @@ AVCodec ff_smackaud_decoder = {
|
||||
.name = "smackaud",
|
||||
.type = AVMEDIA_TYPE_AUDIO,
|
||||
.id = CODEC_ID_SMACKAUDIO,
|
||||
.priv_data_size = sizeof(SmackerAudioContext),
|
||||
.init = smka_decode_init,
|
||||
.decode = smka_decode_frame,
|
||||
.capabilities = CODEC_CAP_DR1,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Smacker audio"),
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user