aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2014-11-19 13:49:31 +0200
committerMartin Storsjö <martin@martin.st>2014-11-22 22:16:37 +0200
commitf856d9c2f314c493c672dfb9c876da182525da3d (patch)
treecd56833afcca8b8a80b8134d456d693e579948a5
parenteec7f032a903e06d249d1e8aa6630b65292bf40f (diff)
downloadffmpeg-f856d9c2f314c493c672dfb9c876da182525da3d.tar.gz
dashenc: Don't require the stream bitrate to be known
Don't write any bitrate attribute if it isn't known. As long as one doesn't want automatic bitrate switching, playback can work just fine even if it isn't set. If strict standard compliance is requested, this is still considered an error, since the attribute is mandatory according to the spec. Based on a patch by Rodger Combs. Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavformat/dashenc.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index cacaf922b8..41caf6dcff 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -59,6 +59,7 @@ typedef struct OutputStream {
int nb_segments, segments_size, segment_index;
Segment **segments;
int64_t first_dts, start_dts, end_dts;
+ char bandwidth_str[64];
char codec_str[100];
} OutputStream;
@@ -368,7 +369,7 @@ static int write_manifest(AVFormatContext *s, int final)
OutputStream *os = &c->streams[i];
if (s->streams[i]->codec->codec_type != AVMEDIA_TYPE_VIDEO)
continue;
- avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"video/mp4\" codecs=\"%s\" bandwidth=\"%d\" width=\"%d\" height=\"%d\">\n", i, os->codec_str, st->codec->bit_rate, st->codec->width, st->codec->height);
+ avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"video/mp4\" codecs=\"%s\"%s width=\"%d\" height=\"%d\">\n", i, os->codec_str, os->bandwidth_str, st->codec->width, st->codec->height);
output_segment_list(&c->streams[i], out, c);
avio_printf(out, "\t\t\t</Representation>\n");
}
@@ -381,7 +382,7 @@ static int write_manifest(AVFormatContext *s, int final)
OutputStream *os = &c->streams[i];
if (s->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
continue;
- avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"audio/mp4\" codecs=\"%s\" bandwidth=\"%d\" audioSamplingRate=\"%d\">\n", i, os->codec_str, st->codec->bit_rate, st->codec->sample_rate);
+ avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"audio/mp4\" codecs=\"%s\"%s audioSamplingRate=\"%d\">\n", i, os->codec_str, os->bandwidth_str, st->codec->sample_rate);
avio_printf(out, "\t\t\t\t<AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"%d\" />\n", st->codec->channels);
output_segment_list(&c->streams[i], out, c);
avio_printf(out, "\t\t\t</Representation>\n");
@@ -439,10 +440,17 @@ static int dash_write_header(AVFormatContext *s)
AVDictionary *opts = NULL;
char filename[1024];
- if (!s->streams[i]->codec->bit_rate) {
- av_log(s, AV_LOG_ERROR, "No bit rate set for stream %d\n", i);
- ret = AVERROR(EINVAL);
- goto fail;
+ if (s->streams[i]->codec->bit_rate) {
+ snprintf(os->bandwidth_str, sizeof(os->bandwidth_str),
+ " bandwidth=\"%d\"", s->streams[i]->codec->bit_rate);
+ } else {
+ int level = s->strict_std_compliance >= FF_COMPLIANCE_STRICT ?
+ AV_LOG_ERROR : AV_LOG_WARNING;
+ av_log(s, level, "No bit rate set for stream %d\n", i);
+ if (s->strict_std_compliance >= FF_COMPLIANCE_STRICT) {
+ ret = AVERROR(EINVAL);
+ goto fail;
+ }
}
ctx = avformat_alloc_context();