diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2017-04-21 16:40:35 +0100 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2017-04-23 17:52:58 +0100 |
commit | 6ba1c9bf7e8a92cf1977ca11ce595a5872d0ce40 (patch) | |
tree | e93e472537664693148af55f395de60a6a3dff46 | |
parent | 8e6b9ef4733be91b32c8b7becd95124340b92334 (diff) | |
download | ffmpeg-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.c | 13 |
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; |