2017.01.12. 6:03 keltezéssel, Steven Liu írta:
when hlsenc use flag second_level_segment_index,
second_level_segment_size and second_level_segment_duration,
the rename is ok but the output filename always use the old filename
so move the rename operation after the close the ts file and
before open new segment
It is strange. I have tested my original patch on windows 7. Sorry.
Reported-by: Christian Johannesen <chrisjohanne...@gmail.com>
Signed-off-by: Steven Liu <l...@chinaffmpeg.org>
---
libavformat/hlsenc.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index a2c606c..772232b 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -499,7 +499,6 @@ static int hls_append_segment(struct AVFormatContext *s,
HLSContext *hls, double
}
av_free(filename);
}
- ff_rename(old_filename, hls->avf->filename, hls);
av_free(old_filename);
}
I suggest to remove here, in this same scope all old_filename related
code, because it was used by ff_rename only:
- char * old_filename = av_strdup(hls->avf->filename); // %%s
will be %s after strftime
- if (!old_filename) {
- av_free(en);
- return AVERROR(ENOMEM);
- }
and at several places inside if() branch:
- av_free(old_filename);
@@ -1239,14 +1238,22 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
if (can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base,
end_pts, AV_TIME_BASE_Q) >= 0) {
int64_t new_start_pos;
+ char *old_filename = av_strdup(hls->avf->filename);
+
+ if (!old_filename) {
+ return AVERROR(ENOMEM);
+ }
+
av_write_frame(oc, NULL); /* Flush any buffered data */
new_start_pos = avio_tell(hls->avf->pb);
hls->size = new_start_pos - hls->start_pos;
ret = hls_append_segment(s, hls, hls->duration, hls->start_pos,
hls->size);
hls->start_pos = new_start_pos;
- if (ret < 0)
+ if (ret < 0) {
+ av_free(old_filename);
return ret;
+ }
hls->end_pts = pkt->pts;
hls->duration = 0;
@@ -1261,6 +1268,10 @@ static int hls_write_packet(AVFormatContext *s, AVPacket
*pkt)
if (hls->start_pos >= hls->max_seg_size) {
hls->sequence++;
ff_format_io_close(s, &oc->pb);
+ if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE |
HLS_SECOND_LEVEL_SEGMENT_DURATION)) &&
+ strlen(hls->current_segment_final_filename_fmt)) {
+ ff_rename(old_filename, hls->avf->filename, hls);
+ }
if (hls->vtt_avf)
ff_format_io_close(s, &hls->vtt_avf->pb);
ret = hls_start(s);
@@ -1272,22 +1283,30 @@ static int hls_write_packet(AVFormatContext *s,
AVPacket *pkt)
hls->number++;
} else {
ff_format_io_close(s, &oc->pb);
+ if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE |
HLS_SECOND_LEVEL_SEGMENT_DURATION)) &&
+ strlen(hls->current_segment_final_filename_fmt)) {
+ ff_rename(old_filename, hls->avf->filename, hls);
+ }
if (hls->vtt_avf)
ff_format_io_close(s, &hls->vtt_avf->pb);
ret = hls_start(s);
}
- if (ret < 0)
+ if (ret < 0) {
+ av_free(old_filename);
return ret;
+ }
if( st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE )
oc = hls->vtt_avf;
else
oc = hls->avf;
- if ((ret = hls_window(s, 0)) < 0)
+ if ((ret = hls_window(s, 0)) < 0) {
+ av_free(old_filename);
return ret;
+ }
}
ret = ff_write_chained(oc, stream_index, pkt, s, 0);
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel