summaryrefslogtreecommitdiff
path: root/libavformat/hlsenc.c
diff options
context:
space:
mode:
authorSenthilnathan M <senthil.codr@gmail.com>2014-04-03 00:47:13 +0530
committerMichael Niedermayer <michaelni@gmx.at>2014-04-02 23:06:21 +0200
commit96b8e7a9cd3ab8c4fbfaff7483e6d945dede1dcd (patch)
tree2b5d47b190d57d4b39e1980fb802b22efa3bb223 /libavformat/hlsenc.c
parent4754d4b37275ff42f0a3cfa325c074b30ba33d96 (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.c14
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) {