mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
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>
This commit is contained in:
parent
4754d4b372
commit
96b8e7a9cd
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user