[FFmpeg-devel] [PATCH] lavf/segment: add option to write empty filler segments as needed
Stefano Sabatini
stefasab at gmail.com
Tue Dec 8 13:40:35 CET 2015
On date Monday 2015-12-07 14:24:44 -0600, Rodger Combs encoded:
> ---
> libavformat/segment.c | 22 +++++++++++++++-------
> 1 file changed, 15 insertions(+), 7 deletions(-)
Missing docs.
> diff --git a/libavformat/segment.c b/libavformat/segment.c
> index 8432d0f..acd266b 100644
> --- a/libavformat/segment.c
> +++ b/libavformat/segment.c
> @@ -113,6 +113,7 @@ typedef struct SegmentContext {
> char *reference_stream_specifier; ///< reference stream specifier
> int reference_stream_index;
> int break_non_keyframes;
> + int write_empty;
>
> int use_rename;
> char temp_list_filename[1024];
> @@ -763,6 +764,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
> if (!seg->avf)
> return AVERROR(EINVAL);
>
> +calc_times:
> if (seg->times) {
> end_pts = seg->segment_count < seg->nb_times ?
> seg->times[seg->segment_count] : INT64_MAX;
> @@ -794,11 +796,11 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
>
> if (pkt->stream_index == seg->reference_stream_index &&
> (pkt->flags & AV_PKT_FLAG_KEY || seg->break_non_keyframes) &&
> - seg->segment_frame_count > 0 &&
> + (seg->segment_frame_count > 0 || seg->write_empty) &&
> (seg->cut_pending || seg->frame_count >= start_frame ||
> (pkt->pts != AV_NOPTS_VALUE &&
> av_compare_ts(pkt->pts, st->time_base,
> - end_pts-seg->time_delta, AV_TIME_BASE_Q) >= 0))) {
> + end_pts - seg->time_delta, AV_TIME_BASE_Q) >= 0))) {
unrelated
> /* sanitize end time in case last packet didn't have a defined duration */
> if (seg->cur_entry.last_duration == 0)
> seg->cur_entry.end_time = (double)pkt->pts * av_q2d(st->time_base);
> @@ -813,11 +815,16 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
> seg->cur_entry.index = seg->segment_idx + seg->segment_idx_wrap * seg->segment_idx_wrap_nb;
> seg->cur_entry.start_time = (double)pkt->pts * av_q2d(st->time_base);
> seg->cur_entry.start_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
> - seg->cur_entry.end_time = seg->cur_entry.start_time +
> - pkt->pts != AV_NOPTS_VALUE ? (double)(pkt->pts + pkt->duration) * av_q2d(st->time_base) : 0;
> - } else if (pkt->pts != AV_NOPTS_VALUE && pkt->stream_index == seg->reference_stream_index) {
> - seg->cur_entry.end_time =
> - FFMAX(seg->cur_entry.end_time, (double)(pkt->pts + pkt->duration) * av_q2d(st->time_base));
> + seg->cur_entry.end_time = seg->cur_entry.start_time;
> +
> + if (seg->times || (!seg->frames && !seg->use_clocktime) && seg->write_empty)
> + goto calc_times;
I dislike this goto here, since I'd like to keep the distinction between
the logic setting end_pts/start_frame and the one selecting whether to
close the segment.
> + }
> +
> + if (pkt->stream_index == seg->reference_stream_index) {
> + if (pkt->pts != AV_NOPTS_VALUE)
> + seg->cur_entry.end_time =
> + FFMAX(seg->cur_entry.end_time, (double)(pkt->pts + pkt->duration) * av_q2d(st->time_base));
This factorization is fine, but should be probably sent as a separate patch.
[...]
Thanks.
--
FFmpeg = Fanciful & Fierce Multimedia Patchable Explosive Generator
More information about the ffmpeg-devel
mailing list