diff mbox

[FFmpeg-devel] avfilter/af_atempo: Make ffplay display correct timestamps when seeking

Message ID 20190508045355.12091-1-pkoshevoy@gmail.com
State Accepted
Commit 181031906e4984c1c539dc84d21386a4397e257e
Headers show

Commit Message

Pavel Koshevoy May 8, 2019, 4:53 a.m. UTC
NOTE: this is a refinement of the patch from Paul B Mahol
offset all output timestamps by same amount of first input timestamp
---
 libavfilter/af_atempo.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Paul B Mahol May 8, 2019, 7:13 a.m. UTC | #1
On 5/8/19, Pavel Koshevoy <pkoshevoy@gmail.com> wrote:
> NOTE: this is a refinement of the patch from Paul B Mahol
> offset all output timestamps by same amount of first input timestamp
> ---
>  libavfilter/af_atempo.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
> index bfdad7d76b..688dac5464 100644
> --- a/libavfilter/af_atempo.c
> +++ b/libavfilter/af_atempo.c
> @@ -103,6 +103,9 @@ typedef struct ATempoContext {
>      // 1: output sample position
>      int64_t position[2];
>
> +    // first input timestamp, all other timestamps are offset by this one
> +    int64_t start_pts;
> +
>      // sample format:
>      enum AVSampleFormat format;
>
> @@ -186,6 +189,7 @@ static void yae_clear(ATempoContext *atempo)
>
>      atempo->nfrag = 0;
>      atempo->state = YAE_LOAD_FRAGMENT;
> +    atempo->start_pts = AV_NOPTS_VALUE;
>
>      atempo->position[0] = 0;
>      atempo->position[1] = 0;
> @@ -1068,7 +1072,7 @@ static int push_samples(ATempoContext *atempo,
>      atempo->dst_buffer->nb_samples  = n_out;
>
>      // adjust the PTS:
> -    atempo->dst_buffer->pts =
> +    atempo->dst_buffer->pts = atempo->start_pts +
>          av_rescale_q(atempo->nsamples_out,
>                       (AVRational){ 1, outlink->sample_rate },
>                       outlink->time_base);
> @@ -1097,6 +1101,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
> *src_buffer)
>      const uint8_t *src = src_buffer->data[0];
>      const uint8_t *src_end = src + n_in * atempo->stride;
>
> +    if (atempo->start_pts == AV_NOPTS_VALUE)
> +        atempo->start_pts = av_rescale_q(src_buffer->pts,
> +                                         inlink->time_base,
> +                                         outlink->time_base);
> +
>      while (src < src_end) {
>          if (!atempo->dst_buffer) {
>              atempo->dst_buffer = ff_get_audio_buffer(outlink, n_out);
> --
> 2.16.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

Should be fine.
Pavel Koshevoy May 9, 2019, 5:39 a.m. UTC | #2
On 5/8/19 1:13 AM, Paul B Mahol wrote:
> On 5/8/19, Pavel Koshevoy <pkoshevoy@gmail.com> wrote:
>> NOTE: this is a refinement of the patch from Paul B Mahol
>> offset all output timestamps by same amount of first input timestamp
>> ---
>>   libavfilter/af_atempo.c | 11 ++++++++++-
>>   1 file changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
>> index bfdad7d76b..688dac5464 100644
>> --- a/libavfilter/af_atempo.c
>> +++ b/libavfilter/af_atempo.c
>> @@ -103,6 +103,9 @@ typedef struct ATempoContext {
>>       // 1: output sample position
>>       int64_t position[2];
>>
>> +    // first input timestamp, all other timestamps are offset by this one
>> +    int64_t start_pts;
>> +
>>       // sample format:
>>       enum AVSampleFormat format;
>>
>> @@ -186,6 +189,7 @@ static void yae_clear(ATempoContext *atempo)
>>
>>       atempo->nfrag = 0;
>>       atempo->state = YAE_LOAD_FRAGMENT;
>> +    atempo->start_pts = AV_NOPTS_VALUE;
>>
>>       atempo->position[0] = 0;
>>       atempo->position[1] = 0;
>> @@ -1068,7 +1072,7 @@ static int push_samples(ATempoContext *atempo,
>>       atempo->dst_buffer->nb_samples  = n_out;
>>
>>       // adjust the PTS:
>> -    atempo->dst_buffer->pts =
>> +    atempo->dst_buffer->pts = atempo->start_pts +
>>           av_rescale_q(atempo->nsamples_out,
>>                        (AVRational){ 1, outlink->sample_rate },
>>                        outlink->time_base);
>> @@ -1097,6 +1101,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame
>> *src_buffer)
>>       const uint8_t *src = src_buffer->data[0];
>>       const uint8_t *src_end = src + n_in * atempo->stride;
>>
>> +    if (atempo->start_pts == AV_NOPTS_VALUE)
>> +        atempo->start_pts = av_rescale_q(src_buffer->pts,
>> +                                         inlink->time_base,
>> +                                         outlink->time_base);
>> +
>>       while (src < src_end) {
>>           if (!atempo->dst_buffer) {
>>               atempo->dst_buffer = ff_get_audio_buffer(outlink, n_out);
>> --
>> 2.16.4
> Should be fine.


Pushed, thank you.
     Pavel.
diff mbox

Patch

diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
index bfdad7d76b..688dac5464 100644
--- a/libavfilter/af_atempo.c
+++ b/libavfilter/af_atempo.c
@@ -103,6 +103,9 @@  typedef struct ATempoContext {
     // 1: output sample position
     int64_t position[2];
 
+    // first input timestamp, all other timestamps are offset by this one
+    int64_t start_pts;
+
     // sample format:
     enum AVSampleFormat format;
 
@@ -186,6 +189,7 @@  static void yae_clear(ATempoContext *atempo)
 
     atempo->nfrag = 0;
     atempo->state = YAE_LOAD_FRAGMENT;
+    atempo->start_pts = AV_NOPTS_VALUE;
 
     atempo->position[0] = 0;
     atempo->position[1] = 0;
@@ -1068,7 +1072,7 @@  static int push_samples(ATempoContext *atempo,
     atempo->dst_buffer->nb_samples  = n_out;
 
     // adjust the PTS:
-    atempo->dst_buffer->pts =
+    atempo->dst_buffer->pts = atempo->start_pts +
         av_rescale_q(atempo->nsamples_out,
                      (AVRational){ 1, outlink->sample_rate },
                      outlink->time_base);
@@ -1097,6 +1101,11 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *src_buffer)
     const uint8_t *src = src_buffer->data[0];
     const uint8_t *src_end = src + n_in * atempo->stride;
 
+    if (atempo->start_pts == AV_NOPTS_VALUE)
+        atempo->start_pts = av_rescale_q(src_buffer->pts,
+                                         inlink->time_base,
+                                         outlink->time_base);
+
     while (src < src_end) {
         if (!atempo->dst_buffer) {
             atempo->dst_buffer = ff_get_audio_buffer(outlink, n_out);