On Thu, Apr 28, 2011 at 11:08 AM, Diego Biurrun <di...@biurrun.de> wrote: > > From: Baptiste Coudurier <baptiste.coudur...@gmail.com> > > Ported-by: Alex Converse <aconve...@google.com> > --- > > This includes all review comments so far, plus a documentation entry > and random prettyprinting. > > Changelog | 2 + > doc/general.texi | 1 + > libavcodec/Makefile | 1 + > libavcodec/allcodecs.c | 1 + > libavcodec/avcodec.h | 1 + > libavcodec/s302m.c | 141 > ++++++++++++++++++++++++++++++++++++++++++++++++ > libavcodec/version.h | 4 +- > libavformat/mpegts.c | 1 + > 8 files changed, 150 insertions(+), 2 deletions(-) > create mode 100644 libavcodec/s302m.c > > diff --git a/Changelog b/Changelog > index 144f55c..2e3ed9f 100644 > --- a/Changelog > +++ b/Changelog > @@ -6,6 +6,8 @@ version <next>: > > - Lots of deprecated API cruft removed > - fft and imdct optimizations for AVX (Sandy Bridge) processors > +- SMPTE 302M AES3 audio decoder > + > > version 0.7_beta1: > > diff --git a/doc/general.texi b/doc/general.texi > index e68e83e..675791d 100644 > --- a/doc/general.texi > +++ b/doc/general.texi > @@ -673,6 +673,7 @@ following image formats are supported: > @item Sierra VMD audio @tab @tab X > @tab Used in Sierra VMD files. > @item Smacker audio @tab @tab X > +@item SMPTE 302M AES3 audio @tab @tab X > @item Speex @tab @tab E > @tab supported through external library libspeex > @item True Audio (TTA) @tab @tab X > diff --git a/libavcodec/Makefile b/libavcodec/Makefile > index fad435d..47dbfe1 100644 > --- a/libavcodec/Makefile > +++ b/libavcodec/Makefile > @@ -323,6 +323,7 @@ OBJS-$(CONFIG_RV30_DECODER) += rv30.o rv34.o > rv30dsp.o \ > mpegvideo.o error_resilience.o > OBJS-$(CONFIG_RV40_DECODER) += rv40.o rv34.o rv40dsp.o \ > mpegvideo.o error_resilience.o > +OBJS-$(CONFIG_S302M_DECODER) += s302m.o > OBJS-$(CONFIG_SGI_DECODER) += sgidec.o > OBJS-$(CONFIG_SGI_ENCODER) += sgienc.o rle.o > OBJS-$(CONFIG_SHORTEN_DECODER) += shorten.o > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > index 40a7e23..aa2e7dc 100644 > --- a/libavcodec/allcodecs.c > +++ b/libavcodec/allcodecs.c > @@ -177,6 +177,7 @@ void avcodec_register_all(void) > REGISTER_ENCDEC (RV20, rv20); > REGISTER_DECODER (RV30, rv30); > REGISTER_DECODER (RV40, rv40); > + REGISTER_DECODER (S302M, s302m); > REGISTER_ENCDEC (SGI, sgi); > REGISTER_DECODER (SMACKER, smacker); > REGISTER_DECODER (SMC, smc); > diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h > index eb5c5b3..b362909 100644 > --- a/libavcodec/avcodec.h > +++ b/libavcodec/avcodec.h > @@ -232,6 +232,7 @@ enum CodecID { > CODEC_ID_PCM_F64LE, > CODEC_ID_PCM_BLURAY, > CODEC_ID_PCM_LXF, > + CODEC_ID_S302M, > > /* various ADPCM codecs */ > CODEC_ID_ADPCM_IMA_QT= 0x11000, > diff --git a/libavcodec/s302m.c b/libavcodec/s302m.c > new file mode 100644 > index 0000000..1b3ca2e > --- /dev/null > +++ b/libavcodec/s302m.c > @@ -0,0 +1,141 @@ > +/* > + * SMPTE 302M decoder > + * Copyright (c) 2008 Laurent Aimar <fen...@videolan.org> > + * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudur...@gmail.com> > + * > + * 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" > + > +#define AES3_HEADER_LEN 4 > + > +static int s302m_parse_frame_header(AVCodecContext *avctx, const uint8_t > *buf, > + int buf_size) > +{ > + uint32_t h; > + int frame_size, channels, id, bits; > + > + if (buf_size <= AES3_HEADER_LEN) { > + av_log(avctx, AV_LOG_ERROR, "frame is too short\n"); > + return AVERROR_INVALIDDATA; > + } > + > + /* > + * AES3 header : > + * size: 16 > + * number channels 2 > + * channel_id 8 > + * bits per samples 2 > + * alignments 4 > + */ > + > + h = AV_RB32(buf); > + frame_size = (h >> 16) & 0xffff; > + channels = ((h >> 14) & 0x0003) * 2 + 2; > + id = (h >> 6) & 0x00ff; > + bits = ((h >> 4) & 0x0003) * 4 + 16; > + > + if (AES3_HEADER_LEN + frame_size != buf_size || bits > 24) { > + av_log(avctx, AV_LOG_ERROR, "frame has invalid header\n"); > + return AVERROR_INVALIDDATA; > + } > + > + /* Set output properties */ > + avctx->bits_per_coded_sample = bits; > + if (bits > 16) > + avctx->sample_fmt = SAMPLE_FMT_S32; > + else > + avctx->sample_fmt = SAMPLE_FMT_S16; > + > + avctx->channels = channels; > + avctx->sample_rate = 48000; > + avctx->bit_rate = 48000 * avctx->channels * > (avctx->bits_per_coded_sample + 4) + > + 32 * (48000 / (buf_size * 8 / > + (avctx->channels * > + (avctx->bits_per_coded_sample + > 4)))); > + > + return frame_size; > +} > + > +static int s302m_decode_frame(AVCodecContext *avctx, > + void *data, int *data_size, > + AVPacket *avpkt) > +{ > + const uint8_t *buf = avpkt->data; > + int buf_size = avpkt->size; > + > + if (s302m_parse_frame_header(avctx, buf, buf_size) < 0) > + return -1;
If you are going to insist on proper error codes you may as well propagate them. _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel