提交 f73ef374 编写于 作者: S Steven Liu

avformat/hlsenc: fix hls_flags temp_file bug

refer to ticket id: #6170

rename file from temp to origin name after complete current segment
Reviewed-by: NAman Gupta <ffmpeg@tmm1.net>
Signed-off-by: NSteven Liu <lq@chinaffmpeg.org>
上级 6bd79ba5
...@@ -691,6 +691,17 @@ static void write_m3u8_head_block(HLSContext *hls, AVIOContext *out, int version ...@@ -691,6 +691,17 @@ static void write_m3u8_head_block(HLSContext *hls, AVIOContext *out, int version
av_log(hls, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence); av_log(hls, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence);
} }
static void hls_rename_temp_file(AVFormatContext *s, AVFormatContext *oc)
{
size_t len = strlen(oc->filename);
char final_filename[sizeof(oc->filename)];
av_strlcpy(final_filename, oc->filename, len);
final_filename[len-4] = '\0';
ff_rename(oc->filename, final_filename, s);
oc->filename[len-4] = '\0';
}
static int hls_window(AVFormatContext *s, int last) static int hls_window(AVFormatContext *s, int last)
{ {
HLSContext *hls = s->priv_data; HLSContext *hls = s->priv_data;
...@@ -833,15 +844,6 @@ static int hls_start(AVFormatContext *s) ...@@ -833,15 +844,6 @@ static int hls_start(AVFormatContext *s)
char *filename, iv_string[KEYSIZE*2 + 1]; char *filename, iv_string[KEYSIZE*2 + 1];
int err = 0; int err = 0;
if ((c->flags & HLS_TEMP_FILE) && oc->filename[0] != 0) {
size_t len = strlen(oc->filename);
char final_filename[sizeof(oc->filename)];
av_strlcpy(final_filename, oc->filename, len);
final_filename[len-4] = '\0';
ff_rename(oc->filename, final_filename, s);
oc->filename[len-4] = '\0';
}
if (c->flags & HLS_SINGLE_FILE) { if (c->flags & HLS_SINGLE_FILE) {
av_strlcpy(oc->filename, c->basename, av_strlcpy(oc->filename, c->basename,
sizeof(oc->filename)); sizeof(oc->filename));
...@@ -1325,6 +1327,17 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1325,6 +1327,17 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
new_start_pos = avio_tell(hls->avf->pb); new_start_pos = avio_tell(hls->avf->pb);
hls->size = new_start_pos - hls->start_pos; hls->size = new_start_pos - hls->start_pos;
if ((hls->flags & HLS_TEMP_FILE) && oc->filename[0]) {
if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0))
if (hls->avf->oformat->priv_class && hls->avf->priv_data)
av_opt_set(hls->avf->priv_data, "mpegts_flags", "resend_headers", 0);
ff_format_io_close(s, &oc->pb);
if (hls->vtt_avf)
ff_format_io_close(s, &hls->vtt_avf->pb);
hls_rename_temp_file(s, oc);
}
ret = hls_append_segment(s, hls, hls->duration, hls->start_pos, hls->size); ret = hls_append_segment(s, hls, hls->duration, hls->start_pos, hls->size);
hls->start_pos = new_start_pos; hls->start_pos = new_start_pos;
if (ret < 0) { if (ret < 0) {
...@@ -1336,21 +1349,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1336,21 +1349,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
hls->duration = 0; hls->duration = 0;
if (hls->flags & HLS_SINGLE_FILE) { if (hls->flags & HLS_SINGLE_FILE) {
if (hls->avf->oformat->priv_class && hls->avf->priv_data)
av_opt_set(hls->avf->priv_data, "mpegts_flags", "resend_headers", 0);
hls->number++; hls->number++;
} else if (hls->max_seg_size > 0) { } else if (hls->max_seg_size > 0) {
if (hls->avf->oformat->priv_class && hls->avf->priv_data)
av_opt_set(hls->avf->priv_data, "mpegts_flags", "resend_headers", 0);
if (hls->start_pos >= hls->max_seg_size) { if (hls->start_pos >= hls->max_seg_size) {
hls->sequence++; hls->sequence++;
ff_format_io_close(s, &oc->pb);
if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) && if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) &&
strlen(hls->current_segment_final_filename_fmt)) { strlen(hls->current_segment_final_filename_fmt)) {
ff_rename(old_filename, hls->avf->filename, hls); 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); ret = hls_start(s);
hls->start_pos = 0; hls->start_pos = 0;
/* When split segment by byte, the duration is short than hls_time, /* When split segment by byte, the duration is short than hls_time,
...@@ -1359,13 +1365,10 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1359,13 +1365,10 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
} }
hls->number++; hls->number++;
} else { } else {
ff_format_io_close(s, &oc->pb);
if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) && if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) &&
strlen(hls->current_segment_final_filename_fmt)) { strlen(hls->current_segment_final_filename_fmt)) {
ff_rename(old_filename, hls->avf->filename, hls); 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); ret = hls_start(s);
} }
...@@ -1402,6 +1405,11 @@ static int hls_write_trailer(struct AVFormatContext *s) ...@@ -1402,6 +1405,11 @@ static int hls_write_trailer(struct AVFormatContext *s)
if (oc->pb) { if (oc->pb) {
hls->size = avio_tell(hls->avf->pb) - hls->start_pos; hls->size = avio_tell(hls->avf->pb) - hls->start_pos;
ff_format_io_close(s, &oc->pb); ff_format_io_close(s, &oc->pb);
if ((hls->flags & HLS_TEMP_FILE) && oc->filename[0]) {
hls_rename_temp_file(s, oc);
}
/* after av_write_trailer, then duration + 1 duration per packet */ /* after av_write_trailer, then duration + 1 duration per packet */
hls_append_segment(s, hls, hls->duration + hls->dpp, hls->start_pos, hls->size); hls_append_segment(s, hls, hls->duration + hls->dpp, hls->start_pos, hls->size);
} }
...@@ -1411,15 +1419,6 @@ static int hls_write_trailer(struct AVFormatContext *s) ...@@ -1411,15 +1419,6 @@ static int hls_write_trailer(struct AVFormatContext *s)
ff_rename(old_filename, hls->avf->filename, hls); ff_rename(old_filename, hls->avf->filename, hls);
} }
if ((hls->flags & HLS_TEMP_FILE) && oc->filename[0] != 0) {
size_t len = strlen(oc->filename);
char final_filename[sizeof(oc->filename)];
av_strlcpy(final_filename, oc->filename, len);
final_filename[len-4] = '\0';
ff_rename(oc->filename, final_filename, s);
oc->filename[len-4] = '\0';
}
if (vtt_oc) { if (vtt_oc) {
if (vtt_oc->pb) if (vtt_oc->pb)
av_write_trailer(vtt_oc); av_write_trailer(vtt_oc);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册