diff mbox

[FFmpeg-devel] lavfi/atempo: Avoid false triggering an assertion failure

Message ID 1482020088-1607-1-git-send-email-pkoshevoy@gmail.com
State Accepted
Commit 4240e5b047379b29c33dd3f4438bc4e610527b83
Headers show

Commit Message

Pavel Koshevoy Dec. 18, 2016, 12:14 a.m. UTC
From: Pavel Koshevoy <pkoshevoy@gmail.com>

Steps to reproduce:
./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
---
 libavfilter/af_atempo.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Marton Balint Dec. 19, 2016, 1:39 a.m. UTC | #1
On Sat, 17 Dec 2016, pkoshevoy@gmail.com wrote:

> From: Pavel Koshevoy <pkoshevoy@gmail.com>
>
> Steps to reproduce:
> ./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
> ---
> libavfilter/af_atempo.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
> index 59b08ec..a487882 100644
> --- a/libavfilter/af_atempo.c
> +++ b/libavfilter/af_atempo.c
> @@ -914,8 +914,8 @@ static int yae_flush(ATempoContext *atempo,
>
>     atempo->state = YAE_FLUSH_OUTPUT;
> 
> -    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
> -        atempo->position[1] == frag->position[1] + frag->nsamples) {
> +    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
> +        atempo->position[1] >= frag->position[1] + frag->nsamples) {
>         // the current fragment is already flushed:
>         return 0;
>     }

Thanks, this indeed fixes the assertion I came accross. Do you want me to 
apply?

Regards,
Marton
Marton Balint Dec. 19, 2016, 9:23 p.m. UTC | #2
On Mon, 19 Dec 2016, Marton Balint wrote:

>
> On Sat, 17 Dec 2016, pkoshevoy@gmail.com wrote:
>
>> From: Pavel Koshevoy <pkoshevoy@gmail.com>
>>
>> Steps to reproduce:
>> ./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
>> ---
>> libavfilter/af_atempo.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
>> index 59b08ec..a487882 100644
>> --- a/libavfilter/af_atempo.c
>> +++ b/libavfilter/af_atempo.c
>> @@ -914,8 +914,8 @@ static int yae_flush(ATempoContext *atempo,
>>
>>     atempo->state = YAE_FLUSH_OUTPUT;
>> 
>> -    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
>> -        atempo->position[1] == frag->position[1] + frag->nsamples) {
>> +    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
>> +        atempo->position[1] >= frag->position[1] + frag->nsamples) {
>>         // the current fragment is already flushed:
>>         return 0;
>>     }
>
> Thanks, this indeed fixes the assertion I came accross. Do you want me to 
> apply?
>

Thanks, applied.

Regards,
Marton
Marton Balint Aug. 30, 2017, 8 p.m. UTC | #3
On Mon, 19 Dec 2016, Marton Balint wrote:

>
> On Sat, 17 Dec 2016, pkoshevoy@gmail.com wrote:
>
>> From: Pavel Koshevoy <pkoshevoy@gmail.com>
>>
>> Steps to reproduce:
>> ./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
>> ---
>> libavfilter/af_atempo.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
>> index 59b08ec..a487882 100644
>> --- a/libavfilter/af_atempo.c
>> +++ b/libavfilter/af_atempo.c
>> @@ -914,8 +914,8 @@ static int yae_flush(ATempoContext *atempo,
>>
>>     atempo->state = YAE_FLUSH_OUTPUT;
>> 
>> -    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
>> -        atempo->position[1] == frag->position[1] + frag->nsamples) {
>> +    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
>> +        atempo->position[1] >= frag->position[1] + frag->nsamples) {
>>         // the current fragment is already flushed:
>>         return 0;
>>     }
>
> Thanks, this indeed fixes the assertion I came accross.

Hmm, this patch seems to cause cut off data at the end, as reported in 
https://trac.ffmpeg.org/ticket/6540

Pavel, would you mind taking a look?

