[FFmpeg-devel] [PATCH] avformat/hlsenc: fix hlsenc bug at windows system

Bodecs Bela bodecsb at vivanet.hu
Thu Jan 12 11:18:38 EET 2017



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 <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);



More information about the ffmpeg-devel mailing list