]> git.sesse.net Git - nageru/commitdiff
Fix non-transcoded audio in Kaeru in streams where the audio does not have index 1.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 22 May 2018 21:36:31 +0000 (23:36 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 22 May 2018 21:36:43 +0000 (23:36 +0200)
kaeru.cpp
mux.cpp
mux.h

index 011818d35832741321e4ce2b0970fa712a0e62af..11fea00c91842cb3be956b225c414cc71491dacb 100644 (file)
--- a/kaeru.cpp
+++ b/kaeru.cpp
@@ -129,7 +129,7 @@ void video_frame_callback(FFmpegCapture *video, X264Encoder *x264_encoder, Audio
 
 void audio_frame_callback(Mux *mux, const AVPacket *pkt, AVRational timebase)
 {
-       mux->add_packet(*pkt, pkt->pts, pkt->dts == AV_NOPTS_VALUE ? pkt->pts : pkt->dts, timebase);
+       mux->add_packet(*pkt, pkt->pts, pkt->dts == AV_NOPTS_VALUE ? pkt->pts : pkt->dts, timebase, /*stream_index=*/1);
 }
 
 void adjust_bitrate(int signal)
diff --git a/mux.cpp b/mux.cpp
index 5e9043e78906989031e3c8bb30d0077ace184b54..b1b9db683081528e8aa15c640288e0d8a2d5b9e6 100644 (file)
--- a/mux.cpp
+++ b/mux.cpp
@@ -145,7 +145,7 @@ Mux::~Mux()
        avformat_free_context(avctx);
 }
 
-void Mux::add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, AVRational timebase)
+void Mux::add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, AVRational timebase, int stream_index_override)
 {
        AVPacket pkt_copy;
        av_init_packet(&pkt_copy);
@@ -153,11 +153,14 @@ void Mux::add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, AVRational t
                fprintf(stderr, "av_copy_packet() failed\n");
                exit(1);
        }
-       if (pkt.stream_index == 0) {
+       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.stream_index == 1) {
+       } 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);
diff --git a/mux.h b/mux.h
index e6193e0a36c92ec0258f3680df597a37f15ce26f..9614bffbb5ae6603d1ef0d50353ef61b27715679 100644 (file)
--- a/mux.h
+++ b/mux.h
@@ -62,7 +62,7 @@ public:
        // will be added to.
        Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const std::string &video_extradata, const AVCodecParameters *audio_codecpar, int time_base, std::function<void(int64_t)> write_callback, WriteStrategy write_strategy, const std::vector<MuxMetrics *> &metrics);
        ~Mux();
-       void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, AVRational timebase = { 1, TIMEBASE });
+       void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, AVRational timebase = { 1, TIMEBASE }, int stream_index_override = -1);
 
        // As long as the mux is plugged, it will not actually write anything to disk,
        // just queue the packets. Once it is unplugged, the packets are reordered by pts