You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavfi: parsing helper for unknown channel layouts.
Make ff_parse_channel_layout() accept unknown layouts too.
This commit is contained in:
		| @@ -66,7 +66,7 @@ static av_cold int init(AVFilterContext *ctx) | |||||||
|         (ret = ff_parse_sample_format(&aconvert->out_sample_fmt, aconvert->format_str, ctx)) < 0) |         (ret = ff_parse_sample_format(&aconvert->out_sample_fmt, aconvert->format_str, ctx)) < 0) | ||||||
|         return ret; |         return ret; | ||||||
|     if (aconvert->channel_layout_str && strcmp(aconvert->channel_layout_str, "auto")) |     if (aconvert->channel_layout_str && strcmp(aconvert->channel_layout_str, "auto")) | ||||||
|         return ff_parse_channel_layout(&aconvert->out_chlayout, aconvert->channel_layout_str, ctx); |         return ff_parse_channel_layout(&aconvert->out_chlayout, NULL, aconvert->channel_layout_str, ctx); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ static av_cold int init(AVFilterContext *ctx) | |||||||
|     if (!args) |     if (!args) | ||||||
|         return AVERROR(ENOMEM); |         return AVERROR(ENOMEM); | ||||||
|     arg = av_strtok(args, "|", &tokenizer); |     arg = av_strtok(args, "|", &tokenizer); | ||||||
|     ret = ff_parse_channel_layout(&pan->out_channel_layout, arg, ctx); |     ret = ff_parse_channel_layout(&pan->out_channel_layout, NULL, arg, ctx); | ||||||
|     if (ret < 0) |     if (ret < 0) | ||||||
|         goto fail; |         goto fail; | ||||||
|     pan->nb_output_channels = av_get_channel_layout_nb_channels(pan->out_channel_layout); |     pan->nb_output_channels = av_get_channel_layout_nb_channels(pan->out_channel_layout); | ||||||
|   | |||||||
| @@ -109,7 +109,7 @@ static av_cold int init(AVFilterContext *ctx) | |||||||
|  |  | ||||||
|     if (eval->chlayout_str) { |     if (eval->chlayout_str) { | ||||||
|         int n; |         int n; | ||||||
|         ret = ff_parse_channel_layout(&eval->chlayout, eval->chlayout_str, ctx); |         ret = ff_parse_channel_layout(&eval->chlayout, NULL, eval->chlayout_str, ctx); | ||||||
|         if (ret < 0) |         if (ret < 0) | ||||||
|             goto end; |             goto end; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -68,7 +68,7 @@ static av_cold int init(AVFilterContext *ctx) | |||||||
|                                      null->sample_rate_str, ctx)) < 0) |                                      null->sample_rate_str, ctx)) < 0) | ||||||
|         return ret; |         return ret; | ||||||
|  |  | ||||||
|     if ((ret = ff_parse_channel_layout(&null->channel_layout, |     if ((ret = ff_parse_channel_layout(&null->channel_layout, NULL, | ||||||
|                                         null->channel_layout_str, ctx)) < 0) |                                         null->channel_layout_str, ctx)) < 0) | ||||||
|         return ret; |         return ret; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -615,10 +615,21 @@ int ff_parse_sample_rate(int *ret, const char *arg, void *log_ctx) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx) | int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg, | ||||||
|  |                             void *log_ctx) | ||||||
| { | { | ||||||
|     char *tail; |     char *tail; | ||||||
|     int64_t chlayout = av_get_channel_layout(arg); |     int64_t chlayout, count; | ||||||
|  |  | ||||||
|  |     if (nret) { | ||||||
|  |         count = strtol(arg, &tail, 10); | ||||||
|  |         if (*tail == 'c' && !tail[1] && count > 0 && count < 63) { | ||||||
|  |             *nret = count; | ||||||
|  |             *ret = 0; | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     chlayout = av_get_channel_layout(arg); | ||||||
|     if (chlayout == 0) { |     if (chlayout == 0) { | ||||||
|         chlayout = strtol(arg, &tail, 10); |         chlayout = strtol(arg, &tail, 10); | ||||||
|         if (*tail || chlayout == 0) { |         if (*tail || chlayout == 0) { | ||||||
| @@ -627,6 +638,8 @@ int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     *ret = chlayout; |     *ret = chlayout; | ||||||
|  |     if (nret) | ||||||
|  |         *nret = av_get_channel_layout_nb_channels(chlayout); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -207,11 +207,14 @@ int ff_parse_sample_format(int *ret, const char *arg, void *log_ctx); | |||||||
|  * Parse a channel layout or a corresponding integer representation. |  * Parse a channel layout or a corresponding integer representation. | ||||||
|  * |  * | ||||||
|  * @param ret 64bit integer pointer to where the value should be written. |  * @param ret 64bit integer pointer to where the value should be written. | ||||||
|  |  * @param nret integer pointer to the number of channels; | ||||||
|  |  *             if not NULL, then unknown channel layouts are accepted | ||||||
|  * @param arg string to parse |  * @param arg string to parse | ||||||
|  * @param log_ctx log context |  * @param log_ctx log context | ||||||
|  * @return >= 0 in case of success, a negative AVERROR code on error |  * @return >= 0 in case of success, a negative AVERROR code on error | ||||||
|  */ |  */ | ||||||
| int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx); | int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg, | ||||||
|  |                             void *log_ctx); | ||||||
|  |  | ||||||
| void ff_update_link_current_pts(AVFilterLink *link, int64_t pts); | void ff_update_link_current_pts(AVFilterLink *link, int64_t pts); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user