[FFmpeg-devel] Fix segment muxer

Submitted by just.one.man@yandex.ru on Oct. 7, 2019, 12:54 p.m.

Details

Message ID 59884611570452895@iva5-58d151f416d2.qloud-c.yandex.net
State New
Headers show

Commit Message

just.one.man@yandex.ru Oct. 7, 2019, 12:54 p.m.
When incoming media has non-zero start PTS,
segment muxer would fail to correctly calculate
the point where to chunk segments, as it always
assumed that media starts with PTS==0.

This change removes this assumption by remembering
the PTS of the very first frame passed through the muxer.

Also fix starting points of first segment
---
 libavformat/segment.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

--
1.7.9.5

Now I tried to re-format as Nicolas George said, hopefully this is okay and won't make a third entry in patchwork (if it does - how do I stop it from doing so?)

07.10.2019, 15:15, "Nicolas George" <george@nsup.org>:
> just.one.man@yandex.ru (12019-10-07):
>>  Updated patch
>
> This should be after the triple dash, because it does not belong in the
> commit message.
>
>>  ---
>>
>>  When incoming media has non-zero start PTS,
>>  segment muxer would fail to correctly calculate
>>  the point where to chunk segments, as it always
>>  assumed that media starts with PTS==0.
>>
>>  This change removes this assumption by remembering
>>  the PTS of the very first frame passed through the muxer.
>>
>>  Also fix starting points of first segment
>>  ---
>
> This should be before the triple dash, because it does belong in the
> commit message.
>
> I did not look at the code.
>
> Regards,
>
> --
>   Nicolas George
> ,
>
> _______________________________________________
> 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".

Comments

just.one.man@yandex.ru Oct. 10, 2019, 10:05 a.m.
Anything else I have to do to make this patch eventually taken in?

Thanks,
Vasily

пн, 7 окт. 2019 г. в 15:54, <just.one.man@yandex.ru>:

