[FFmpeg-devel] [PATCH 3/3] avfilter/formats: do not allow unknown layouts in ff_parse_channel_layout if nret is not set
Marton Balint
cus at passwd.hu
Mon Jan 2 01:50:02 EET 2017
On Sat, 31 Dec 2016, Nicolas George wrote:
> Le sextidi 6 nivôse, an CCXXV, Marton Balint a écrit :
>> Current code returned the number of channels as channel layout in that case,
>> and if nret is not set then unknown layouts are typically not supported.
>
> Good catch.
>
> Let me see if I got this correctly:
>
> av_get_channel_layout("2c") = stereo
> av_get_channel_layout("2C") = 0
> av_get_channel_layout("13c") = 0
> av_get_channel_layout("13C") = 0
>
> av_get_extended_channel_layout("2c") = stereo / 2
> av_get_extended_channel_layout("2C") = 0 / 2
> av_get_extended_channel_layout("13c") = EINVAL
> av_get_extended_channel_layout("13C") = 0 / 13
>
> ff_parse_channel_layout():
>
> before after
> nret == NULL 2c stereo stereo
> nret == NULL 2C EINVAL EINVAL
> nret == NULL 13c (int64)13 = FL+FC+LF EINVAL
> nret == NULL 13C EINVAL EINVAL
> nret != NULL 2c stereo / 2 stereo / 2
> nret != NULL 2C EINVAL 0 / 2
> nret != NULL 13c 0 / 13 EINVAL
> nret != NULL 13C EINVAL 0 / 13
>
> Do we agree?
Yes.
>
>> Also use the common parsing code. This breaks a very specific case, using
>> af_pan with an unknown channel layout such as '13c', from now on, only '13C'
>> will work.
>
> I think you could easily add a temporary workaround and a warning.
>
> (I suggest, from now on, we flag temporary workarounds and warnings with
> a standardized comment: "/* [TEMPORARY 2016-12 -> 2017-12]*/"; that way,
> we can find them using git grep.)
Ok.
>> - chlayout = av_get_channel_layout(arg);
>> - if (chlayout == 0) {
>> - chlayout = strtol(arg, &tail, 10);
>
>> - if (!(*tail == '\0' || *tail == 'c' && *(tail + 1) == '\0') || chlayout <= 0 || chlayout > 63) {
>
> This is losing the >63 test since av_get_extended_channel_layout() tests
> for >64. lavfi can not deal with channel layouts with channel #63 set,
> because the bit serves to mark channel counts disguised as layouts;
> channel #63 is not defined in lavu anyway. Unknown channel layouts
> should work with even more than 64 channels, but that would require
> testing.
As far as I see the old code allowed 63 channels but not 64.
av_get_extended_channel_layout also works like this, although the
conditions there are negated.
Do you want me to disallow 63 channels as well? Or allow 64?
I also thought about more than 63/64 channels, but unknown layouts still
need some love even after my current patches, so I think we are not there
yet.
>
>> - av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout '%s'\n", arg);
>> - return AVERROR(EINVAL);
>> - }
>> - if (nret) {
>> - *nret = chlayout;
>> - *ret = 0;
>> - return 0;
>> - }
>
>> + if (av_get_extended_channel_layout(arg, &chlayout, &nb_channels) < 0 || (!chlayout && !nret)) {
>> + av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout '%s'\n", arg);
>
> Could you split the test to distinguish the warning?
>
> av_get_extended_channel_layout < 0 -> "Invalid channel layout"
> (!chlayout && !nret) -> "channel count without layout unsupported"
>
> (it also makes it easier to add the temporary workaround)
ok. New patch is on the way.
Thanks,
Marton
More information about the ffmpeg-devel
mailing list