[FFmpeg-devel] [PATCH] libavformat/hlsenc: fix broken -hls_flags +temp_file
Aleksey Skripka
caspy at undev.ru
Fri Dec 14 16:56:03 EET 2018
one more try, via 'git format-patch'.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-libavformat-hlsenc-fix-broken-hls_flags-temp_file.patch
Type: application/octet-stream
Size: 3926 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181214/077981df/attachment.obj>
-------------- next part --------------
> On 14 Dec 2018, at 17:21, Steven Liu <lq at chinaffmpeg.org> wrote:
>
>
>
>> On Dec 14, 2018, at 19:23, Aleksey Skripka <caspy at undev.ru> wrote:
>>
>>>
>>> On 14 Dec 2018, at 13:10, Liu Steven <lq at chinaffmpeg.org> wrote:
>>>
>>>
>>>
>>>> 在 2018年12月14日,下午5:27,Aleksey Skripka <caspy at undev.ru> 写道:
>>>>
>>>> greetings!
>>>>
>>>> fixed version.
>>>> thanks.
>>> Is this patch create by git format-patch ?
>> no.
>> diff -up fileA fileB
> https://ffmpeg.org/developer.html#Submitting-patches-1
> This is the rule for make a patch, I think your code is ok. :D
>
>>
>>>>
>>>> ---
>>>> --- 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
>>>
>>> _______________________________________________
>>> 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
>
> Thanks
> Steven
>
>
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list