diff mbox series

[FFmpeg-devel,GSoC,v3,6/7] avformat/hls add metadata "abr_initial" for ffplay

Message ID 20200823122355.188611-6-sj.hc_Zhong@sjtu.edu.cn
State New
Headers show
Series [FFmpeg-devel,GSoC,v3,1/7] avformat/abr: Adaptive Bitrate support
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Hongcheng Zhong Aug. 23, 2020, 12:23 p.m. UTC
From: spartazhc <spartazhc@gmail.com>

Add an AVDictionary option "abr_initial", which could be used to send
message to ffplay. Currently, the first entry "abr_init_duration" is
added.

Signed-off-by: spartazhc <spartazhc@gmail.com>
---
 doc/demuxers.texi |  3 +++
 libavformat/hls.c | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

Comments

Steven Liu Sept. 3, 2020, 3 p.m. UTC | #1
> 在 2020年8月23日,20:23,Hongcheng Zhong <sj.hc_zhong@sjtu.edu.cn> 写道:
> 
> From: spartazhc <spartazhc@gmail.com>
> 
> Add an AVDictionary option "abr_initial", which could be used to send
> message to ffplay. Currently, the first entry "abr_init_duration" is
> added.
> 
> Signed-off-by: spartazhc <spartazhc@gmail.com>
> ---
> doc/demuxers.texi |  3 +++
> libavformat/hls.c | 14 ++++++++++++++
> 2 files changed, 17 insertions(+)
> 
> diff --git a/doc/demuxers.texi b/doc/demuxers.texi
> index 4cdbd95962..761a372b86 100644
> --- a/doc/demuxers.texi
> +++ b/doc/demuxers.texi
> @@ -324,6 +324,9 @@ It accepts the following options:
> @item abr
> enable abr to switch streams.
> 
> +@item abr_initial
> +metadata used by abr for ffplay.
> +
> @item live_start_index
> segment index to start live streams at (negative values are from the end).
> 
> diff --git a/libavformat/hls.c b/libavformat/hls.c
> index 37a5a017b1..5c251cd002 100644
> --- a/libavformat/hls.c
> +++ b/libavformat/hls.c
> @@ -243,6 +243,7 @@ typedef struct HLSContext {
>     AVIOContext *playlist_pb;
> 
>     int abr;
> +    AVDictionary *abr_initial;
>     struct throughput  *throughputs;
>     struct switch_task *switch_tasks;
>     struct switch_info *switch_info;
> @@ -2308,6 +2309,7 @@ static int hls_read_header(AVFormatContext *s)
>     }
> 
>     if (c->abr) {
> +        int64_t abr_init_duration = AV_NOPTS_VALUE;
>         c->switch_tasks = av_malloc(c->n_playlists * sizeof(struct switch_task));
>         if (!c->switch_tasks) {
>             ret = AVERROR(ENOMEM);
> @@ -2326,6 +2328,15 @@ static int hls_read_header(AVFormatContext *s)
>         for (i = 0; i < c->n_playlists; i++) {
>             struct playlist *pls = c->playlists[i];
>             int type;
> +            int64_t start = 0;
> +            for (int i = 0; i < c->cur_seq_no + 1; i++) {
> +                start += pls->segments[i]->duration;
> +            }
> +            start = av_rescale_q(start,
> +                                    AV_TIME_BASE_Q,
> +                                    get_timebase(pls));
> +            if (abr_init_duration == AV_NOPTS_VALUE || abr_init_duration > start)
> +                abr_init_duration = start;
> 
>             c->switch_tasks[i].switch_timestamp = AV_NOPTS_VALUE;
>             type = playlist_type_simple(pls);
> @@ -2337,6 +2348,7 @@ static int hls_read_header(AVFormatContext *s)
>                     c->switch_info[SWITCH_VIDEO].pls_index = pls->index;
>             }
>         }
> +        av_dict_set_int(&c->abr_initial, "abr_init_duration", abr_init_duration, 0);
>     }
>     update_noheader_flag(s);
> 
> @@ -2768,6 +2780,8 @@ static int hls_probe(const AVProbeData *p)
> static const AVOption hls_options[] = {
>     {"abr", "enable abr to switch streams",
>         OFFSET(abr), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
> +    {"abr_initial",  "metadata used by abr for ffplay",
> +        OFFSET(abr_initial), AV_OPT_TYPE_DICT, { 0 }, 0, 0, FLAGS },
>     {"live_start_index", "segment index to start live streams at (negative values are from the end)",
>         OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS},
>     {"allowed_extensions", "List of file extensions that hls is allowed to access",
> -- 
> 2.28.0
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

should be ok.

Thanks
Steven
diff mbox series

Patch

diff --git a/doc/demuxers.texi b/doc/demuxers.texi
index 4cdbd95962..761a372b86 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -324,6 +324,9 @@  It accepts the following options:
 @item abr
 enable abr to switch streams.
 
+@item abr_initial
+metadata used by abr for ffplay.
+
 @item live_start_index
 segment index to start live streams at (negative values are from the end).
 
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 37a5a017b1..5c251cd002 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -243,6 +243,7 @@  typedef struct HLSContext {
     AVIOContext *playlist_pb;
 
     int abr;
+    AVDictionary *abr_initial;
     struct throughput  *throughputs;
     struct switch_task *switch_tasks;
     struct switch_info *switch_info;
@@ -2308,6 +2309,7 @@  static int hls_read_header(AVFormatContext *s)
     }
 
     if (c->abr) {
+        int64_t abr_init_duration = AV_NOPTS_VALUE;
         c->switch_tasks = av_malloc(c->n_playlists * sizeof(struct switch_task));
         if (!c->switch_tasks) {
             ret = AVERROR(ENOMEM);
@@ -2326,6 +2328,15 @@  static int hls_read_header(AVFormatContext *s)
         for (i = 0; i < c->n_playlists; i++) {
             struct playlist *pls = c->playlists[i];
             int type;
+            int64_t start = 0;
+            for (int i = 0; i < c->cur_seq_no + 1; i++) {
+                start += pls->segments[i]->duration;
+            }
+            start = av_rescale_q(start,
+                                    AV_TIME_BASE_Q,
+                                    get_timebase(pls));
+            if (abr_init_duration == AV_NOPTS_VALUE || abr_init_duration > start)
+                abr_init_duration = start;
 
             c->switch_tasks[i].switch_timestamp = AV_NOPTS_VALUE;
             type = playlist_type_simple(pls);
@@ -2337,6 +2348,7 @@  static int hls_read_header(AVFormatContext *s)
                     c->switch_info[SWITCH_VIDEO].pls_index = pls->index;
             }
         }
+        av_dict_set_int(&c->abr_initial, "abr_init_duration", abr_init_duration, 0);
     }
     update_noheader_flag(s);
 
@@ -2768,6 +2780,8 @@  static int hls_probe(const AVProbeData *p)
 static const AVOption hls_options[] = {
     {"abr", "enable abr to switch streams",
         OFFSET(abr), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
+    {"abr_initial",  "metadata used by abr for ffplay",
+        OFFSET(abr_initial), AV_OPT_TYPE_DICT, { 0 }, 0, 0, FLAGS },
     {"live_start_index", "segment index to start live streams at (negative values are from the end)",
         OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS},
     {"allowed_extensions", "List of file extensions that hls is allowed to access",