/*

 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>

 * Copyright (c) 2008 Peter Ross

 *

 * This file is part of FFmpeg.

 *

 * FFmpeg 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.

 *

 * FFmpeg 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 FFmpeg; if not, write to the Free Software

 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

 */



#ifndef AVCORE_AUDIOCONVERT_H

#define AVCORE_AUDIOCONVERT_H



/**

 * @file

 * audio conversion routines

 */



#include "avcore.h"



/* Audio channel masks */

#define AV_CH_FRONT_LEFT             0x00000001

#define AV_CH_FRONT_RIGHT            0x00000002

#define AV_CH_FRONT_CENTER           0x00000004

#define AV_CH_LOW_FREQUENCY          0x00000008

#define AV_CH_BACK_LEFT              0x00000010

#define AV_CH_BACK_RIGHT             0x00000020

#define AV_CH_FRONT_LEFT_OF_CENTER   0x00000040

#define AV_CH_FRONT_RIGHT_OF_CENTER  0x00000080

#define AV_CH_BACK_CENTER            0x00000100

#define AV_CH_SIDE_LEFT              0x00000200

#define AV_CH_SIDE_RIGHT             0x00000400

#define AV_CH_TOP_CENTER             0x00000800

#define AV_CH_TOP_FRONT_LEFT         0x00001000

#define AV_CH_TOP_FRONT_CENTER       0x00002000

#define AV_CH_TOP_FRONT_RIGHT        0x00004000

#define AV_CH_TOP_BACK_LEFT          0x00008000

#define AV_CH_TOP_BACK_CENTER        0x00010000

#define AV_CH_TOP_BACK_RIGHT         0x00020000

#define AV_CH_STEREO_LEFT            0x20000000  ///< Stereo downmix.

#define AV_CH_STEREO_RIGHT           0x40000000  ///< See AV_CH_STEREO_LEFT.



/** Channel mask value used for AVCodecContext.request_channel_layout

    to indicate that the user requests the channel order of the decoder output

    to be the native codec channel order. */

#define AV_CH_LAYOUT_NATIVE          0x8000000000000000LL



/* Audio channel convenience macros */

#define AV_CH_LAYOUT_MONO              (AV_CH_FRONT_CENTER)

#define AV_CH_LAYOUT_STEREO            (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)

#define AV_CH_LAYOUT_2_1               (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)

#define AV_CH_LAYOUT_SURROUND          (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)

#define AV_CH_LAYOUT_4POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)

#define AV_CH_LAYOUT_2_2               (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)

#define AV_CH_LAYOUT_QUAD              (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)

#define AV_CH_LAYOUT_5POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)

#define AV_CH_LAYOUT_5POINT1           (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)

#define AV_CH_LAYOUT_5POINT0_BACK      (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)

#define AV_CH_LAYOUT_5POINT1_BACK      (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)

#define AV_CH_LAYOUT_7POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)

#define AV_CH_LAYOUT_7POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)

#define AV_CH_LAYOUT_7POINT1_WIDE      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)

#define AV_CH_LAYOUT_STEREO_DOWNMIX    (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)



/**

 * Return a channel layout id that matches name, 0 if no match.

 */

int64_t av_get_channel_layout(const char *name);



/**

 * Return a description of a channel layout.

 * If nb_channels is <= 0, it is guessed from the channel_layout.

 *

 * @param buf put here the string containing the channel layout

 * @param buf_size size in bytes of the buffer

 */

void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, int64_t channel_layout);



/**

 * Return the number of channels in the channel layout.

 */

int av_get_channel_layout_nb_channels(int64_t channel_layout);



#endif /* AVCORE_AUDIOCONVERT_H */

