[FFmpeg-devel] [PATCH] Fix segment muxer
Vasily
just.one.man at yandex.ru
Thu Oct 10 13:05:24 EEST 2019
Anything else I have to do to make this patch eventually taken in?
Thanks,
Vasily
пн, 7 окт. 2019 г. в 15:54, <just.one.man at 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 at nsup.org>:
> > just.one.man at 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 at ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list