[FFmpeg-devel] [PATCH 1/5] Move timestamp correction code from ffplay to cmdutils

Alexander Strange astrange
Tue Sep 28 04:53:51 CEST 2010


On Sep 13, 2010, at 5:16 PM, Michael Niedermayer wrote:

> On Sun, Sep 12, 2010 at 11:05:06PM -0400, Alexander Strange wrote:
>> On Tue, Jul 27, 2010 at 8:52 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
>>> On Mon, Jul 26, 2010 at 01:16:06PM -0700, Alexander Strange wrote:
>>>> ---
>>>>  cmdutils.c |   27 +++++++++++++++++++++++++++
>>>>  cmdutils.h |   24 ++++++++++++++++++++++++
>>>>  ffplay.c   |   31 ++++++-------------------------
>>>>  3 files changed, 57 insertions(+), 25 deletions(-)
>>>> 
>>>> diff --git a/cmdutils.c b/cmdutils.c
>>>> index 978b73c..cd0b194 100644
>>>> --- a/cmdutils.c
>>>> +++ b/cmdutils.c
>>> 
>>> 
>>>> 
>>>> -            is->last_dts_for_fault_detection=
>>>> -            is->last_pts_for_fault_detection= INT64_MIN;
>>>> +            init_pts_correction(&is->pts_ctx);
>>> 
>>>> @@ -663,3 +663,30 @@ int read_file(const char *filename, char **bufptr, size_t *size)
>>>>      fclose(f);
>>>>      return 0;
>>>>  }
>>>> +
>>>> +void init_pts_correction(PtsCorrectionContext *ctx)
>>>> +{
>>>> +    ctx->num_faulty_pts = ctx->num_faulty_dts = 0;
>>>> +    ctx->last_pts = ctx->last_dts = AV_NOPTS_VALUE;
>>> 
>>> INT64_MIN is correct, AV_NOPTS_VALUE is wrong, the code depends on it being
>>> the smallest integer, it does not check == AV_NOPTS_VALUE
>> 
>> Fixed. Not sure where that came from.
>> 
>>>> +}
>>>> +
>>>> +int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int64_t dts)
>>>> +{
>>>> +    int64_t pts = AV_NOPTS_VALUE;
>>>> +
>>>> +    if (dts != AV_NOPTS_VALUE) {
>>>> +        ctx->num_faulty_dts += dts <= ctx->last_dts;
>>>> +        ctx->last_dts = dts;
>>>> +    }
>>>> +    if (reordered_pts != AV_NOPTS_VALUE) {
>>>> +        ctx->num_faulty_pts += reordered_pts <= ctx->last_pts;
>>>> +        ctx->last_pts = reordered_pts;
>>>> +    }
>>>> +    if ((ctx->num_faulty_pts<ctx->num_faulty_dts || dts == AV_NOPTS_VALUE)
>>>> +       && reordered_pts != AV_NOPTS_VALUE)
>>>> +        pts = reordered_pts;
>>>> +    else
>>>> +        pts = dts;
>>>> +
>>>> +    return pts;
>>>> +}
>>> 
>>> you are loosing the decoder_reorder_pts code here
>> 
>> Merged the next patch into this one.
>> 
>>>> diff --git a/cmdutils.h b/cmdutils.h
>>>> index d48abab..f2ad34a 100644
>>>> --- a/cmdutils.h
>>>> +++ b/cmdutils.h
>>>> @@ -220,4 +220,28 @@ int read_yesno(void);
>>>>   */
>>>>  int read_file(const char *filename, char **bufptr, size_t *size);
>>>> 
>>>> +typedef struct {
>>>> +    int64_t num_faulty_pts; /// Number of incorrect PTS values so far
>>>> +    int64_t num_faulty_dts; /// Number of incorrect DTS values so far
>>>> +    int64_t last_pts;       /// PTS of the last frame
>>>> +    int64_t last_dts;       /// DTS of the last frame
>>>> +} PtsCorrectionContext;
>>>> +
>>>> +/**
>>>> + * Resets the state of the PtsCorrectionContext.
>>>> + */
>>>> +void init_pts_correction(PtsCorrectionContext *ctx);
>>>> +
>>>> +/**
>>>> + * Attempts to guess proper monotonic timestamps for decoded video frames
>>>> + * which might have incorrect times.
>>>> + *
>>>> + * @param pts The pts field of the decoded AVPacket, as passed through
>>>> + * AVCodecContext.reordered_opaque
>>>> + * @param dts The dts field of the decoded AVPacket
>>> 
>>>> + * @return Whichever of pts or dts is more correct; will not be less than
>>>> + * or equal to the previous value. May be AV_NOPTS_VALUE.
>>> 
>>> this is impossible, mpeg-ps/ts have timestamp discontinuities and thus the
>>> values may very well be less than previous
>> 
>> Changed the comment.
>> 
>> Note right now the function only returns one of the input values (so
>> @return mentions that), but I think it might need to do more in the
>> case of files that come out with duplicate pts, like that
>> mpeg+mpeg2video+ac3++non_monotone_timestamps.mpg. But I don't want to
>> hide too many future bugs in lavf, so I'm not sure that's a good idea
>> now.
> 
>> cmdutils.c |   27 +++++++++++++++++++++++++++
>> cmdutils.h |   24 ++++++++++++++++++++++++
>> ffplay.c   |   35 ++++++++++++-----------------------
>> 3 files changed, 63 insertions(+), 23 deletions(-)
>> f917f2e1bf6e7633b7030e37b08d24c20f9fd655  0001-Move-timestamp-correction-code-from-ffplay-to-cmduti.patch
>> From 86434ec1c52877f3d1b1a98319ee0b56f551a442 Mon Sep 17 00:00:00 2001
>> From: Alexander Strange <astrange at ithinksw.com>
>> Date: Sat, 26 Jun 2010 21:21:29 -0700
>> Subject: [PATCH 1/3] Move timestamp correction code from ffplay to cmdutils
> 
> ok if tested

Applied.



More information about the ffmpeg-devel mailing list