> When incoming media has non-zero start PTS,
> segment muxer would fail to correctly calculate
> the point where to chunk segments, as it always
> assumed that media starts with PTS==0.
>
> This change removes this assumption by remembering
> the PTS of the very first frame passed through the muxer.
>
> Also fix starting points of first segment
> ---
>  libavformat/segment.c |   12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/segment.c b/libavformat/segment.c
> index e308206..8b985df 100644
> --- a/libavformat/segment.c
> +++ b/libavformat/segment.c
> @@ -87,6 +87,7 @@ typedef struct SegmentContext {
>      int64_t last_val;      ///< remember last time for wrap around
> detection
>      int cut_pending;
>      int header_written;    ///< whether we've already called
> avformat_write_header
> +    int64_t start_pts;     ///< pts of the very first packet processed,
> used to compute correct segment length
>
>      char *entry_prefix;    ///< prefix to add to list entry filenames
>      int list_type;         ///< set the list type
> @@ -702,6 +703,7 @@ static int seg_init(AVFormatContext *s)
>          if ((ret = parse_frames(s, &seg->frames, &seg->nb_frames,
> seg->frames_str)) < 0)
>              return ret;
>      } else {
> +        seg->start_pts = AV_NOPTS_VALUE;
>          /* set default value if not specified */
>          if (!seg->time_str)
>              seg->time_str = av_strdup("2");
> @@ -914,7 +916,15 @@ calc_times:
>                  seg->cut_pending = 1;
>              seg->last_val = wrapped_val;
>          } else {
> -            end_pts = seg->time * (seg->segment_count + 1);
> +            if (seg->start_pts != AV_NOPTS_VALUE) {
> +                end_pts = seg->start_pts + seg->time *
> (seg->segment_count + 1);
> +            } else if (pkt->stream_index == seg->reference_stream_index
> && pkt->pts != AV_NOPTS_VALUE) {
> +                // this is the first packet of the reference stream we
> see, initialize start point
> +                seg->start_pts = av_rescale_q(pkt->pts, st->time_base,
> AV_TIME_BASE_Q);
> +                seg->cur_entry.start_time = (double)pkt->pts *
> av_q2d(st->time_base);
> +                seg->cur_entry.start_pts = seg->start_pts;
> +                end_pts = seg->start_pts + seg->time *
> (seg->segment_count + 1);
> +            }
>          }
>      }
>
> --
> 1.7.9.5
>
> Now I tried to re-format as Nicolas George said, hopefully this is okay
> and won't make a third entry in patchwork (if it does - how do I stop it
> from doing so?)
>
> 07.10.2019, 15:15, "Nicolas George" <george@nsup.org>:
> > just.one.man@yandex.ru (12019-10-07):
> >>  Updated patch
> >
> > This should be after the triple dash, because it does not belong in the
> > commit message.
> >
> >>  ---
> >>
> >>  When incoming media has non-zero start PTS,
> >>  segment muxer would fail to correctly calculate
> >>  the point where to chunk segments, as it always
> >>  assumed that media starts with PTS==0.
> >>
> >>  This change removes this assumption by remembering
> >>  the PTS of the very first frame passed through the muxer.
> >>
> >>  Also fix starting points of first segment
> >>  ---
> >
> > This should be before the triple dash, because it does belong in the
> > commit message.
> >
> > I did not look at the code.
> >
> > Regards,
> >
> > --
> >   Nicolas George
> > ,
> >
> > _______________________________________________
> > 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".
> _______________________________________________
> 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".
just.one.man@yandex.ru Oct. 17, 2019, 9:24 a.m.
Can I have _any_ response please? It was more than a week of silence... :(

Thanks,
Vasily

чт, 10 окт. 2019 г., 13:05 Vasily <just.one.man@yandex.ru>:

> Anything else I have to do to make this patch eventually taken in?
>
> Thanks,
> Vasily
>
> пн, 7 окт. 2019 г. в 15:54, <just.one.man@yandex.ru>:
>
>> When incoming media has non-zero start PTS,
>> segment muxer would fail to correctly calculate
>> the point where to chunk segments, as it always
>> assumed that media starts with PTS==0.
>>
>> This change removes this assumption by remembering
>> the PTS of the very first frame passed through the muxer.
>>
>> Also fix starting points of first segment
>> ---
>>  libavformat/segment.c |   12 +++++++++++-
>>  1 file changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavformat/segment.c b/libavformat/segment.c
>> index e308206..8b985df 100644
>> --- a/libavformat/segment.c
>> +++ b/libavformat/segment.c
>> @@ -87,6 +87,7 @@ typedef struct SegmentContext {
>>      int64_t last_val;      ///< remember last time for wrap around
>> detection
>>      int cut_pending;
>>      int header_written;    ///< whether we've already called
>> avformat_write_header
>> +    int64_t start_pts;     ///< pts of the very first packet processed,
>> used to compute correct segment length
>>
>>      char *entry_prefix;    ///< prefix to add to list entry filenames
>>      int list_type;         ///< set the list type
>> @@ -702,6 +703,7 @@ static int seg_init(AVFormatContext *s)
>>          if ((ret = parse_frames(s, &seg->frames, &seg->nb_frames,
>> seg->frames_str)) < 0)
>>              return ret;
>>      } else {
>> +        seg->start_pts = AV_NOPTS_VALUE;
>>          /* set default value if not specified */
>>          if (!seg->time_str)
>>              seg->time_str = av_strdup("2");
>> @@ -914,7 +916,15 @@ calc_times:
>>                  seg->cut_pending = 1;
>>              seg->last_val = wrapped_val;
>>          } else {
>> -            end_pts = seg->time * (seg->segment_count + 1);
>> +            if (seg->start_pts != AV_NOPTS_VALUE) {
>> +                end_pts = seg->start_pts + seg->time *
>> (seg->segment_count + 1);
>> +            } else if (pkt->stream_index == seg->reference_stream_index
>> && pkt->pts != AV_NOPTS_VALUE) {
>> +                // this is the first packet of the reference stream we
>> see, initialize start point
>> +                seg->start_pts = av_rescale_q(pkt->pts, st->time_base,
>> AV_TIME_BASE_Q);
>> +                seg->cur_entry.start_time = (double)pkt->pts *
>> av_q2d(st->time_base);
>> +                seg->cur_entry.start_pts = seg->start_pts;
>> +                end_pts = seg->start_pts + seg->time *
>> (seg->segment_count + 1);
>> +            }
>>          }
>>      }
>>
>> --
>> 1.7.9.5
>>
>> Now I tried to re-format as Nicolas George said, hopefully this is okay
>> and won't make a third entry in patchwork (if it does - how do I stop it
>> from doing so?)
>>
>> 07.10.2019, 15:15, "Nicolas George" <george@nsup.org>:
>> > just.one.man@yandex.ru (12019-10-07):
>> >>  Updated patch
>> >
>> > This should be after the triple dash, because it does not belong in the
>> > commit message.
>> >
>> >>  ---
>> >>
>> >>  When incoming media has non-zero start PTS,
>> >>  segment muxer would fail to correctly calculate
>> >>  the point where to chunk segments, as it always
>> >>  assumed that media starts with PTS==0.
>> >>
>> >>  This change removes this assumption by remembering
>> >>  the PTS of the very first frame passed through the muxer.
>> >>
>> >>  Also fix starting points of first segment
>> >>  ---
>> >
>> > This should be before the triple dash, because it does belong in the
>> > commit message.
>> >
>> > I did not look at the code.
>> >
>> > Regards,
>> >
>> > --
>> >   Nicolas George
>> > ,
>> >
>> > _______________________________________________
>> > 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".
>> _______________________________________________
>> 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".
>
>

Patch hide | download patch | download mbox

diff --git a/libavformat/segment.c b/libavformat/segment.c
index e308206..8b985df 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -87,6 +87,7 @@  typedef struct SegmentContext {
     int64_t last_val;      ///< remember last time for wrap around detection
     int cut_pending;
     int header_written;    ///< whether we've already called avformat_write_header
+    int64_t start_pts;     ///< pts of the very first packet processed, used to compute correct segment length

     char *entry_prefix;    ///< prefix to add to list entry filenames
     int list_type;         ///< set the list type
@@ -702,6 +703,7 @@  static int seg_init(AVFormatContext *s)
         if ((ret = parse_frames(s, &seg->frames, &seg->nb_frames, seg->frames_str)) < 0)
             return ret;
     } else {
+        seg->start_pts = AV_NOPTS_VALUE;
         /* set default value if not specified */
         if (!seg->time_str)
             seg->time_str = av_strdup("2");
@@ -914,7 +916,15 @@  calc_times:
                 seg->cut_pending = 1;
             seg->last_val = wrapped_val;
         } else {
-            end_pts = seg->time * (seg->segment_count + 1);
+            if (seg->start_pts != AV_NOPTS_VALUE) {
+                end_pts = seg->start_pts + seg->time * (seg->segment_count + 1);
+            } else if (pkt->stream_index == seg->reference_stream_index && pkt->pts != AV_NOPTS_VALUE) {
+                // this is the first packet of the reference stream we see, initialize start point
+                seg->start_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+                seg->cur_entry.start_time = (double)pkt->pts * av_q2d(st->time_base);
+                seg->cur_entry.start_pts = seg->start_pts;
+                end_pts = seg->start_pts + seg->time * (seg->segment_count + 1);
+            }
         }
     }