Thanks,
Marton
Pavel Koshevoy Aug. 30, 2017, 9:01 p.m. UTC | #4
On Wed, Aug 30, 2017 at 2:00 PM, Marton Balint <cus@passwd.hu> wrote:
>
> On Mon, 19 Dec 2016, Marton Balint wrote:
>
>>
>> On Sat, 17 Dec 2016, pkoshevoy@gmail.com wrote:
>>
>>> From: Pavel Koshevoy <pkoshevoy@gmail.com>
>>>
>>> Steps to reproduce:
>>> ./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
>>> ---
>>> libavfilter/af_atempo.c | 4 ++--
>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
>>> index 59b08ec..a487882 100644
>>> --- a/libavfilter/af_atempo.c
>>> +++ b/libavfilter/af_atempo.c
>>> @@ -914,8 +914,8 @@ static int yae_flush(ATempoContext *atempo,
>>>
>>>     atempo->state = YAE_FLUSH_OUTPUT;
>>>
>>> -    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
>>> -        atempo->position[1] == frag->position[1] + frag->nsamples) {
>>> +    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
>>> +        atempo->position[1] >= frag->position[1] + frag->nsamples) {
>>>         // the current fragment is already flushed:
>>>         return 0;
>>>     }
>>
>>
>> Thanks, this indeed fixes the assertion I came accross.
>
>
> Hmm, this patch seems to cause cut off data at the end, as reported in
> https://trac.ffmpeg.org/ticket/6540
>
> Pavel, would you mind taking a look?
>
> Thanks,
> Marton


Sure, but it will probably have to wait until the weekend.

    Pavel.
Pavel Koshevoy Sept. 3, 2017, 6:39 a.m. UTC | #5
On 08/30/2017 03:01 PM, Pavel Koshevoy wrote:
> On Wed, Aug 30, 2017 at 2:00 PM, Marton Balint <cus@passwd.hu> wrote:
>> On Mon, 19 Dec 2016, Marton Balint wrote:
>>
>>> On Sat, 17 Dec 2016, pkoshevoy@gmail.com wrote:
>>>
>>>> From: Pavel Koshevoy <pkoshevoy@gmail.com>
>>>>
>>>> Steps to reproduce:
>>>> ./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
>>>> ---
>>>> libavfilter/af_atempo.c | 4 ++--
>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
>>>> index 59b08ec..a487882 100644
>>>> --- a/libavfilter/af_atempo.c
>>>> +++ b/libavfilter/af_atempo.c
>>>> @@ -914,8 +914,8 @@ static int yae_flush(ATempoContext *atempo,
>>>>
>>>>      atempo->state = YAE_FLUSH_OUTPUT;
>>>>
>>>> -    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
>>>> -        atempo->position[1] == frag->position[1] + frag->nsamples) {
>>>> +    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
>>>> +        atempo->position[1] >= frag->position[1] + frag->nsamples) {
>>>>          // the current fragment is already flushed:
>>>>          return 0;
>>>>      }
>>>
>>> Thanks, this indeed fixes the assertion I came accross.
>>
>> Hmm, this patch seems to cause cut off data at the end, as reported in
>> https://trac.ffmpeg.org/ticket/6540
>>
>> Pavel, would you mind taking a look?
>>
>> Thanks,
>> Marton
>
> Sure, but it will probably have to wait until the weekend.
>
>      Pavel.



You can probably revert 4240e5b047379b29c33dd3f4438bc4e610527b83 -- I tried it 
locally and I no longer see the false assertion trigger it was supposed to fix.  
Something must have changed elsewhere.

