diff mbox series

[FFmpeg-devel] avformat: add AVFormatContext.first_pts_wallclock

Message ID 20220616090911.5357-1-ffmpeg@gyani.pro
State New
Headers show
Series [FFmpeg-devel] avformat: add AVFormatContext.first_pts_wallclock | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_armv7_RPi4 success Make finished
andriy/make_fate_armv7_RPi4 success Make fate finished

Commit Message

Gyan Doshi June 16, 2022, 9:09 a.m. UTC
Stores wallclock time for the first packet received with a pts.
---
 doc/APIchanges         |  3 +++
 libavformat/avformat.h | 10 ++++++++++
 libavformat/demux.c    |  3 +++
 libavformat/options.c  |  1 +
 libavformat/version.h  |  2 +-
 5 files changed, 18 insertions(+), 1 deletion(-)

Comments

Gyan Doshi June 18, 2022, 4:01 a.m. UTC | #1
On 2022-06-16 02:39 pm, Gyan Doshi wrote:
> Stores wallclock time for the first packet received with a pts.

Comments?
> ---
>   doc/APIchanges         |  3 +++
>   libavformat/avformat.h | 10 ++++++++++
>   libavformat/demux.c    |  3 +++
>   libavformat/options.c  |  1 +
>   libavformat/version.h  |  2 +-
>   5 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 5857e67ae6..3d472b8963 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -14,6 +14,9 @@ libavutil:     2021-04-27
>   
>   API changes, most recent first:
>   
> +2022-06-xx - xxxxxxxxxx - lavf 59.26.100 - avformat.h
> +  Add and set AVFormatContext.first_pts_wallclock field.
> +
>   2022-06-12 - xxxxxxxxxx - lavf 59.25.100 - avio.h
>     Add avio_vprintf(), similar to avio_printf() but allow to use it
>     from within a function taking a variable argument list as input.
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index f12fa7d904..56f9656a68 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1808,6 +1808,16 @@ typedef struct AVFormatContext {
>        */
>       int max_probe_packets;
>   
> +    /**
> +     * Wallclock start time of the stream in real world time, in microseconds
> +     * since the Unix epoch (00:00 1st January 1970). That is, the first packet
> +     * with a set pts was received at this real world time.
> +     * - demuxing: Set by libavformat. Users may want to use start_time_realtime
> +     *             if set.
> +     * - muxing: unused.
> +     */
> +    int64_t first_pts_wallclock;
> +
>       /**
>        * A callback for closing the streams opened with AVFormatContext.io_open().
>        *
> diff --git a/libavformat/demux.c b/libavformat/demux.c
> index 1620716716..9335a6efcd 100644
> --- a/libavformat/demux.c
> +++ b/libavformat/demux.c
> @@ -628,6 +628,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
>   
>           force_codec_ids(s, st);
>   
> +        if (s->first_pts_wallclock == AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
> +            s->first_pts_wallclock = av_gettime();
> +
>           /* TODO: audio: time filter; video: frame reordering (pts != dts) */
>           if (s->use_wallclock_as_timestamps)
>               pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
> diff --git a/libavformat/options.c b/libavformat/options.c
> index 0079a06d9a..4cc168939f 100644
> --- a/libavformat/options.c
> +++ b/libavformat/options.c
> @@ -184,6 +184,7 @@ AVFormatContext *avformat_alloc_context(void)
>           return NULL;
>       }
>   
> +    s->first_pts_wallclock = AV_NOPTS_VALUE;
>       si->shortest_end = AV_NOPTS_VALUE;
>   
>       return s;
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 966ebb7ed3..0708d619c0 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -31,7 +31,7 @@
>   
>   #include "version_major.h"
>   
> -#define LIBAVFORMAT_VERSION_MINOR  25
> +#define LIBAVFORMAT_VERSION_MINOR  26
>   #define LIBAVFORMAT_VERSION_MICRO 100
>   
>   #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
Andreas Rheinhardt June 18, 2022, 5 a.m. UTC | #2
Gyan Doshi:
> 
> 
> On 2022-06-16 02:39 pm, Gyan Doshi wrote:
>> Stores wallclock time for the first packet received with a pts.
> 
> Comments?
>> ---
>>   doc/APIchanges         |  3 +++
>>   libavformat/avformat.h | 10 ++++++++++
>>   libavformat/demux.c    |  3 +++
>>   libavformat/options.c  |  1 +
>>   libavformat/version.h  |  2 +-
>>   5 files changed, 18 insertions(+), 1 deletion(-)
>>
>> diff --git a/doc/APIchanges b/doc/APIchanges
>> index 5857e67ae6..3d472b8963 100644
>> --- a/doc/APIchanges
>> +++ b/doc/APIchanges
>> @@ -14,6 +14,9 @@ libavutil:     2021-04-27
>>     API changes, most recent first:
>>   +2022-06-xx - xxxxxxxxxx - lavf 59.26.100 - avformat.h
>> +  Add and set AVFormatContext.first_pts_wallclock field.
>> +
>>   2022-06-12 - xxxxxxxxxx - lavf 59.25.100 - avio.h
>>     Add avio_vprintf(), similar to avio_printf() but allow to use it
>>     from within a function taking a variable argument list as input.
>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>> index f12fa7d904..56f9656a68 100644
>> --- a/libavformat/avformat.h
>> +++ b/libavformat/avformat.h
>> @@ -1808,6 +1808,16 @@ typedef struct AVFormatContext {
>>        */
>>       int max_probe_packets;
>>   +    /**
>> +     * Wallclock start time of the stream in real world time, in
>> microseconds
>> +     * since the Unix epoch (00:00 1st January 1970). That is, the
>> first packet
>> +     * with a set pts was received at this real world time.
>> +     * - demuxing: Set by libavformat. Users may want to use
>> start_time_realtime
>> +     *             if set.
>> +     * - muxing: unused.
>> +     */
>> +    int64_t first_pts_wallclock;
>> +
>>       /**
>>        * A callback for closing the streams opened with
>> AVFormatContext.io_open().
>>        *
>> diff --git a/libavformat/demux.c b/libavformat/demux.c
>> index 1620716716..9335a6efcd 100644
>> --- a/libavformat/demux.c
>> +++ b/libavformat/demux.c
>> @@ -628,6 +628,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
>>             force_codec_ids(s, st);
>>   +        if (s->first_pts_wallclock == AV_NOPTS_VALUE && pkt->pts !=
>> AV_NOPTS_VALUE)
>> +            s->first_pts_wallclock = av_gettime();
>> +
>>           /* TODO: audio: time filter; video: frame reordering (pts !=
>> dts) */
>>           if (s->use_wallclock_as_timestamps)
>>               pkt->dts = pkt->pts = av_rescale_q(av_gettime(),
>> AV_TIME_BASE_Q, st->time_base);
>> diff --git a/libavformat/options.c b/libavformat/options.c
>> index 0079a06d9a..4cc168939f 100644
>> --- a/libavformat/options.c
>> +++ b/libavformat/options.c
>> @@ -184,6 +184,7 @@ AVFormatContext *avformat_alloc_context(void)
>>           return NULL;
>>       }
>>   +    s->first_pts_wallclock = AV_NOPTS_VALUE;
>>       si->shortest_end = AV_NOPTS_VALUE;
>>         return s;
>> diff --git a/libavformat/version.h b/libavformat/version.h
>> index 966ebb7ed3..0708d619c0 100644
>> --- a/libavformat/version.h
>> +++ b/libavformat/version.h
>> @@ -31,7 +31,7 @@
>>     #include "version_major.h"
>>   -#define LIBAVFORMAT_VERSION_MINOR  25
>> +#define LIBAVFORMAT_VERSION_MINOR  26
>>   #define LIBAVFORMAT_VERSION_MICRO 100
>>     #define LIBAVFORMAT_VERSION_INT
>> AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> 

