Note that the second e-mail contains a more full version of patch which also 
updates times used to generate the playlist, so playlist is now also correct.

---
Thanks,
Vasily

02.10.2019, 14:22, "Vasily" <just.one....@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..2478d8f 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 = -1;
>          /* 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 != -1) {
> + 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
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to