fix: revive offscreen rendering support (#22160)
This commit is contained in:
parent
e28f7aadc7
commit
36f982aee2
10 changed files with 722 additions and 206 deletions
|
@ -54,7 +54,8 @@ void OffScreenVideoConsumer::OnFrameCaptured(
|
|||
base::ReadOnlySharedMemoryRegion data,
|
||||
::media::mojom::VideoFrameInfoPtr info,
|
||||
const gfx::Rect& content_rect,
|
||||
viz::mojom::FrameSinkVideoConsumerFrameCallbacksPtr callbacks) {
|
||||
mojo::PendingRemote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
|
||||
callbacks) {
|
||||
if (!CheckContentRect(content_rect)) {
|
||||
gfx::Size view_size = view_->SizeInPixels();
|
||||
video_capturer_->SetResolutionConstraints(view_size, view_size, true);
|
||||
|
@ -62,18 +63,23 @@ void OffScreenVideoConsumer::OnFrameCaptured(
|
|||
return;
|
||||
}
|
||||
|
||||
mojo::Remote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
|
||||
callbacks_remote(std::move(callbacks));
|
||||
|
||||
if (!data.IsValid()) {
|
||||
callbacks->Done();
|
||||
callbacks_remote->Done();
|
||||
return;
|
||||
}
|
||||
base::ReadOnlySharedMemoryMapping mapping = data.Map();
|
||||
if (!mapping.IsValid()) {
|
||||
DLOG(ERROR) << "Shared memory mapping failed.";
|
||||
callbacks_remote->Done();
|
||||
return;
|
||||
}
|
||||
if (mapping.size() <
|
||||
media::VideoFrame::AllocationSize(info->pixel_format, info->coded_size)) {
|
||||
DLOG(ERROR) << "Shared memory size was less than expected.";
|
||||
callbacks_remote->Done();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -89,7 +95,8 @@ void OffScreenVideoConsumer::OnFrameCaptured(
|
|||
base::ReadOnlySharedMemoryMapping mapping;
|
||||
// Prevents FrameSinkVideoCapturer from recycling the shared memory that
|
||||
// backs |frame_|.
|
||||
viz::mojom::FrameSinkVideoConsumerFrameCallbacksPtr releaser;
|
||||
mojo::PendingRemote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
|
||||
releaser;
|
||||
};
|
||||
|
||||
SkBitmap bitmap;
|
||||
|
@ -102,7 +109,7 @@ void OffScreenVideoConsumer::OnFrameCaptured(
|
|||
[](void* addr, void* context) {
|
||||
delete static_cast<FramePinner*>(context);
|
||||
},
|
||||
new FramePinner{std::move(mapping), std::move(callbacks)});
|
||||
new FramePinner{std::move(mapping), callbacks_remote.Unbind()});
|
||||
bitmap.setImmutable();
|
||||
|
||||
media::VideoFrameMetadata metadata;
|
||||
|
@ -110,7 +117,7 @@ void OffScreenVideoConsumer::OnFrameCaptured(
|
|||
gfx::Rect damage_rect;
|
||||
|
||||
auto UPDATE_RECT = media::VideoFrameMetadata::CAPTURE_UPDATE_RECT;
|
||||
if (!metadata.GetRect(UPDATE_RECT, &damage_rect)) {
|
||||
if (!metadata.GetRect(UPDATE_RECT, &damage_rect) || damage_rect.IsEmpty()) {
|
||||
damage_rect = content_rect;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue