mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 14:55:47 +00:00
Bug 1404992 - Make VideoConduit scaling use a buffer pool. r=dminor
--HG-- extra : rebase_source : 52d5e5b6519a32119bca44ff685782ad244552d6 extra : source : b3f5796ab356f19763759d4eeb21df1b443de33f
This commit is contained in:
parent
c30f9f1367
commit
2e19da61da
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user