[FFmpeg-devel] [PATCH] libavformat/hlsenc: fix broken -hls_flags +temp_file
Liu Steven
lq at chinaffmpeg.org
Fri Dec 14 12:10:27 EET 2018
> 在 2018年12月14日,下午5:27,Aleksey Skripka <caspy at undev.ru> 写道:
>
> greetings!
>
> fixed version.
> thanks.
Is this patch create by git format-patch ?
>
> ---
> --- libavformat/hlsenc.c.orig 2018-12-14 09:25:06.541809226 +0000
> +++ libavformat/hlsenc.c 2018-12-14 09:19:16.129377384 +0000
> @@ -1348,7 +1348,7 @@ static int hls_window(AVFormatContext *s
> char temp_filename[1024];
> int64_t sequence = FFMAX(hls->start_sequence, vs->sequence - vs->nb_entries);
> const char *proto = avio_find_protocol_name(s->url);
> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
> + int use_temp_file = proto && !strcmp(proto, "file");
> static unsigned warned_non_file;
> char *key_uri = NULL;
> char *iv_string = NULL;
> @@ -1463,7 +1463,7 @@ static int hls_start(AVFormatContext *s,
> AVFormatContext *vtt_oc = vs->vtt_avf;
> AVDictionary *options = NULL;
> const char *proto = avio_find_protocol_name(s->url);
> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE);
> char *filename, iv_string[KEYSIZE*2 + 1];
> int err = 0;
>
> @@ -2123,7 +2123,7 @@ static int hls_write_packet(AVFormatCont
> int stream_index = 0;
> int range_length = 0;
> const char *proto = avio_find_protocol_name(s->url);
> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE);
> uint8_t *buffer = NULL;
> VariantStream *vs = NULL;
> AVDictionary *options = NULL;
> @@ -2251,7 +2251,6 @@ static int hls_write_packet(AVFormatCont
> if (hls->flags & HLS_SINGLE_FILE) {
> ret = flush_dynbuf(vs, &range_length);
> if (ret < 0) {
> - av_free(old_filename);
> return ret;
> }
> vs->size = range_length;
> @@ -2269,20 +2268,12 @@ static int hls_write_packet(AVFormatCont
> return ret;
> }
> ff_format_io_close(s, &vs->out);
> -
> - // rename that segment from .tmp to the real one
> - if (use_temp_file && oc->url[0]) {
> - hls_rename_temp_file(s, oc);
> - av_free(old_filename);
> - old_filename = av_strdup(vs->avf->url);
> -
> - if (!old_filename) {
> - return AVERROR(ENOMEM);
> - }
> - }
> }
> }
>
> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE))
> + hls_rename_temp_file(s, oc);
> +
> old_filename = av_strdup(vs->avf->url);
> if (!old_filename) {
> return AVERROR(ENOMEM);
> @@ -2348,7 +2339,7 @@ static int hls_write_trailer(struct AVFo
> AVFormatContext *vtt_oc = NULL;
> char *old_filename = NULL;
> const char *proto = avio_find_protocol_name(s->url);
> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE);
> int i;
> int ret = 0;
> VariantStream *vs = NULL;
> ---
>
> --
> Aleksey Skripka
>
>
>
>> On 14 Dec 2018, at 11:38, Liu Steven <lq at chinaffmpeg.org> wrote:
>>
>>
>>
>>> 在 2018年12月14日,下午3:04,Aleksey Skripka <caspy at undev.ru> 写道:
>>>
>>> greetings!
>>>
>>> after commit 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 temp_file functionality totally broken.
>>>
>>> attached patch prototype will fix:
>>> 1) while assigning 'use_temp_file' addressing to '->flags' is done incorrectly in 4 places.
>>> 2) before that commit playlist was always created via .tmp for 'file' proto, now not. sure we should keep it in such way, thus not look for this flag in hls_window().
>>> 3) rename logic in hls_write_packet() was accidentally moved to fMP4-only code, thus not renaming files for mpegts.
>>> 4) av_free() call, where variable always NULL.
>>>
>>> please take a look.
>>>
>>> ---
>>> --- libavformat/hlsenc.c.orig 2018-12-13 13:27:03.307499151 +0000
>>> +++ libavformat/hlsenc.c 2018-12-13 20:19:59.781833259 +0000
>>> @@ -1348,7 +1348,7 @@ static int hls_window(AVFormatContext *s
>>> char temp_filename[1024];
>>> int64_t sequence = FFMAX(hls->start_sequence, vs->sequence - vs->nb_entries);
>>> const char *proto = avio_find_protocol_name(s->url);
>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
>>> + int use_temp_file = proto && !strcmp(proto, "file")/* && (hls->flags & HLS_TEMP_FILE)*/; // always use .tmp logic for 'file' proto.
>>> static unsigned warned_non_file;
>>> char *key_uri = NULL;
>>> char *iv_string = NULL;
>>> @@ -1463,7 +1463,7 @@ static int hls_start(AVFormatContext *s,
>>> AVFormatContext *vtt_oc = vs->vtt_avf;
>>> AVDictionary *options = NULL;
>>> const char *proto = avio_find_protocol_name(s->url);
>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
>>> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE);
>>> char *filename, iv_string[KEYSIZE*2 + 1];
>>> int err = 0;
>>>
>>> @@ -2123,7 +2123,7 @@ static int hls_write_packet(AVFormatCont
>>> int stream_index = 0;
>>> int range_length = 0;
>>> const char *proto = avio_find_protocol_name(s->url);
>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE);
>>> uint8_t *buffer = NULL;
>>> VariantStream *vs = NULL;
>>> AVDictionary *options = NULL;
>>> @@ -2249,7 +2249,8 @@ static int hls_write_packet(AVFormatCont
>>> if (hls->flags & HLS_SINGLE_FILE) {
>>> ret = flush_dynbuf(vs, &range_length);
>>> if (ret < 0) {
>>> - av_free(old_filename);
>>> +// old_filename not yet defined here
>>> +// av_free(old_filename);
>>> return ret;
>>> }
>>> vs->size = range_length;
>>> @@ -2268,19 +2269,23 @@ static int hls_write_packet(AVFormatCont
>>> }
>>> ff_format_io_close(s, &vs->out);
>>>
>>> - // rename that segment from .tmp to the real one
>>> - if (use_temp_file && oc->url[0]) {
>>> - hls_rename_temp_file(s, oc);
>>> - av_free(old_filename);
>>> - old_filename = av_strdup(vs->avf->url);
>>> -
>>> - if (!old_filename) {
>>> - return AVERROR(ENOMEM);
>>> - }
>>> - }
>>> +// bad place for rename here, it does not rename non-fmp4 files
>>> +// // rename that segment from .tmp to the real one
>>> +// if (use_temp_file && oc->url[0]) {
>>> +// hls_rename_temp_file(s, oc);
>>> +// av_free(old_filename);
>>> +// old_filename = av_strdup(vs->avf->url);
>>> +//
>>> +// if (!old_filename) {
>>> +// return AVERROR(ENOMEM);
>>> +// }
>>> +// }
>> remove the code block when it unused.
>>> }
>>> }
>>>
>>> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE))
>>> + hls_rename_temp_file(s, oc);
>>> +
>>> old_filename = av_strdup(vs->avf->url);
>>> if (!old_filename) {
>>> return AVERROR(ENOMEM);
>>> @@ -2346,7 +2351,7 @@ static int hls_write_trailer(struct AVFo
>>> AVFormatContext *vtt_oc = NULL;
>>> char *old_filename = NULL;
>>> const char *proto = avio_find_protocol_name(s->url);
>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE);
>>> int i;
>>> int ret = 0;
>>> VariantStream *vs = NULL;
>>> ---
>>> --
>>> Aleksey Skripka
>>> --
>>> Aleksey Skripka
>>>
>>
>> Thanks
>>
>> Steven
>>>
>>>
>>> _______________________________________________
>>> 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
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list