diff options
Diffstat (limited to 'libavformat/dashenc.c')
-rw-r--r-- | libavformat/dashenc.c | 62 |
1 files changed, 30 insertions, 32 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 931d32d145..8ddf0f36e6 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -109,19 +109,19 @@ static int dash_write(void *opaque, uint8_t *buf, int buf_size) } // RFC 6381 -static void set_codec_str(AVFormatContext *s, AVCodecContext *codec, +static void set_codec_str(AVFormatContext *s, AVCodecParameters *par, char *str, int size) { const AVCodecTag *tags[2] = { NULL, NULL }; uint32_t tag; - if (codec->codec_type == AVMEDIA_TYPE_VIDEO) + if (par->codec_type == AVMEDIA_TYPE_VIDEO) tags[0] = ff_codec_movvideo_tags; - else if (codec->codec_type == AVMEDIA_TYPE_AUDIO) + else if (par->codec_type == AVMEDIA_TYPE_AUDIO) tags[0] = ff_codec_movaudio_tags; else return; - tag = av_codec_get_tag(tags, codec->codec_id); + tag = av_codec_get_tag(tags, par->codec_id); if (!tag) return; if (size < 5) @@ -132,17 +132,17 @@ static void set_codec_str(AVFormatContext *s, AVCodecContext *codec, if (!strcmp(str, "mp4a") || !strcmp(str, "mp4v")) { uint32_t oti; tags[0] = ff_mp4_obj_type; - oti = av_codec_get_tag(tags, codec->codec_id); + oti = av_codec_get_tag(tags, par->codec_id); if (oti) av_strlcatf(str, size, ".%02x", oti); else return; if (tag == MKTAG('m', 'p', '4', 'a')) { - if (codec->extradata_size >= 2) { - int aot = codec->extradata[0] >> 3; + if (par->extradata_size >= 2) { + int aot = par->extradata[0] >> 3; if (aot == 31) - aot = ((AV_RB16(codec->extradata) >> 5) & 0x3f) + 32; + aot = ((AV_RB16(par->extradata) >> 5) & 0x3f) + 32; av_strlcatf(str, size, ".%d", aot); } } else if (tag == MKTAG('m', 'p', '4', 'v')) { @@ -151,8 +151,8 @@ static void set_codec_str(AVFormatContext *s, AVCodecContext *codec, } } else if (!strcmp(str, "avc1")) { uint8_t *tmpbuf = NULL; - uint8_t *extradata = codec->extradata; - int extradata_size = codec->extradata_size; + uint8_t *extradata = par->extradata; + int extradata_size = par->extradata_size; if (!extradata_size) return; if (extradata[0] != 1) { @@ -515,10 +515,10 @@ static int write_manifest(AVFormatContext *s, int final) AVStream *st = s->streams[i]; OutputStream *os = &c->streams[i]; - if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO) + if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO) continue; - avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"video/mp4\" codecs=\"%s\"%s width=\"%d\" height=\"%d\"", i, os->codec_str, os->bandwidth_str, 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\"", i, os->codec_str, os->bandwidth_str, st->codecpar->width, st->codecpar->height); if (st->avg_frame_rate.num) avio_printf(out, " frameRate=\"%d/%d\"", st->avg_frame_rate.num, st->avg_frame_rate.den); avio_printf(out, ">\n"); @@ -534,11 +534,11 @@ static int write_manifest(AVFormatContext *s, int final) AVStream *st = s->streams[i]; OutputStream *os = &c->streams[i]; - if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) + if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) continue; - 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); + 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->codecpar->sample_rate); + avio_printf(out, "\t\t\t\t<AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"%d\" />\n", st->codecpar->channels); output_segment_list(&c->streams[i], out, c); avio_printf(out, "\t\t\t</Representation>\n"); } @@ -598,9 +598,7 @@ static int dash_write_header(AVFormatContext *s) AVDictionary *opts = NULL; char filename[1024]; - os->bit_rate = s->streams[i]->codec->bit_rate ? - s->streams[i]->codec->bit_rate : - s->streams[i]->codec->rc_max_rate; + os->bit_rate = s->streams[i]->codecpar->bit_rate; if (os->bit_rate) { snprintf(os->bandwidth_str, sizeof(os->bandwidth_str), " bandwidth=\"%d\"", os->bit_rate); @@ -630,7 +628,7 @@ static int dash_write_header(AVFormatContext *s) ret = AVERROR(ENOMEM); goto fail; } - avcodec_copy_context(st->codec, s->streams[i]->codec); + avcodec_parameters_copy(st->codecpar, s->streams[i]->codecpar); st->sample_aspect_ratio = s->streams[i]->sample_aspect_ratio; st->time_base = s->streams[i]->time_base; ctx->avoid_negative_ts = s->avoid_negative_ts; @@ -670,7 +668,7 @@ static int dash_write_header(AVFormatContext *s) // already before being handed to this muxer, so we don't have mismatches // between the MPD and the actual segments. s->avoid_negative_ts = ctx->avoid_negative_ts; - if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { AVRational avg_frame_rate = s->streams[i]->avg_frame_rate; if (avg_frame_rate.num > 0) { if (av_cmp_q(avg_frame_rate, c->min_frame_rate) < 0) @@ -681,11 +679,11 @@ static int dash_write_header(AVFormatContext *s) c->ambiguous_frame_rate = 1; } c->has_video = 1; - } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { + } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { c->has_audio = 1; } - set_codec_str(s, st->codec, os->codec_str, sizeof(os->codec_str)); + set_codec_str(s, st->codecpar, os->codec_str, sizeof(os->codec_str)); os->first_pts = AV_NOPTS_VALUE; os->max_pts = AV_NOPTS_VALUE; os->last_dts = AV_NOPTS_VALUE; @@ -774,24 +772,24 @@ static void find_index_range(AVFormatContext *s, const char *full_path, } static int update_stream_extradata(AVFormatContext *s, OutputStream *os, - AVCodecContext *codec) + AVCodecParameters *par) { uint8_t *extradata; - if (os->ctx->streams[0]->codec->extradata_size || !codec->extradata_size) + if (os->ctx->streams[0]->codecpar->extradata_size || !par->extradata_size) return 0; - extradata = av_malloc(codec->extradata_size); + extradata = av_malloc(par->extradata_size); if (!extradata) return AVERROR(ENOMEM); - memcpy(extradata, codec->extradata, codec->extradata_size); + memcpy(extradata, par->extradata, par->extradata_size); - os->ctx->streams[0]->codec->extradata = extradata; - os->ctx->streams[0]->codec->extradata_size = codec->extradata_size; + os->ctx->streams[0]->codecpar->extradata = extradata; + os->ctx->streams[0]->codecpar->extradata_size = par->extradata_size; - set_codec_str(s, codec, os->codec_str, sizeof(os->codec_str)); + set_codec_str(s, par, os->codec_str, sizeof(os->codec_str)); return 0; } @@ -817,7 +815,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream) // Flush all audio streams as well, in sync with video keyframes, // but not the other video streams. if (stream >= 0 && i != stream) { - if (s->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO) + if (s->streams[i]->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) continue; // Make sure we don't flush audio streams multiple times, when // all video streams are flushed one at a time. @@ -896,7 +894,7 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) int64_t seg_end_duration = (os->segment_index) * (int64_t) c->min_seg_duration; int ret; - ret = update_stream_extradata(s, os, st->codec); + ret = update_stream_extradata(s, os, st->codecpar); if (ret < 0) return ret; @@ -921,7 +919,7 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) if (os->first_pts == AV_NOPTS_VALUE) os->first_pts = pkt->pts; - if ((!c->has_video || st->codec->codec_type == AVMEDIA_TYPE_VIDEO) && + if ((!c->has_video || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) && pkt->flags & AV_PKT_FLAG_KEY && os->packets_written && av_compare_ts(pkt->pts - os->first_pts, st->time_base, seg_end_duration, AV_TIME_BASE_Q) >= 0) { |