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" <[email protected]>:
> [email protected] (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
> [email protected]
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> [email protected] with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".