2017-01-12 17:18 GMT+08:00 Bodecs Bela <bode...@vivanet.hu>: > > > 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.
That's ok :) the mail title: [FFmpeg-user] issue with [PATCH] avformat/hlsenc: actual segment file size and duration in segment filenames > > >> 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 > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel