| @@ -103,7 +103,11 @@ static const struct { · 102 unmodified lines |
| 103 | 103 | { "downmix", 2, AV_CH_LAYOUT_STEREO_DOWNMIX, }, |
| 104 | 104 | }; |
| 105 | 105 | |
| 106 | +#if FF_API_GET_CHANNEL_LAYOUT_COMPAT |
| 107 | +static uint64_t get_channel_layout_single(const char *name, int name_len, int compat) |
| 108 | +#else |
| 106 | 109 | static uint64_t get_channel_layout_single(const char *name, int name_len) |
| 110 | +#endif |
| 107 | 111 | { |
| 108 | 112 | int i; |
| 109 | 113 | char *end; |
| @@ -120,16 +124,40 @@ static uint64_t get_channel_layout_single(const char *name, int name_len) · 10 unmodified lines |
| 120 | 124 | !memcmp(channel_names[i].name, name, name_len)) |
| 121 | 125 | return (int64_t)1 << i; |
| 122 | 126 | i = strtol(name, &end, 10); |
| 123 | | − if (end - name == name_len || |
| 124 | | − (end + 1 - name == name_len && *end == 'c')) |
| 127 | + |
| 128 | +#if FF_API_GET_CHANNEL_LAYOUT_COMPAT |
| 129 | + if (compat) { |
| 130 | + if (end - name == name_len || |
| 131 | + (end + 1 - name == name_len && *end == 'c')) { |
| 132 | + layout = av_get_default_channel_layout(i); |
| 133 | + if (end - name == name_len) { |
| 134 | + av_log(NULL, AV_LOG_WARNING, |
| 135 | + "Single channel layout '%.*s' is interpreted as a number of channels, " |
| 136 | + "switch to the syntax '%.*sc' otherwise it will be interpreted as a " |
| 137 | + "channel layout number in a later version\n", |
| 138 | + name_len, name, name_len, name); |
| 139 | + return layout; |
| 140 | + } |
| 141 | + } |
| 142 | + } else { |
| 143 | +#endif |
| 144 | + if ((end + 1 - name == name_len && *end == 'c')) |
| 125 | 145 | return av_get_default_channel_layout(i); |
| 146 | +#if FF_API_GET_CHANNEL_LAYOUT_COMPAT |
| 147 | + } |
| 148 | +#endif |
| 149 | + |
| 126 | 150 | layout = strtoll(name, &end, 0); |
| 127 | 151 | if (end - name == name_len) |
| 128 | 152 | return FFMAX(layout, 0); |
| 129 | 153 | return 0; |
| 130 | 154 | } |
| 131 | 155 | |
| 156 | +#if FF_API_GET_CHANNEL_LAYOUT_COMPAT |
| 157 | +uint64_t ff_get_channel_layout(const char *name, int compat) |
| 158 | +#else |
| 132 | 159 | uint64_t av_get_channel_layout(const char *name) |
| 160 | +#endif |
| 133 | 161 | { |
| 134 | 162 | const char *n, *e; |
| 135 | 163 | const char *name_end = name + strlen(name); |
| @@ -137,7 +165,11 @@ uint64_t av_get_channel_layout(const char *name) · 1 unmodified line |
| 137 | 165 | |
| 138 | 166 | for (n = name; n < name_end; n = e + 1) { |
| 139 | 167 | for (e = n; e < name_end && *e != '+' && *e != '|'; e++); |
| 168 | +#if FF_API_GET_CHANNEL_LAYOUT_COMPAT |
| 169 | + layout_single = get_channel_layout_single(n, e - n, compat); |
| 170 | +#else |
| 140 | 171 | layout_single = get_channel_layout_single(n, e - n); |
| 172 | +#endif |
| 141 | 173 | if (!layout_single) |
| 142 | 174 | return 0; |
| 143 | 175 | layout |= layout_single; |
| @@ -145,6 +177,13 @@ uint64_t av_get_channel_layout(const char *name) · 1 unmodified line |
| 145 | 177 | return layout; |
| 146 | 178 | } |
| 147 | 179 | |
| 180 | +#if FF_API_GET_CHANNEL_LAYOUT_COMPAT |
| 181 | +uint64_t av_get_channel_layout(const char *name) |
| 182 | +{ |
| 183 | + return ff_get_channel_layout(name, 1); |
| 184 | +} |
| 185 | +#endif |
| 186 | + |
| 148 | 187 | void av_bprint_channel_layout(struct AVBPrint *bp, |
| 149 | 188 | int nb_channels, uint64_t channel_layout) |
| 150 | 189 | { |