diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp index 7755d63435a4f546a87792c1f238501ff252dfb1..5f89b1ce90ab42ece25d7948574385678d3604a1 100644 --- a/src/media/media_recorder.cpp +++ b/src/media/media_recorder.cpp @@ -306,17 +306,19 @@ MediaRecorder::setupVideoOutput() const MediaStream& peer = streams_[true][true]; const MediaStream& local = streams_[true][false]; + // vp8 supports only yuv420p + videoFilter_.reset(new MediaFilter); switch (nbReceivedVideoStreams_) { - case 1: // use a stream with a valid size - if (peer.width > 0 && peer.height > 0) - encoderStream = peer; - else if (local.width > 0 && local.height > 0) - encoderStream = local; - else + case 1: + encoderStream = (peer.width > 0 && peer.height > 0 ? peer : local); + if (videoFilter_->initialize("format=pix_fmts=yuv420p", encoderStream) < 0) { + RING_ERR() << "Failed to initialize video filter"; encoderStream.format = -1; // invalidate stream + } else { + encoderStream = videoFilter_->getOutputParams(); + } break; case 2: // overlay local video over peer video - videoFilter_.reset(new MediaFilter); if (videoFilter_->initialize(buildVideoFilter(), std::vector<MediaStream>{peer, local}) < 0) { RING_ERR() << "Failed to initialize video filter"; @@ -327,9 +329,12 @@ MediaRecorder::setupVideoOutput() break; default: RING_ERR() << "Recording more than 2 video streams is not supported"; - encoderStream.format = -1; // invalidate stream + break; } + if (encoderStream.format < 0) + return encoderStream; + RING_DBG() << "Video recorder '" << (encoderStream.name.empty() ? "(null)" : encoderStream.name) << "' properties: " @@ -372,22 +377,20 @@ MediaRecorder::setupAudioOutput() MediaStream encoderStream; const MediaStream& peer = streams_[false][true]; const MediaStream& local = streams_[false][false]; - std::stringstream aFilter; + // resample to common audio format, so any player can play the file + audioFilter_.reset(new MediaFilter); switch (nbReceivedAudioStreams_) { - case 1: // use a stream with a valid sample rate and channel count - if (peer.sampleRate > 0 && peer.nbChannels > 0) - encoderStream = peer; - else if (local.sampleRate > 0 && local.nbChannels > 0) - encoderStream = local; - else + case 1: + encoderStream = (peer.sampleRate > 0 && peer.nbChannels > 0 ? peer : local); + if (audioFilter_->initialize("aresample=osr=48000:ocl=stereo:osf=s16", + encoderStream) < 0) { + RING_ERR() << "Failed to initialize audio filter"; encoderStream.format = -1; // invalidate stream + } break; case 2: // mix both audio streams - audioFilter_.reset(new MediaFilter); - // resample to common audio format, so any player can play the file - aFilter << "[a:1] [a:2] amix, aresample=osr=48000:ocl=stereo:osf=s16"; - if (audioFilter_->initialize(aFilter.str(), + if (audioFilter_->initialize("[a:1][a:2] amix,aresample=osr=48000:ocl=stereo:osf=s16", std::vector<MediaStream>{peer, local}) < 0) { RING_ERR() << "Failed to initialize audio filter"; encoderStream.format = -1; // invalidate stream @@ -401,6 +404,9 @@ MediaRecorder::setupAudioOutput() break; } + if (encoderStream.format < 0) + return encoderStream; + RING_DBG() << "Audio recorder '" << (encoderStream.name.empty() ? "(null)" : encoderStream.name) << "' properties: " @@ -473,7 +479,7 @@ MediaRecorder::process() } // get filter input name if frame needs filtering - std::string inputName; + std::string inputName = "default"; if (recframe.isVideo && nbReceivedVideoStreams_ == 2) inputName = (recframe.fromPeer ? "v:main" : "v:overlay"); if (!recframe.isVideo && nbReceivedAudioStreams_ == 2) @@ -482,10 +488,6 @@ MediaRecorder::process() emptyFilterGraph(); if (filter) { filter->feedInput(input, inputName); - } else if (inputName.empty()) { // #nofilters - if (sendToEncoder(input, streamIdx) < 0) { - RING_ERR() << "Failed to encode frame"; - } } av_frame_free(&input);