|
|
|
@@ -460,16 +460,10 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double |
|
|
|
|
|
|
|
if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) && |
|
|
|
strlen(hls->current_segment_final_filename_fmt)) { |
|
|
|
char * old_filename = av_strdup(hls->avf->filename); // %%s will be %s after strftime |
|
|
|
if (!old_filename) { |
|
|
|
av_free(en); |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
av_strlcpy(hls->avf->filename, hls->current_segment_final_filename_fmt, sizeof(hls->avf->filename)); |
|
|
|
if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_SIZE) { |
|
|
|
char * filename = av_strdup(hls->avf->filename); // %%s will be %s after strftime |
|
|
|
if (!filename) { |
|
|
|
av_free(old_filename); |
|
|
|
av_free(en); |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
@@ -480,7 +474,6 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double |
|
|
|
"you can try to remove second_level_segment_size flag\n", |
|
|
|
filename); |
|
|
|
av_free(filename); |
|
|
|
av_free(old_filename); |
|
|
|
av_free(en); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
@@ -489,7 +482,6 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double |
|
|
|
if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_DURATION) { |
|
|
|
char * filename = av_strdup(hls->avf->filename); // %%t will be %t after strftime |
|
|
|
if (!filename) { |
|
|
|
av_free(old_filename); |
|
|
|
av_free(en); |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
@@ -500,14 +492,11 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double |
|
|
|
"you can try to remove second_level_segment_time flag\n", |
|
|
|
filename); |
|
|
|
av_free(filename); |
|
|
|
av_free(old_filename); |
|
|
|
av_free(en); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
av_free(filename); |
|
|
|
} |
|
|
|
ff_rename(old_filename, hls->avf->filename, hls); |
|
|
|
av_free(old_filename); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@@ -1268,14 +1257,22 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
if (can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base, |
|
|
|
end_pts, AV_TIME_BASE_Q) >= 0) { |
|
|
|
int64_t new_start_pos; |
|
|
|
char *old_filename = av_strdup(hls->avf->filename); |
|
|
|
|
|
|
|
if (!old_filename) { |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
|
|
|
|
av_write_frame(oc, NULL); /* Flush any buffered data */ |
|
|
|
|
|
|
|
new_start_pos = avio_tell(hls->avf->pb); |
|
|
|
hls->size = new_start_pos - hls->start_pos; |
|
|
|
ret = hls_append_segment(s, hls, hls->duration, hls->start_pos, hls->size); |
|
|
|
hls->start_pos = new_start_pos; |
|
|
|
if (ret < 0) |
|
|
|
if (ret < 0) { |
|
|
|
av_free(old_filename); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
hls->end_pts = pkt->pts; |
|
|
|
hls->duration = 0; |
|
|
|
@@ -1290,6 +1287,10 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
if (hls->start_pos >= hls->max_seg_size) { |
|
|
|
hls->sequence++; |
|
|
|
ff_format_io_close(s, &oc->pb); |
|
|
|
if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) && |
|
|
|
strlen(hls->current_segment_final_filename_fmt)) { |
|
|
|
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); |
|
|
|
@@ -1301,22 +1302,30 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
hls->number++; |
|
|
|
} else { |
|
|
|
ff_format_io_close(s, &oc->pb); |
|
|
|
if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) && |
|
|
|
strlen(hls->current_segment_final_filename_fmt)) { |
|
|
|
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); |
|
|
|
} |
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
if (ret < 0) { |
|
|
|
av_free(old_filename); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
if( st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ) |
|
|
|
oc = hls->vtt_avf; |
|
|
|
else |
|
|
|
oc = hls->avf; |
|
|
|
|
|
|
|
if ((ret = hls_window(s, 0)) < 0) |
|
|
|
if ((ret = hls_window(s, 0)) < 0) { |
|
|
|
av_free(old_filename); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ret = ff_write_chained(oc, stream_index, pkt, s, 0); |
|
|
|
@@ -1329,6 +1338,12 @@ static int hls_write_trailer(struct AVFormatContext *s) |
|
|
|
HLSContext *hls = s->priv_data; |
|
|
|
AVFormatContext *oc = hls->avf; |
|
|
|
AVFormatContext *vtt_oc = hls->vtt_avf; |
|
|
|
char *old_filename = av_strdup(hls->avf->filename); |
|
|
|
|
|
|
|
if (!old_filename) { |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
av_write_trailer(oc); |
|
|
|
if (oc->pb) { |
|
|
|
@@ -1338,6 +1353,11 @@ static int hls_write_trailer(struct AVFormatContext *s) |
|
|
|
hls_append_segment(s, hls, hls->duration + hls->dpp, hls->start_pos, hls->size); |
|
|
|
} |
|
|
|
|
|
|
|
if ((hls->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION)) && |
|
|
|
strlen(hls->current_segment_final_filename_fmt)) { |
|
|
|
ff_rename(old_filename, hls->avf->filename, hls); |
|
|
|
} |
|
|
|
|
|
|
|
if (vtt_oc) { |
|
|
|
if (vtt_oc->pb) |
|
|
|
av_write_trailer(vtt_oc); |
|
|
|
@@ -1358,6 +1378,7 @@ static int hls_write_trailer(struct AVFormatContext *s) |
|
|
|
|
|
|
|
hls_free_segments(hls->segments); |
|
|
|
hls_free_segments(hls->old_segments); |
|
|
|
av_free(old_filename); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
|