Re: [FFmpeg-devel] [PATCH] Fix segment muxer
On Mon, 7 Oct 2019, just.one@yandex.ru wrote: Please use a proper commit title: e.g: avformat/segment: fix non-zero start pts Also make sure you provide the author name you want when you send the patch email. (you only provided an email address in the From field, not a full name, I guess this is not intentional). 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, >frames, >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) { What happens if the first packet is not from a reference stream? As far as I see in that case the output packet timestamp will be 0 based until we get a packet from the refence stream... Maybe you should accept a packet from any stream here? +// 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); +} } } Regards, Marton ___ 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".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
Can anyone answer me?.. :( чт, 17 окт. 2019 г., 12:24 Vasily : > Can I have _any_ response please? It was more than a week of silence... :( > > Thanks, > Vasily > > чт, 10 окт. 2019 г., 13:05 Vasily : > >> Anything else I have to do to make this patch eventually taken in? >> >> Thanks, >> Vasily >> >> пн, 7 окт. 2019 г. в 15:54, : >> >>> 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, >frames, >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" : >>> > just.one@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-requ...@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-requ...@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-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
Can I have _any_ response please? It was more than a week of silence... :( Thanks, Vasily чт, 10 окт. 2019 г., 13:05 Vasily : > Anything else I have to do to make this patch eventually taken in? > > Thanks, > Vasily > > пн, 7 окт. 2019 г. в 15:54, : > >> 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, >frames, >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" : >> > just.one@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-requ...@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-requ...@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-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
Anything else I have to do to make this patch eventually taken in? Thanks, Vasily пн, 7 окт. 2019 г. в 15:54, : > 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, >frames, >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" : > > just.one@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-requ...@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-requ...@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-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
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, >frames, >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" : > just.one@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-requ...@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-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
just.one@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 signature.asc Description: PGP signature ___ 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".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
Updated patch --- 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, >frames, >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 06.10.2019, 14:38, "Vasily" : > I used that value somewhere during patch development, but I eventually > settled on -1, because that "start_pts" and "end_pts" are using some other > units, not the unit used by pkt->pts. > > So I wanted to make a distinction. Though a possibility of negative > timestamps didn't come to me, so I probably have to change it back to > AV_NOPTS_VALUE. > > P.S. Thanks for reviewing my patch! > > вс, 6 окт. 2019 г., 13:56 Marton Balint : > >> On Thu, 3 Oct 2019, just.one@yandex.ru wrote: >> >> > It seems that my first attempt to send the patch failed (probably >> because my box where I executed "git send-email" failed reverse smtp >> check), so I'm going to re-send it to this same thread. >> > >> > --- >> > >> > 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, >frames, >nb_frames, >> seg->frames_str)) < 0) >> > return ret; >> > } else { >> > + seg->start_pts = -1; >> >> AV_NOPTS_VALUE would be probably better for this purpose, even if the >> muxer won't get negative timestamps unless allowed by the >> AVFMT_TS_NEGATIVE flag. >> >> Regards, >> Marton >> >> > /* 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 * >>
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
I used that value somewhere during patch development, but I eventually settled on -1, because that "start_pts" and "end_pts" are using some other units, not the unit used by pkt->pts. So I wanted to make a distinction. Though a possibility of negative timestamps didn't come to me, so I probably have to change it back to AV_NOPTS_VALUE. P.S. Thanks for reviewing my patch! вс, 6 окт. 2019 г., 13:56 Marton Balint : > > > On Thu, 3 Oct 2019, just.one@yandex.ru wrote: > > > It seems that my first attempt to send the patch failed (probably > because my box where I executed "git send-email" failed reverse smtp > check), so I'm going to re-send it to this same thread. > > > > --- > > > > 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, >frames, >nb_frames, > seg->frames_str)) < 0) > > return ret; > > } else { > > +seg->start_pts = -1; > > AV_NOPTS_VALUE would be probably better for this purpose, even if the > muxer won't get negative timestamps unless allowed by the > AVFMT_TS_NEGATIVE flag. > > Regards, > Marton > > > /* 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". > ___ > 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". ___ 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".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
On Thu, 3 Oct 2019, just.one@yandex.ru wrote: It seems that my first attempt to send the patch failed (probably because my box where I executed "git send-email" failed reverse smtp check), so I'm going to re-send it to this same thread. --- 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, >frames, >nb_frames, seg->frames_str)) < 0) return ret; } else { +seg->start_pts = -1; AV_NOPTS_VALUE would be probably better for this purpose, even if the muxer won't get negative timestamps unless allowed by the AVFMT_TS_NEGATIVE flag. Regards, Marton /* 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". ___ 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".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
It seems that my first attempt to send the patch failed (probably because my box where I executed "git send-email" failed reverse smtp check), so I'm going to re-send it to this same thread. --- 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, >frames, >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".
Re: [FFmpeg-devel] [PATCH] Fix segment muxer
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" : > 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, >frames, >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".