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

Reply via email to