[FFmpeg-devel] [PATCH] libavformat/hlsenc: fix broken -hls_flags +temp_file
Aleksey Skripka
caspy at undev.ru
Fri Dec 14 11:27:38 EET 2018
greetings!
fixed version.
thanks.
---
--- 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
More information about the ffmpeg-devel
mailing list