aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2017-04-21 16:40:35 +0100
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>2017-04-23 17:52:58 +0100
commit6ba1c9bf7e8a92cf1977ca11ce595a5872d0ce40 (patch)
treee93e472537664693148af55f395de60a6a3dff46
parent8e6b9ef4733be91b32c8b7becd95124340b92334 (diff)
downloadffmpeg-6ba1c9bf7e8a92cf1977ca11ce595a5872d0ce40.tar.gz
webm_dash_manifest_demuxer: Fix initialization range for files with cues at the front
The WebM DASH spec states: The Initialization Segment shall not contain Clusters or Cues. The Segment Index corresponds to the Cues. Previously, it included the cues if they were at the front. Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
-rw-r--r--libavformat/matroskadec.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 320d8bfeac..47873cccd8 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -3815,7 +3815,7 @@ static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t
return (int64_t)bandwidth;
}
-static int webm_dash_manifest_cues(AVFormatContext *s)
+static int webm_dash_manifest_cues(AVFormatContext *s, int64_t init_range)
{
MatroskaDemuxContext *matroska = s->priv_data;
EbmlList *seekhead_list = &matroska->seekhead;
@@ -3855,6 +3855,11 @@ static int webm_dash_manifest_cues(AVFormatContext *s)
// cues end
av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
+ // if the file has cues at the start, fix up the init range so tht
+ // it does not include it
+ if (cues_start <= init_range)
+ av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, cues_start - 1, 0);
+
// bandwidth
bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
if (bandwidth < 0) return -1;
@@ -3891,6 +3896,7 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
{
char *buf;
int ret = matroska_read_header(s);
+ int64_t init_range;
MatroskaTrack *tracks;
MatroskaDemuxContext *matroska = s->priv_data;
if (ret) {
@@ -3911,7 +3917,8 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
// initialization range
// 5 is the offset of Cluster ID.
- av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, avio_tell(s->pb) - 5, 0);
+ init_range = avio_tell(s->pb) - 5;
+ av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, init_range, 0);
}
// basename of the file
@@ -3924,7 +3931,7 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
// parse the cues and populate Cue related fields
if (!matroska->is_live) {
- ret = webm_dash_manifest_cues(s);
+ ret = webm_dash_manifest_cues(s, init_range);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
return ret;