> 在 2018年12月14日,下午5:27,Aleksey Skripka <ca...@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 <l...@chinaffmpeg.org> wrote: >> >> >> >>> 在 2018年12月14日,下午3:04,Aleksey Skripka <ca...@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@ffmpeg.org >>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >> >> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel