[FFmpeg-devel,1/6] dashdec: Expose bandwidth and representation ID as metadata

Submitted by Stefan _ on Jan. 7, 2018, 6:46 p.m.

Details

Message ID DB3PR0202MB3452308F60CD01328E96A226EC120@DB3PR0202MB3452.eurprd02.prod.outlook.com
State New
Headers show

Commit Message

Stefan _ Jan. 7, 2018, 6:46 p.m.
Hi,

I did some work on the DASH demuxer.

The primary goal was making it viable to play YouTube/Vimeo/... videos 
using the native demuxer, since mpv currently uses a workaround in form 
of Edit Decision Lists (EDL).


Implemented features:

* Exposing id / bitrate as stream metadata (similar to the HLS demuxer)

* Support for multiple video and audio streams

* A few minor parts of the specification that are in use at YouTube

Patch hide | download patch | download mbox

>From ba640900c260f8b5b1919c4274b2c2e3e57e2546 Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Thu, 4 Jan 2018 23:45:26 +0100
Subject: [PATCH 1/6] dashdec: Expose bandwidth and representation ID as
 metadata

---
 libavformat/dashdec.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
index 0e3afd2a3..1a18ab021 100644
--- a/libavformat/dashdec.c
+++ b/libavformat/dashdec.c
@@ -84,6 +84,8 @@  struct representation {
     int stream_index;
 
     enum AVMediaType type;
+    char id[20];
+    int bandwidth;
 
     int n_fragments;
     struct fragment **fragments; /* VOD list of fragment for profile */
@@ -801,6 +803,8 @@  static int parse_manifest_representation(AVFormatContext *s, const char *url,
         if (rep) {
             if (rep->fragment_duration > 0 && !rep->fragment_timescale)
                 rep->fragment_timescale = 1;
+            rep->bandwidth = rep_bandwidth_val ? atoi(rep_bandwidth_val) : 0;
+            strncpy(rep->id, rep_id_val ? rep_id_val : "", sizeof(rep->id));
             if (type == AVMEDIA_TYPE_VIDEO) {
                 rep->rep_idx = video_rep_idx;
                 c->cur_video = rep;
@@ -1650,10 +1654,20 @@  static int dash_read_header(AVFormatContext *s)
         }
 
         if (c->cur_video) {
-            av_program_add_stream_index(s, 0, c->cur_video->stream_index);
+            int stream_index = c->cur_video->stream_index;
+            av_program_add_stream_index(s, 0, stream_index);
+            if (c->cur_video->bandwidth > 0)
+                av_dict_set_int(&s->streams[stream_index]->metadata, "variant_bitrate", c->cur_video->bandwidth, 0);
+            if (c->cur_video->id[0])
+                av_dict_set(&s->streams[stream_index]->metadata, "id", c->cur_video->id, 0);
         }
         if (c->cur_audio) {
-            av_program_add_stream_index(s, 0, c->cur_audio->stream_index);
+            int stream_index = c->cur_audio->stream_index;
+            av_program_add_stream_index(s, 0, stream_index);
+            if (c->cur_audio->bandwidth > 0)
+                av_dict_set_int(&s->streams[stream_index]->metadata, "variant_bitrate", c->cur_audio->bandwidth, 0);
+            if (c->cur_audio->id[0])
+                av_dict_set(&s->streams[stream_index]->metadata, "id", c->cur_audio->id, 0);
         }
     }
 
-- 
2.15.1