Is there anyone who asked for this feature?

- Andreas
Gyan Doshi June 18, 2022, 5:47 a.m. UTC | #3
On 2022-06-18 10:30 am, Andreas Rheinhardt wrote:
> Gyan Doshi:
>>
>> On 2022-06-16 02:39 pm, Gyan Doshi wrote:
>>> Stores wallclock time for the first packet received with a pts.
>> Comments?
>>> ---
>>>    doc/APIchanges         |  3 +++
>>>    libavformat/avformat.h | 10 ++++++++++
>>>    libavformat/demux.c    |  3 +++
>>>    libavformat/options.c  |  1 +
>>>    libavformat/version.h  |  2 +-
>>>    5 files changed, 18 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/doc/APIchanges b/doc/APIchanges
>>> index 5857e67ae6..3d472b8963 100644
>>> --- a/doc/APIchanges
>>> +++ b/doc/APIchanges
>>> @@ -14,6 +14,9 @@ libavutil:     2021-04-27
>>>      API changes, most recent first:
>>>    +2022-06-xx - xxxxxxxxxx - lavf 59.26.100 - avformat.h
>>> +  Add and set AVFormatContext.first_pts_wallclock field.
>>> +
>>>    2022-06-12 - xxxxxxxxxx - lavf 59.25.100 - avio.h
>>>      Add avio_vprintf(), similar to avio_printf() but allow to use it
>>>      from within a function taking a variable argument list as input.
>>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>>> index f12fa7d904..56f9656a68 100644
>>> --- a/libavformat/avformat.h
>>> +++ b/libavformat/avformat.h
>>> @@ -1808,6 +1808,16 @@ typedef struct AVFormatContext {
>>>         */
>>>        int max_probe_packets;
>>>    +    /**
>>> +     * Wallclock start time of the stream in real world time, in
>>> microseconds
>>> +     * since the Unix epoch (00:00 1st January 1970). That is, the
>>> first packet
>>> +     * with a set pts was received at this real world time.
>>> +     * - demuxing: Set by libavformat. Users may want to use
>>> start_time_realtime
>>> +     *             if set.
>>> +     * - muxing: unused.
>>> +     */
>>> +    int64_t first_pts_wallclock;
>>> +
>>>        /**
>>>         * A callback for closing the streams opened with
>>> AVFormatContext.io_open().
>>>         *
>>> diff --git a/libavformat/demux.c b/libavformat/demux.c
>>> index 1620716716..9335a6efcd 100644
>>> --- a/libavformat/demux.c
>>> +++ b/libavformat/demux.c
>>> @@ -628,6 +628,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
>>>              force_codec_ids(s, st);
>>>    +        if (s->first_pts_wallclock == AV_NOPTS_VALUE && pkt->pts !=
>>> AV_NOPTS_VALUE)
>>> +            s->first_pts_wallclock = av_gettime();
>>> +
>>>            /* TODO: audio: time filter; video: frame reordering (pts !=
>>> dts) */
>>>            if (s->use_wallclock_as_timestamps)
>>>                pkt->dts = pkt->pts = av_rescale_q(av_gettime(),
>>> AV_TIME_BASE_Q, st->time_base);
>>> diff --git a/libavformat/options.c b/libavformat/options.c
>>> index 0079a06d9a..4cc168939f 100644
>>> --- a/libavformat/options.c
>>> +++ b/libavformat/options.c
>>> @@ -184,6 +184,7 @@ AVFormatContext *avformat_alloc_context(void)
>>>            return NULL;
>>>        }
>>>    +    s->first_pts_wallclock = AV_NOPTS_VALUE;
>>>        si->shortest_end = AV_NOPTS_VALUE;
>>>          return s;
>>> diff --git a/libavformat/version.h b/libavformat/version.h
>>> index 966ebb7ed3..0708d619c0 100644
>>> --- a/libavformat/version.h
>>> +++ b/libavformat/version.h
>>> @@ -31,7 +31,7 @@
>>>      #include "version_major.h"
>>>    -#define LIBAVFORMAT_VERSION_MINOR  25
>>> +#define LIBAVFORMAT_VERSION_MINOR  26
>>>    #define LIBAVFORMAT_VERSION_MICRO 100
>>>      #define LIBAVFORMAT_VERSION_INT
>>> AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> Is there anyone who asked for this feature?

