|
|
|
@@ -33,7 +33,7 @@ |
|
|
|
|
|
|
|
typedef struct ListEntry { |
|
|
|
char name[1024]; |
|
|
|
int duration; |
|
|
|
double duration; |
|
|
|
struct ListEntry *next; |
|
|
|
} ListEntry; |
|
|
|
|
|
|
|
@@ -50,7 +50,7 @@ typedef struct HLSContext { |
|
|
|
int has_video; |
|
|
|
int64_t start_pts; |
|
|
|
int64_t end_pts; |
|
|
|
int64_t duration; // last segment duration computed so far, in seconds |
|
|
|
double duration; // last segment duration computed so far, in seconds |
|
|
|
int nb_entries; |
|
|
|
ListEntry *list; |
|
|
|
ListEntry *end_list; |
|
|
|
@@ -83,7 +83,7 @@ static int hls_mux_init(AVFormatContext *s) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int append_entry(HLSContext *hls, uint64_t duration) |
|
|
|
static int append_entry(HLSContext *hls, double duration) |
|
|
|
{ |
|
|
|
ListEntry *en = av_malloc(sizeof(*en)); |
|
|
|
|
|
|
|
@@ -138,7 +138,7 @@ static int hls_window(AVFormatContext *s, int last) |
|
|
|
|
|
|
|
for (en = hls->list; en; en = en->next) { |
|
|
|
if (target_duration < en->duration) |
|
|
|
target_duration = en->duration; |
|
|
|
target_duration = (int) floor(en->duration + 0.5); |
|
|
|
} |
|
|
|
|
|
|
|
avio_printf(hls->pb, "#EXTM3U\n"); |
|
|
|
@@ -148,7 +148,7 @@ static int hls_window(AVFormatContext *s, int last) |
|
|
|
FFMAX(0, hls->sequence - hls->nb_entries)); |
|
|
|
|
|
|
|
for (en = hls->list; en; en = en->next) { |
|
|
|
avio_printf(hls->pb, "#EXTINF:%d,\n", en->duration); |
|
|
|
avio_printf(hls->pb, "#EXTINF:%lf,\n", en->duration); |
|
|
|
avio_printf(hls->pb, "%s\n", en->name); |
|
|
|
} |
|
|
|
|
|
|
|
@@ -270,8 +270,8 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
is_ref_pkt = can_split = 0; |
|
|
|
|
|
|
|
if (is_ref_pkt) |
|
|
|
hls->duration = av_rescale(pkt->pts - hls->end_pts, |
|
|
|
st->time_base.num, st->time_base.den); |
|
|
|
hls->duration = (double)(pkt->pts - hls->end_pts) |
|
|
|
* st->time_base.num / st->time_base.den; |
|
|
|
|
|
|
|
if (can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base, |
|
|
|
end_pts, AV_TIME_BASE_Q) >= 0) { |
|
|
|
|