mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-30 11:24:17 +00:00
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>
This commit is contained in:
parent
8e6b9ef473
commit
6ba1c9bf7e
@ -3815,7 +3815,7 @@ static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t
|
|||||||
return (int64_t)bandwidth;
|
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;
|
MatroskaDemuxContext *matroska = s->priv_data;
|
||||||
EbmlList *seekhead_list = &matroska->seekhead;
|
EbmlList *seekhead_list = &matroska->seekhead;
|
||||||
@ -3855,6 +3855,11 @@ static int webm_dash_manifest_cues(AVFormatContext *s)
|
|||||||
// cues end
|
// cues end
|
||||||
av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
|
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
|
||||||
bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
|
bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
|
||||||
if (bandwidth < 0) return -1;
|
if (bandwidth < 0) return -1;
|
||||||
@ -3891,6 +3896,7 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
int ret = matroska_read_header(s);
|
int ret = matroska_read_header(s);
|
||||||
|
int64_t init_range;
|
||||||
MatroskaTrack *tracks;
|
MatroskaTrack *tracks;
|
||||||
MatroskaDemuxContext *matroska = s->priv_data;
|
MatroskaDemuxContext *matroska = s->priv_data;
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -3911,7 +3917,8 @@ static int webm_dash_manifest_read_header(AVFormatContext *s)
|
|||||||
|
|
||||||
// initialization range
|
// initialization range
|
||||||
// 5 is the offset of Cluster ID.
|
// 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
|
// 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
|
// parse the cues and populate Cue related fields
|
||||||
if (!matroska->is_live) {
|
if (!matroska->is_live) {
|
||||||
ret = webm_dash_manifest_cues(s);
|
ret = webm_dash_manifest_cues(s, init_range);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
|
av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user