Commit 11de3b27 authored by Alex Ilin's avatar Alex Ilin Committed by Commit Bot

remoting::WebrtcVideoEncoderGpu shared memory refactor

This CL changes usages of deprecated base::SharedMemory to
base::UnsafeSharedMemoryRegion. No functional changes.

Bug: 795291
Change-Id: I6d58ab32cb054760abaf5554e96d634569b69ccd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1919339Reviewed-by: default avatarGary Kacmarcik <garykac@chromium.org>
Commit-Queue: Alex Ilin <alexilin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715788}
parent 8126abe3
...@@ -157,10 +157,13 @@ void WebrtcVideoEncoderGpu::RequireBitstreamBuffers( ...@@ -157,10 +157,13 @@ void WebrtcVideoEncoderGpu::RequireBitstreamBuffers(
output_buffers_.clear(); output_buffers_.clear();
for (unsigned int i = 0; i < kWebrtcVideoEncoderGpuOutputBufferCount; ++i) { for (unsigned int i = 0; i < kWebrtcVideoEncoderGpuOutputBufferCount; ++i) {
auto shm = std::make_unique<base::SharedMemory>(); auto output_buffer = std::make_unique<OutputBuffer>();
output_buffer->region =
base::UnsafeSharedMemoryRegion::Create(output_buffer_size_);
output_buffer->mapping = output_buffer->region.Map();
// TODO(gusss): Do we need to handle mapping failure more gracefully? // TODO(gusss): Do we need to handle mapping failure more gracefully?
CHECK(shm->CreateAndMapAnonymous(output_buffer_size_)); CHECK(output_buffer->IsValid());
output_buffers_.push_back(std::move(shm)); output_buffers_.push_back(std::move(output_buffer));
} }
for (size_t i = 0; i < output_buffers_.size(); ++i) { for (size_t i = 0; i < output_buffers_.size(); ++i) {
...@@ -182,11 +185,11 @@ void WebrtcVideoEncoderGpu::BitstreamBufferReady( ...@@ -182,11 +185,11 @@ void WebrtcVideoEncoderGpu::BitstreamBufferReady(
std::unique_ptr<EncodedFrame> encoded_frame = std::unique_ptr<EncodedFrame> encoded_frame =
std::make_unique<EncodedFrame>(); std::make_unique<EncodedFrame>();
base::SharedMemory* output_buffer = OutputBuffer* output_buffer = output_buffers_[bitstream_buffer_id].get();
output_buffers_[bitstream_buffer_id].get(); DCHECK(output_buffer->IsValid());
DCHECK(output_buffer->memory()); base::span<char> data_span =
encoded_frame->data.assign(reinterpret_cast<char*>(output_buffer->memory()), output_buffer->mapping.GetMemoryAsSpan<char>(metadata.payload_size_bytes);
metadata.payload_size_bytes); encoded_frame->data.assign(data_span.begin(), data_span.end());
encoded_frame->key_frame = metadata.key_frame; encoded_frame->key_frame = metadata.key_frame;
encoded_frame->size = webrtc::DesktopSize(input_coded_size_.width(), encoded_frame->size = webrtc::DesktopSize(input_coded_size_.width(),
input_coded_size_.height()); input_coded_size_.height());
...@@ -208,6 +211,10 @@ void WebrtcVideoEncoderGpu::NotifyError( ...@@ -208,6 +211,10 @@ void WebrtcVideoEncoderGpu::NotifyError(
LOG(ERROR) << __func__ << " error: " << error; LOG(ERROR) << __func__ << " error: " << error;
} }
bool WebrtcVideoEncoderGpu::OutputBuffer::IsValid() {
return region.IsValid() && mapping.IsValid();
}
void WebrtcVideoEncoderGpu::BeginInitialization() { void WebrtcVideoEncoderGpu::BeginInitialization() {
DVLOG(3) << __func__; DVLOG(3) << __func__;
...@@ -238,8 +245,9 @@ void WebrtcVideoEncoderGpu::UseOutputBitstreamBufferId( ...@@ -238,8 +245,9 @@ void WebrtcVideoEncoderGpu::UseOutputBitstreamBufferId(
int32_t bitstream_buffer_id) { int32_t bitstream_buffer_id) {
DVLOG(3) << __func__ << " id=" << bitstream_buffer_id; DVLOG(3) << __func__ << " id=" << bitstream_buffer_id;
video_encode_accelerator_->UseOutputBitstreamBuffer(media::BitstreamBuffer( video_encode_accelerator_->UseOutputBitstreamBuffer(media::BitstreamBuffer(
bitstream_buffer_id, output_buffers_[bitstream_buffer_id]->handle(), bitstream_buffer_id,
false /* read_only */, output_buffer_size_)); output_buffers_[bitstream_buffer_id]->region.Duplicate(),
output_buffers_[bitstream_buffer_id]->region.GetSize()));
} }
void WebrtcVideoEncoderGpu::RunAnyPendingEncode() { void WebrtcVideoEncoderGpu::RunAnyPendingEncode() {
......
...@@ -5,15 +5,13 @@ ...@@ -5,15 +5,13 @@
#ifndef REMOTING_CODEC_WEBRTC_VIDEO_ENCODER_GPU_H_ #ifndef REMOTING_CODEC_WEBRTC_VIDEO_ENCODER_GPU_H_
#define REMOTING_CODEC_WEBRTC_VIDEO_ENCODER_GPU_H_ #define REMOTING_CODEC_WEBRTC_VIDEO_ENCODER_GPU_H_
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "media/video/video_encode_accelerator.h" #include "media/video/video_encode_accelerator.h"
#include "remoting/codec/encoder_bitrate_filter.h" #include "remoting/codec/encoder_bitrate_filter.h"
#include "remoting/codec/webrtc_video_encoder.h" #include "remoting/codec/webrtc_video_encoder.h"
#include "remoting/codec/webrtc_video_encoder_selector.h" #include "remoting/codec/webrtc_video_encoder_selector.h"
namespace base {
class SharedMemory;
}
namespace remoting { namespace remoting {
// A WebrtcVideoEncoder implementation utilizing the VideoEncodeAccelerator // A WebrtcVideoEncoder implementation utilizing the VideoEncodeAccelerator
...@@ -59,6 +57,13 @@ class WebrtcVideoEncoderGpu : public WebrtcVideoEncoder, ...@@ -59,6 +57,13 @@ class WebrtcVideoEncoderGpu : public WebrtcVideoEncoder,
private: private:
enum State { UNINITIALIZED, INITIALIZING, INITIALIZED, INITIALIZATION_ERROR }; enum State { UNINITIALIZED, INITIALIZING, INITIALIZED, INITIALIZATION_ERROR };
struct OutputBuffer {
base::UnsafeSharedMemoryRegion region;
base::WritableSharedMemoryMapping mapping;
bool IsValid();
};
explicit WebrtcVideoEncoderGpu(media::VideoCodecProfile codec_profile); explicit WebrtcVideoEncoderGpu(media::VideoCodecProfile codec_profile);
void BeginInitialization(); void BeginInitialization();
...@@ -81,7 +86,7 @@ class WebrtcVideoEncoderGpu : public WebrtcVideoEncoder, ...@@ -81,7 +86,7 @@ class WebrtcVideoEncoderGpu : public WebrtcVideoEncoder,
media::VideoCodecProfile codec_profile_; media::VideoCodecProfile codec_profile_;
// Shared memory with which the VEA transfers output to WebrtcVideoEncoderGpu // Shared memory with which the VEA transfers output to WebrtcVideoEncoderGpu
std::vector<std::unique_ptr<base::SharedMemory>> output_buffers_; std::vector<std::unique_ptr<OutputBuffer>> output_buffers_;
// TODO(gusss): required_input_frame_count_ is currently unused; evaluate // TODO(gusss): required_input_frame_count_ is currently unused; evaluate
// whether or not it's actually needed. This variable represents the number of // whether or not it's actually needed. This variable represents the number of
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment