diff options
author | Nidhi Makhijani <nidhimj22@gmail.com> | 2014-07-06 10:12:50 +0530 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2014-07-06 09:36:17 -0700 |
commit | b0633f83f277c05bf1f617a99c7aedd2db8306e3 (patch) | |
tree | 36551db014c19a1d0f12f253e125023093dbe76c /libavcodec/pafaudio.c | |
parent | 373a6dda5422186bc057297342a9e559a564595e (diff) | |
download | ffmpeg-b0633f83f277c05bf1f617a99c7aedd2db8306e3.tar.gz |
paf: split audio and video decoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diffstat (limited to 'libavcodec/pafaudio.c')
-rw-r--r-- | libavcodec/pafaudio.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/libavcodec/pafaudio.c b/libavcodec/pafaudio.c new file mode 100644 index 0000000000..52aaabfcd5 --- /dev/null +++ b/libavcodec/pafaudio.c @@ -0,0 +1,84 @@ +/* + * Packed Animation File audio decoder + * Copyright (c) 2012 Paul B Mahol + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" + +#include "avcodec.h" +#include "internal.h" +#include "mathops.h" + +#define PAF_SOUND_SAMPLES 2205 +#define PAF_SOUND_FRAME_SIZE ((256 + PAF_SOUND_SAMPLES) * 2) + +static av_cold int paf_audio_init(AVCodecContext *avctx) +{ + if (avctx->channels != 2) { + av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n"); + return AVERROR_INVALIDDATA; + } + + avctx->channel_layout = AV_CH_LAYOUT_STEREO; + avctx->sample_fmt = AV_SAMPLE_FMT_S16; + + return 0; +} + +static int paf_audio_decode(AVCodecContext *avctx, void *data, + int *got_frame, AVPacket *pkt) +{ + AVFrame *frame = data; + int16_t *output_samples; + const uint8_t *src = pkt->data; + int frames, ret, i, j; + int16_t cb[256]; + + frames = pkt->size / PAF_SOUND_FRAME_SIZE; + if (frames < 1) + return AVERROR_INVALIDDATA; + + frame->nb_samples = PAF_SOUND_SAMPLES * frames; + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) + return ret; + + output_samples = (int16_t *)frame->data[0]; + // codebook of 256 16-bit samples and 8-bit indices to it + for (j = 0; j < frames; j++) { + for (i = 0; i < 256; i++) + cb[i] = sign_extend(AV_RL16(src + i * 2), 16); + src += 256 * 2; + // always 2 channels + for (i = 0; i < PAF_SOUND_SAMPLES * 2; i++) + *output_samples++ = cb[*src++]; + } + *got_frame = 1; + + return pkt->size; +} + +AVCodec ff_paf_audio_decoder = { + .name = "paf_audio", + .long_name = NULL_IF_CONFIG_SMALL("Amazing Studio Packed Animation File Audio"), + .type = AVMEDIA_TYPE_AUDIO, + .id = AV_CODEC_ID_PAF_AUDIO, + .init = paf_audio_init, + .decode = paf_audio_decode, + .capabilities = CODEC_CAP_DR1, +}; |