Bug 1404992 - Make VideoConduit scaling use a buffer pool. r=dminor

--HG--
extra : rebase_source : 52d5e5b6519a32119bca44ff685782ad244552d6
extra : source : b3f5796ab356f19763759d4eeb21df1b443de33f
This commit is contained in:
Andreas Pehrson 2018-09-11 14:51:29 +02:00
parent c30f9f1367
commit 2e19da61da
2 changed files with 19 additions and 3 deletions

View File

@ -27,7 +27,6 @@
#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
#include "webrtc/common_video/include/video_frame_buffer.h"
#include "webrtc/api/video/i420_buffer.h"
#ifdef WEBRTC_MAC
#include <AvailabilityMacros.h>
@ -77,6 +76,14 @@ static const int kNullPayloadType = -1;
static const char* kUlpFecPayloadName = "ulpfec";
static const char* kRedPayloadName = "red";
// The number of frame buffers WebrtcVideoConduit may create before returning
// errors.
// Sometimes these are released synchronously but they can be forwarded all the
// way to the encoder for asynchronous encoding. With a pool size of 5,
// we allow 1 buffer for the current conversion, and 4 buffers to be queued at
// the encoder.
#define SCALER_BUFFER_POOL_SIZE 5
// Convert (SI) kilobits/sec to (SI) bits/sec
#define KBPS(kbps) kbps * 1000
@ -234,6 +241,7 @@ WebrtcVideoConduit::WebrtcVideoConduit(RefPtr<WebRtcCallWrapper> aCall,
UniquePtr<cricket::VideoAdapter>&& aVideoAdapter)
: mTransportMonitor("WebrtcVideoConduit")
, mVideoAdapter(std::move(aVideoAdapter))
, mBufferPool(false, SCALER_BUFFER_POOL_SIZE)
, mEngineTransmitting(false)
, mEngineReceiving(false)
, mCodecMutex("VideoConduit codec db")
@ -1844,9 +1852,12 @@ WebrtcVideoConduit::SendVideoFrame(const webrtc::VideoFrame& frame)
buffer = frame.video_frame_buffer();
} else {
// Adapted I420 frame.
// TODO(magjed): Optimize this I420 path.
rtc::scoped_refptr<webrtc::I420Buffer> i420Buffer =
webrtc::I420Buffer::Create(adaptedWidth, adaptedHeight);
mBufferPool.CreateBuffer(adaptedWidth, adaptedHeight);
if (!i420Buffer) {
CSFLogWarn(LOGTAG, "Creating a buffer for scaling failed, pool is empty");
return kMediaConduitNoError;
}
i420Buffer->CropAndScaleFrom(*frame.video_frame_buffer(), cropX, cropY, cropWidth, cropHeight);
buffer = i420Buffer;
}

View File

@ -27,6 +27,7 @@
#endif
#include "webrtc/video_decoder.h"
#include "webrtc/video_encoder.h"
#include "webrtc/common_video/include/i420_buffer_pool.h"
#include "webrtc/config.h"
#include "webrtc/media/base/videosinkinterface.h"
#include "webrtc/media/base/videoadapter.h"
@ -467,6 +468,10 @@ private:
UniquePtr<cricket::VideoAdapter> mVideoAdapter;
rtc::VideoBroadcaster mVideoBroadcaster;
// Buffer pool used for scaling frames.
// Accessed on the frame-feeding thread only.
webrtc::I420BufferPool mBufferPool;
// Engine state we are concerned with.
mozilla::Atomic<bool> mEngineTransmitting; // If true ==> Transmit Subsystem is up and running
mozilla::Atomic<bool> mEngineReceiving; // if true ==> Receive Subsystem up and running