As far as the expectation of atempo=0.5 producing output of perfectly doubled 
duration that's not going to be the case with this filter. It is a continuous 
stream filter -- it knows nothing about the input audio duration beyond what has 
been fed to it so far, so it can't know how long the exact output audio duration 
is supposed to be (until the filter is flushed, but by then it's too late).  For 
atempo=0.5, given 1024 + n * 512 input samples it will produce (n + 1) * 1024 
output samples.  For large n, (n + 1) / n ratio approaches 1 so for every 512 
input samples you'd get 1024 output samples.  But for small n the ratio (n + 1) 
/ n is not going to be that close to 1, so the error in duration will be more 
noticeable.

     Pavel.
Marton Balint Sept. 3, 2017, 3:26 p.m. UTC | #6
On Sun, 3 Sep 2017, Pavel Koshevoy wrote:

> On 08/30/2017 03:01 PM, Pavel Koshevoy wrote:
>> On Wed, Aug 30, 2017 at 2:00 PM, Marton Balint <cus@passwd.hu> wrote:
>>> On Mon, 19 Dec 2016, Marton Balint wrote:
>>> 
>>>> On Sat, 17 Dec 2016, pkoshevoy@gmail.com wrote:
>>>> 
>>>>> From: Pavel Koshevoy <pkoshevoy@gmail.com>
>>>>> 
>>>>> Steps to reproduce:
>>>>> ./ffmpeg_g -f s16be -i /dev/null -af atempo=0.5 -y /tmp/atempo.wav
>>>>> ---
>>>>> libavfilter/af_atempo.c | 4 ++--
>>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>> 
>>>>> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
>>>>> index 59b08ec..a487882 100644
>>>>> --- a/libavfilter/af_atempo.c
>>>>> +++ b/libavfilter/af_atempo.c
>>>>> @@ -914,8 +914,8 @@ static int yae_flush(ATempoContext *atempo,
>>>>>
>>>>>      atempo->state = YAE_FLUSH_OUTPUT;
>>>>> 
>>>>> -    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
>>>>> -        atempo->position[1] == frag->position[1] + frag->nsamples) {
>>>>> +    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
>>>>> +        atempo->position[1] >= frag->position[1] + frag->nsamples) {
>>>>>          // the current fragment is already flushed:
>>>>>          return 0;
>>>>>      }
>>>> 
>>>> Thanks, this indeed fixes the assertion I came accross.
>>> 
>>> Hmm, this patch seems to cause cut off data at the end, as reported in
>>> https://trac.ffmpeg.org/ticket/6540
>>> 
>>> Pavel, would you mind taking a look?
>>> 
>>> Thanks,
>>> Marton
>> 
>> Sure, but it will probably have to wait until the weekend.
>>
>>      Pavel.
>
>
>
> You can probably revert 4240e5b047379b29c33dd3f4438bc4e610527b83 -- I tried 
> it locally and I no longer see the false assertion trigger it was supposed to 
> fix.  Something must have changed elsewhere.

You can still reproduce the assertion with a sligthly different command 
line after reverting:

./ffmpeg -f lavfi -i sine=d=1 -af aselect=e=0,atempo=0.5 -y atempo.wav

Regards,
Marton
Pavel Koshevoy Sept. 4, 2017, 2:22 a.m. UTC | #7
On Sun, Sep 3, 2017 at 9:26 AM, Marton Balint <cus@passwd.hu> wrote:
>
> On Sun, 3 Sep 2017, Pavel Koshevoy wrote:
>
>> On 08/30/2017 03:01 PM, Pavel Koshevoy wrote:

<snip>

>> You can probably revert 4240e5b047379b29c33dd3f4438bc4e610527b83 -- I
>> tried it locally and I no longer see the false assertion trigger it was
>> supposed to fix.  Something must have changed elsewhere.
>
>
> You can still reproduce the assertion with a sligthly different command line
> after reverting:
>
> ./ffmpeg -f lavfi -i sine=d=1 -af aselect=e=0,atempo=0.5 -y atempo.wav
>
> Regards,
> Marton


I'll take a look at this assertion failure.

    Pavel.
diff mbox

Patch

diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
index 59b08ec..a487882 100644
--- a/libavfilter/af_atempo.c
+++ b/libavfilter/af_atempo.c
@@ -914,8 +914,8 @@  static int yae_flush(ATempoContext *atempo,
 
     atempo->state = YAE_FLUSH_OUTPUT;
 
-    if (atempo->position[0] == frag->position[0] + frag->nsamples &&
-        atempo->position[1] == frag->position[1] + frag->nsamples) {
+    if (atempo->position[0] >= frag->position[0] + frag->nsamples &&
+        atempo->position[1] >= frag->position[1] + frag->nsamples) {
         // the current fragment is already flushed:
         return 0;
     }