From: Steinar H. Gunderson Date: Tue, 25 Dec 2018 11:35:18 +0000 (+0100) Subject: Simplify timebase handling in Mux a bit. X-Git-Tag: 1.8.1~31 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=c3a19b6de23967fd0257bf5ca9e7475efbb3fded Simplify timebase handling in Mux a bit. --- diff --git a/shared/mux.cpp b/shared/mux.cpp index da8e2ee..48bfaa1 100644 --- a/shared/mux.cpp +++ b/shared/mux.cpp @@ -50,7 +50,7 @@ struct PacketBefore { Mux::Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const string &video_extradata, const AVCodecParameters *audio_codecpar, AVColorSpace color_space, int time_base, function write_callback, WriteStrategy write_strategy, const vector &metrics) : write_strategy(write_strategy), avctx(avctx), write_callback(write_callback), metrics(metrics) { - avstream_video = avformat_new_stream(avctx, nullptr); + AVStream *avstream_video = avformat_new_stream(avctx, nullptr); if (avstream_video == nullptr) { fprintf(stderr, "avformat_new_stream() failed\n"); exit(1); @@ -88,9 +88,10 @@ Mux::Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const avstream_video->codecpar->extradata_size = video_extradata.size(); memcpy(avstream_video->codecpar->extradata, video_extradata.data(), video_extradata.size()); } + streams.push_back(avstream_video); if (audio_codecpar != nullptr) { - avstream_audio = avformat_new_stream(avctx, nullptr); + AVStream *avstream_audio = avformat_new_stream(avctx, nullptr); if (avstream_audio == nullptr) { fprintf(stderr, "avformat_new_stream() failed\n"); exit(1); @@ -100,8 +101,7 @@ Mux::Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const fprintf(stderr, "avcodec_parameters_copy() failed\n"); exit(1); } - } else { - avstream_audio = nullptr; + streams.push_back(avstream_audio); } AVDictionary *options = NULL; @@ -157,17 +157,11 @@ void Mux::add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, AVRational t if (stream_index_override != -1) { pkt_copy.stream_index = stream_index_override; } - if (pkt_copy.stream_index == 0) { - pkt_copy.pts = av_rescale_q(pts, timebase, avstream_video->time_base); - pkt_copy.dts = av_rescale_q(dts, timebase, avstream_video->time_base); - pkt_copy.duration = av_rescale_q(pkt.duration, timebase, avstream_video->time_base); - } else if (pkt_copy.stream_index == 1) { - pkt_copy.pts = av_rescale_q(pts, timebase, avstream_audio->time_base); - pkt_copy.dts = av_rescale_q(dts, timebase, avstream_audio->time_base); - pkt_copy.duration = av_rescale_q(pkt.duration, timebase, avstream_audio->time_base); - } else { - assert(false); - } + assert(size_t(pkt_copy.stream_index) < streams.size()); + AVRational time_base = streams[pkt_copy.stream_index]->time_base; + pkt_copy.pts = av_rescale_q(pts, timebase, time_base); + pkt_copy.dts = av_rescale_q(dts, timebase, time_base); + pkt_copy.duration = av_rescale_q(pkt.duration, timebase, time_base); { lock_guard lock(mu); diff --git a/shared/mux.h b/shared/mux.h index c6b4c7e..d3d7798 100644 --- a/shared/mux.h +++ b/shared/mux.h @@ -112,7 +112,7 @@ private: std::vector packet_queue; std::condition_variable packet_queue_ready; - AVStream *avstream_video, *avstream_audio; + std::vector streams; std::function write_callback; std::vector metrics;