[FFmpeg-devel] [PATCH] avformat/hlsenc: fix hlsenc bug at windows system
Bodecs Bela
bodecsb at vivanet.hu
Thu Jan 12 12:44:35 EET 2017
Have you noticed my second comment also about code change in my earlier
reply?
2017.01.12. 10:39 keltezéssel, Steven Liu írta:
> 2017-01-12 17:18 GMT+08:00 Bodecs Bela <bodecsb at 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
>
I have read it now. I have compiled under windows with cygwin. It may
be the reason It did not occured for me.
I think to make the actual renaming after closing ts is a better
approach than mine was.
>
>
>>
>>> Reported-by: Christian Johannesen <chrisjohannesen at gmail.com>
>>> Signed-off-by: Steven Liu <lq at 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 at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list