zoukankan      html  css  js  c++  java
  • ffmpeg之channel_layout

    通道布局与通用函数

    类型和枚举说明

    channel_masks 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.
    #define AV_CH_WIDE_LEFT              0x0000000080000000ULL
    #define AV_CH_WIDE_RIGHT             0x0000000100000000ULL
    #define AV_CH_SURROUND_DIRECT_LEFT   0x0000000200000000ULL
    #define AV_CH_SURROUND_DIRECT_RIGHT  0x0000000400000000ULL
    #define AV_CH_LOW_FREQUENCY_2        0x0000000800000000ULL
    
    /** 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          0x8000000000000000ULL
    

    channel_mask_c Audio channel layouts通道布局

    #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_2POINT1           (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
    #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_3POINT1           (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
    #define AV_CH_LAYOUT_4POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
    #define AV_CH_LAYOUT_4POINT1           (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
    #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_6POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
    #define AV_CH_LAYOUT_6POINT0_FRONT     (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
    #define AV_CH_LAYOUT_HEXAGONAL         (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
    #define AV_CH_LAYOUT_6POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
    #define AV_CH_LAYOUT_6POINT1_BACK      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
    #define AV_CH_LAYOUT_6POINT1_FRONT     (AV_CH_LAYOUT_6POINT0_FRONT|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_7POINT0_FRONT     (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
    #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|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
    #define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
    #define AV_CH_LAYOUT_OCTAGONAL         (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
    #define AV_CH_LAYOUT_HEXADECAGONAL     (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)
    #define AV_CH_LAYOUT_STEREO_DOWNMIX    (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
    

    AVMatrixEncoding(没看明白)

    enum AVMatrixEncoding {
        AV_MATRIX_ENCODING_NONE,
        AV_MATRIX_ENCODING_DOLBY,
        AV_MATRIX_ENCODING_DPLII,
        AV_MATRIX_ENCODING_DPLIIX,
        AV_MATRIX_ENCODING_DPLIIZ,
        AV_MATRIX_ENCODING_DOLBYEX,
        AV_MATRIX_ENCODING_DOLBYHEADPHONE,
        AV_MATRIX_ENCODING_NB
    };
    
    

    chanel_names

    struct channel_name {
        const char *name;
        const char *description;
    };
    
    static const struct channel_name channel_names[] = {
         [0] = { "FL",        "front left"            },
         [1] = { "FR",        "front right"           },
         [2] = { "FC",        "front center"          },
         [3] = { "LFE",       "low frequency"         },
         [4] = { "BL",        "back left"             },
         [5] = { "BR",        "back right"            },
         [6] = { "FLC",       "front left-of-center"  },
         [7] = { "FRC",       "front right-of-center" },
         [8] = { "BC",        "back center"           },
         [9] = { "SL",        "side left"             },
        [10] = { "SR",        "side right"            },
        [11] = { "TC",        "top center"            },
        [12] = { "TFL",       "top front left"        },
        [13] = { "TFC",       "top front center"      },
        [14] = { "TFR",       "top front right"       },
        [15] = { "TBL",       "top back left"         },
        [16] = { "TBC",       "top back center"       },
        [17] = { "TBR",       "top back right"        },
        [29] = { "DL",        "downmix left"          },
        [30] = { "DR",        "downmix right"         },
        [31] = { "WL",        "wide left"             },
        [32] = { "WR",        "wide right"            },
        [33] = { "SDL",       "surround direct left"  },
        [34] = { "SDR",       "surround direct right" },
        [35] = { "LFE2",      "low frequency 2"       },
    };
    
    

    channel_layout_map

    static const struct {
        const char *name;
        int         nb_channels;
        uint64_t     layout;
    } channel_layout_map[] = {
        { "mono",        1,  AV_CH_LAYOUT_MONO },
        { "stereo",      2,  AV_CH_LAYOUT_STEREO },
        { "2.1",         3,  AV_CH_LAYOUT_2POINT1 },
        { "3.0",         3,  AV_CH_LAYOUT_SURROUND },
        { "3.0(back)",   3,  AV_CH_LAYOUT_2_1 },
        { "4.0",         4,  AV_CH_LAYOUT_4POINT0 },
        { "quad",        4,  AV_CH_LAYOUT_QUAD },
        { "quad(side)",  4,  AV_CH_LAYOUT_2_2 },
        { "3.1",         4,  AV_CH_LAYOUT_3POINT1 },
        { "5.0",         5,  AV_CH_LAYOUT_5POINT0_BACK },
        { "5.0(side)",   5,  AV_CH_LAYOUT_5POINT0 },
        { "4.1",         5,  AV_CH_LAYOUT_4POINT1 },
        { "5.1",         6,  AV_CH_LAYOUT_5POINT1_BACK },
        { "5.1(side)",   6,  AV_CH_LAYOUT_5POINT1 },
        { "6.0",         6,  AV_CH_LAYOUT_6POINT0 },
        { "6.0(front)",  6,  AV_CH_LAYOUT_6POINT0_FRONT },
        { "hexagonal",   6,  AV_CH_LAYOUT_HEXAGONAL },
        { "6.1",         7,  AV_CH_LAYOUT_6POINT1 },
        { "6.1(back)",   7,  AV_CH_LAYOUT_6POINT1_BACK },
        { "6.1(front)",  7,  AV_CH_LAYOUT_6POINT1_FRONT },
        { "7.0",         7,  AV_CH_LAYOUT_7POINT0 },
        { "7.0(front)",  7,  AV_CH_LAYOUT_7POINT0_FRONT },
        { "7.1",         8,  AV_CH_LAYOUT_7POINT1 },
        { "7.1(wide)",   8,  AV_CH_LAYOUT_7POINT1_WIDE_BACK },
        { "7.1(wide-side)",   8,  AV_CH_LAYOUT_7POINT1_WIDE },
        { "octagonal",   8,  AV_CH_LAYOUT_OCTAGONAL },
        { "hexadecagonal", 16, AV_CH_LAYOUT_HEXADECAGONAL },
        { "downmix",     2,  AV_CH_LAYOUT_STEREO_DOWNMIX, },
    };
    
    

    utilty functions

    get_channel_name

    • brief:利用通道id获取通道字符标示的名称
    • parameter:channel_id
    • return:通道的字符表示
    static const char *get_channel_name(int channel_id)
    {
        if (channel_id < 0 || channel_id >= FF_ARRAY_ELEMS(channel_names))
            return NULL;
        return channel_names[channel_id].name;
    }
    
    

    av_get_default_channel_layout

    • brief:利用通道数量获取默认的通道布局
    /**
     * Return default channel layout for a given number of channels.
     */
    int64_t av_get_default_channel_layout(int nb_channels) {
        int i;
        for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
            if (nb_channels == channel_layout_map[i].nb_channels)
                return channel_layout_map[i].layout;
        return 0;
    }
    

    get_channel_layout_single

    • brief:
    static uint64_t get_channel_layout_single(const char *name, int name_len)
    {
        int i;
        char *end;
        int64_t layout;
    
        for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++) {
            if (strlen(channel_layout_map[i].name) == name_len &&
                !memcmp(channel_layout_map[i].name, name, name_len))
                return channel_layout_map[i].layout;
        }
        for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++)
            if (channel_names[i].name &&
                strlen(channel_names[i].name) == name_len &&
                !memcmp(channel_names[i].name, name, name_len))
                return (int64_t)1 << i;
    
        errno = 0;
        i = strtol(name, &end, 10);
    
        if (!errno && (end + 1 - name == name_len && *end  == 'c'))
            return av_get_default_channel_layout(i);
    
        errno = 0;
        layout = strtoll(name, &end, 0);
        if (!errno && end - name == name_len)
            return FFMAX(layout, 0);
        return 0;
    }
    
    

    av_get_channel_layout

    • bried:利用layout名称获取唯一id
    • return:如果没匹配到返回0,否则返回layout_id
    uint64_t av_get_channel_layout(const char *name){
        
    }
    
    /**
     * Return a channel layout and the number of channels based on the specified name.
     *
     * This function is similar to (@see av_get_channel_layout), but can also parse
     * unknown channel layout specifications.
     *
     * @param[in]  name             channel layout specification string
     * @param[out] channel_layout   parsed channel layout (0 if unknown)
     * @param[out] nb_channels      number of channels
     *
     * @return 0 on success, AVERROR(EINVAL) if the parsing fails.
     */
    int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels);
    
    /**
     * 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, uint64_t channel_layout);
    
    struct AVBPrint;
    /**
     * Append a description of a channel layout to a bprint buffer.
     */
    void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout);
    
    /**
     * Return the number of channels in the channel layout.
     */
    int av_get_channel_layout_nb_channels(uint64_t channel_layout);
    
    /**
     * Return default channel layout for a given number of channels.
     */
    int64_t av_get_default_channel_layout(int nb_channels);
    
    /**
     * Get the index of a channel in channel_layout.
     *
     * @param channel a channel layout describing exactly one channel which must be
     *                present in channel_layout.
     *
     * @return index of channel in channel_layout on success, a negative AVERROR
     *         on error.
     */
    int av_get_channel_layout_channel_index(uint64_t channel_layout,
                                            uint64_t channel);
    
    /**
     * Get the channel with the given index in channel_layout.
     */
    uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index);
    
    /**
     * Get the name of a given channel.
     *
     * @return channel name on success, NULL on error.
     */
    const char *av_get_channel_name(uint64_t channel);
    
    /**
     * Get the description of a given channel.
     *
     * @param channel  a channel layout with a single channel
     * @return  channel description on success, NULL on error
     */
    const char *av_get_channel_description(uint64_t channel);
    
    /**
     * Get the value and name of a standard channel layout.
     *
     * @param[in]  index   index in an internal list, starting at 0
     * @param[out] layout  channel layout mask
     * @param[out] name    name of the layout
     * @return  0  if the layout exists,
     *          <0 if index is beyond the limits
     */
    int av_get_standard_channel_layout(unsigned index, uint64_t *layout,
                                       const char **name);
    

    本文来自博客园,作者:faithlocus,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/15642041.html

  • 相关阅读:
    javaScript函数参数
    python创建pipenv虚拟环境
    信立温度模块解析(模拟量)
    Modbus Poll使用
    云智网关连接
    python中创建virtualenv虚拟环境
    python环境变量配置
    Mysql数据库环境变量配置
    github中创建远程仓库
    python解释器下载
  • 原文地址:https://www.cnblogs.com/faithlocus/p/15642041.html
Copyright © 2011-2022 走看看