On Sat, 28 Sep 2013 00:35:27 +0200, Maxim Polijakowski <max_p...@gmx.de> wrote: > > > Hi crews, > > > > the attached patch adds support for multichannel ATRAC3+ streams to > > the OpenMG demuxer. It also sets the currently wrong ATRAC3+ frame > > size to right one of 2048 samples. > > > > The patch for ATRAC3+ codec itself is in preparation and will be > > posted shortly... > > > > Please find attached the updated patch... > > Best regards > Maxim > From cb20dd04f8ba8342dc2992df4287b55df3b2175c Mon Sep 17 00:00:00 2001 > From: Maxim Poliakovski <max_p...@gmx.de> > Date: Sat, 28 Sep 2013 00:18:18 +0200 > Subject: [PATCH] Add support for multichannel ATRAC3+ streams. > > --- > libavformat/oma.c | 15 +++++++++++++++ > libavformat/oma.h | 3 +++ > libavformat/omadec.c | 15 +++++++++++---- > 3 files changed, 29 insertions(+), 4 deletions(-) > > diff --git a/libavformat/oma.c b/libavformat/oma.c > index aaaf0b2..27b5988 100644 > --- a/libavformat/oma.c > +++ b/libavformat/oma.c > @@ -21,6 +21,7 @@ > #include "internal.h" > #include "oma.h" > #include "libavcodec/avcodec.h" > +#include "libavutil/channel_layout.h" > > const uint16_t ff_oma_srate_tab[8] = { 320, 441, 480, 882, 960, 0 }; > > @@ -31,3 +32,17 @@ const AVCodecTag ff_oma_codec_tags[] = { > { AV_CODEC_ID_PCM_S16BE, OMA_CODECID_LPCM }, > { 0 }, > }; > + > +/** map ATRAC-X channel id to internal channel layout */ > +const uint64_t ff_oma_chid_to_native_layout[7] = { > + AV_CH_LAYOUT_MONO, > + AV_CH_LAYOUT_STEREO, > + AV_CH_LAYOUT_SURROUND, > + AV_CH_LAYOUT_4POINT0, > + AV_CH_LAYOUT_5POINT1_BACK, > + AV_CH_LAYOUT_6POINT1_BACK, > + AV_CH_LAYOUT_7POINT1 > +}; > + > +/** map ATRAC-X channel id to total number of channels */ > +const int ff_oma_chid_to_num_channels[7] = {1, 2, 3, 4, 6, 7, 8}; > diff --git a/libavformat/oma.h b/libavformat/oma.h > index 1f0ddf9..9a35da2 100644 > --- a/libavformat/oma.h > +++ b/libavformat/oma.h > @@ -41,4 +41,7 @@ extern const uint16_t ff_oma_srate_tab[8]; > > extern const AVCodecTag ff_oma_codec_tags[]; > > +extern const uint64_t ff_oma_chid_to_native_layout[7]; > +extern const int ff_oma_chid_to_num_channels[7]; > + > #endif /* AVFORMAT_OMA_H */ > diff --git a/libavformat/omadec.c b/libavformat/omadec.c > index 274112e..e5a2090 100644 > --- a/libavformat/omadec.c > +++ b/libavformat/omadec.c > @@ -1,7 +1,7 @@ > /* > * Sony OpenMG (OMA) demuxer > * > - * Copyright (c) 2008 Maxim Poliakovski > + * Copyright (c) 2008, 2013 Maxim Poliakovski > * 2008 Benjamin Larsson > * 2011 David Goldwich > * > @@ -284,7 +284,7 @@ static int decrypt_init(AVFormatContext *s, > ID3v2ExtraMeta *em, uint8_t *header) > static int oma_read_header(AVFormatContext *s) > { > int ret, framesize, jsflag, samplerate; > - uint32_t codec_params; > + uint32_t codec_params, channel_id; > int16_t eid; > uint8_t buf[EA3_HEADER_SIZE]; > uint8_t *edata; > @@ -364,7 +364,14 @@ static int oma_read_header(AVFormatContext *s) > avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); > break; > case OMA_CODECID_ATRAC3P: > - st->codec->channels = (codec_params >> 10) & 7; > + channel_id = (codec_params >> 10) & 7; > + if (!channel_id) { > + av_log(s, AV_LOG_ERROR, > + "Invalid ATRAC-X channel id: %d\n", channel_id); > + return AVERROR_INVALIDDATA; > + } > + st->codec->channel_layout = ff_oma_chid_to_native_layout[channel_id > - 1]; > + st->codec->channels = ff_oma_chid_to_num_channels[channel_id - > 1]; > framesize = ((codec_params & 0x3FF) * 8) + 8; > samplerate = ff_oma_srate_tab[(codec_params >> 13) & 7] * 100; > if (!samplerate) { > @@ -372,7 +379,7 @@ static int oma_read_header(AVFormatContext *s) > return AVERROR_INVALIDDATA; > } > st->codec->sample_rate = samplerate; > - st->codec->bit_rate = samplerate * framesize * 8 / 1024; > + st->codec->bit_rate = samplerate * framesize * 8 / 2048;
This part looks unrelated. Was bitrate wrong previously? The rest looks ok. -- Anton Khirnov _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel