diff options
author | Senthilnathan M <senthil.codr@gmail.com> | 2014-04-02 23:17:13 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-04-03 01:06:21 +0400 |
commit | 96b8e7a9cd3ab8c4fbfaff7483e6d945dede1dcd (patch) | |
tree | 2b5d47b190d57d4b39e1980fb802b22efa3bb223 /libavformat/hlsenc.c | |
parent | 4754d4b37275ff42f0a3cfa325c074b30ba33d96 (diff) |
hlsenc: added floating point time support.
Necessary for HLS version 3 and above. Fixes ticket #3505.
Signed-off-by: Senthilnathan M <senthil.codr@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/hlsenc.c')
-rw-r--r-- | libavformat/hlsenc.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 1b5ef0e4b1..e7e67c61a7 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -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) { |