|
|
|
@@ -65,6 +65,7 @@ typedef struct { |
|
|
|
const AVClass *class; /**< Class for private options. */ |
|
|
|
int segment_idx; ///< index of the segment file to write, starting from 0 |
|
|
|
int segment_idx_wrap; ///< number after which the index wraps |
|
|
|
int segment_idx_wrap_nb; ///< number of time the index has wraped |
|
|
|
int segment_count; ///< number of segment files already written |
|
|
|
AVOutputFormat *oformat; |
|
|
|
AVFormatContext *avf; |
|
|
|
@@ -199,6 +200,9 @@ static int segment_start(AVFormatContext *s, int write_header) |
|
|
|
} |
|
|
|
|
|
|
|
seg->segment_idx++; |
|
|
|
if ((seg->segment_idx_wrap) && (seg->segment_idx%seg->segment_idx_wrap == 0)) |
|
|
|
seg->segment_idx_wrap_nb++; |
|
|
|
|
|
|
|
if ((err = set_segment_filename(s)) < 0) |
|
|
|
return err; |
|
|
|
|
|
|
|
@@ -689,7 +693,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
if ((ret = segment_start(s, seg->individual_header_trailer)) < 0) |
|
|
|
goto fail; |
|
|
|
|
|
|
|
seg->cur_entry.index = seg->segment_idx; |
|
|
|
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); |
|
|
|
} else if (pkt->pts != AV_NOPTS_VALUE) { |
|
|
|
@@ -795,6 +799,7 @@ static const AVOption options[] = { |
|
|
|
{ "segment_frames", "set segment split frame numbers", OFFSET(frames_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E }, |
|
|
|
{ "segment_wrap", "set number after which the index wraps", OFFSET(segment_idx_wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, |
|
|
|
{ "segment_start_number", "set the sequence number of the first segment", OFFSET(segment_idx), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, |
|
|
|
{ "segment_wrap_number", "set the number of wrap before the first segment", OFFSET(segment_idx_wrap_nb), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, |
|
|
|
|
|
|
|
{ "individual_header_trailer", "write header/trailer to each segment", OFFSET(individual_header_trailer), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E }, |
|
|
|
{ "write_header_trailer", "write a header to the first segment and a trailer to the last one", OFFSET(write_header_trailer), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E }, |
|
|
|
|