I'm using it for a live inputs sync patch that I'll submit after some 
more testing in a few days,

Regards,
Gyan
zhilizhao(赵志立) June 18, 2022, 12:26 p.m. UTC | #4
> On Jun 18, 2022, at 12:01 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
> 
> 
> On 2022-06-16 02:39 pm, Gyan Doshi wrote:
>> Stores wallclock time for the first packet received with a pts.
> 
> Comments?

>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>> index f12fa7d904..56f9656a68 100644
>> --- a/libavformat/avformat.h
>> +++ b/libavformat/avformat.h
>> @@ -1808,6 +1808,16 @@ typedef struct AVFormatContext {
>>       */
>>      int max_probe_packets;
>>  +    /**
>> +     * Wallclock start time of the stream in real world time, in microseconds
>> +     * since the Unix epoch (00:00 1st January 1970). That is, the first packet
>> +     * with a set pts was received at this real world time.
>> +     * - demuxing: Set by libavformat. Users may want to use start_time_realtime
>> +     *             if set.
>> +     * - muxing: unused.
>> +     */
>> +    int64_t first_pts_wallclock;
>> +
>>      /**
>>       * A callback for closing the streams opened with AVFormatContext.io_open().
>>       *

It should be put after io_close2 to keep ABI compatible.

The usecase isn’t clear for this single patch.
Anton Khirnov June 18, 2022, 3:02 p.m. UTC | #5
Quoting Gyan Doshi (2022-06-18 06:01:21)
> 
> 
> On 2022-06-16 02:39 pm, Gyan Doshi wrote:
> > Stores wallclock time for the first packet received with a pts.
> 
> Comments?

This looks very ad-hoc and IMO does not belong in the library unless you
have a very strong reason.
diff mbox series

Patch

diff --git a/doc/APIchanges b/doc/APIchanges
index 5857e67ae6..3d472b8963 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,9 @@  libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2022-06-xx - xxxxxxxxxx - lavf 59.26.100 - avformat.h
+  Add and set AVFormatContext.first_pts_wallclock field.
+
 2022-06-12 - xxxxxxxxxx - lavf 59.25.100 - avio.h
   Add avio_vprintf(), similar to avio_printf() but allow to use it
   from within a function taking a variable argument list as input.
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index f12fa7d904..56f9656a68 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -1808,6 +1808,16 @@  typedef struct AVFormatContext {
      */
     int max_probe_packets;
 
+    /**
+     * Wallclock start time of the stream in real world time, in microseconds
+     * since the Unix epoch (00:00 1st January 1970). That is, the first packet
+     * with a set pts was received at this real world time.
+     * - demuxing: Set by libavformat. Users may want to use start_time_realtime
+     *             if set.
+     * - muxing: unused.
+     */
+    int64_t first_pts_wallclock;
+
     /**
      * A callback for closing the streams opened with AVFormatContext.io_open().
      *
diff --git a/libavformat/demux.c b/libavformat/demux.c
index 1620716716..9335a6efcd 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -628,6 +628,9 @@  FF_ENABLE_DEPRECATION_WARNINGS
 
         force_codec_ids(s, st);
 
+        if (s->first_pts_wallclock == AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
+            s->first_pts_wallclock = av_gettime();
+
         /* TODO: audio: time filter; video: frame reordering (pts != dts) */
         if (s->use_wallclock_as_timestamps)
             pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
diff --git a/libavformat/options.c b/libavformat/options.c
index 0079a06d9a..4cc168939f 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -184,6 +184,7 @@  AVFormatContext *avformat_alloc_context(void)
         return NULL;
     }
 
+    s->first_pts_wallclock = AV_NOPTS_VALUE;
     si->shortest_end = AV_NOPTS_VALUE;
 
     return s;
diff --git a/libavformat/version.h b/libavformat/version.h
index 966ebb7ed3..0708d619c0 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -31,7 +31,7 @@ 
 
 #include "version_major.h"
 
-#define LIBAVFORMAT_VERSION_MINOR  25
+#define LIBAVFORMAT_VERSION_MINOR  26
 #define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \