mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-30 09:56:41 +08:00
[fix] render CPU NV12 native frames rejected by the native renderer
This commit is contained in:
@@ -50,9 +50,28 @@ void PeerEventHandler::OnReceiveVideoBuffer(
|
|||||||
if (native_renderer && native_renderer->IsActive()) {
|
if (native_renderer && native_renderer->IsActive()) {
|
||||||
VideoRenderer::SubmitResult submit_result =
|
VideoRenderer::SubmitResult submit_result =
|
||||||
VideoRenderer::SubmitResult::failed;
|
VideoRenderer::SubmitResult::failed;
|
||||||
if (GetNativeVideoFrame(video_frame)) {
|
if (const auto* native = GetNativeVideoFrame(video_frame)) {
|
||||||
submit_result = native_renderer->SubmitNativeFrame(
|
submit_result = native_renderer->SubmitNativeFrame(remote_id, *native);
|
||||||
remote_id, *video_frame->native_frame);
|
// A CPU NV12 native frame is valid MiniRTC input, but the macOS Metal
|
||||||
|
// fast path only accepts CVPixelBuffer. Materialize it when that path
|
||||||
|
// rejects a software decoder's descriptor. This also supports peers
|
||||||
|
// using CPU decoding when their platform hardware decoder is unavailable.
|
||||||
|
if (submit_result == VideoRenderer::SubmitResult::failed &&
|
||||||
|
native->type == MiniRtcNativeVideoFrameCpuNv12) {
|
||||||
|
const size_t frame_size =
|
||||||
|
static_cast<size_t>(native->width) * native->height * 3U / 2U;
|
||||||
|
// One decode callback thread per session; keep the buffer across
|
||||||
|
// frames instead of a full-frame allocation per rejected frame.
|
||||||
|
auto& fallback = props->native_cpu_fallback_;
|
||||||
|
if (fallback.size() != frame_size) fallback.resize(frame_size);
|
||||||
|
if (native->copy_to_nv12(native->owner, fallback.data(),
|
||||||
|
fallback.size()) == 0) {
|
||||||
|
submit_result = native_renderer->SubmitNv12(
|
||||||
|
remote_id, fallback.data(), fallback.size(),
|
||||||
|
static_cast<int>(native->width),
|
||||||
|
static_cast<int>(native->height));
|
||||||
|
}
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
submit_result = native_renderer->SubmitNv12(
|
submit_result = native_renderer->SubmitNv12(
|
||||||
|
|||||||
@@ -94,6 +94,9 @@ struct RemoteSession {
|
|||||||
bool p2p_mode_ = true;
|
bool p2p_mode_ = true;
|
||||||
bool remember_password_ = false;
|
bool remember_password_ = false;
|
||||||
char remote_password_[7] = "";
|
char remote_password_[7] = "";
|
||||||
|
// Reused across frames by the decode callback thread when a CPU NV12
|
||||||
|
// native frame has to be materialized for a renderer that rejects it.
|
||||||
|
std::vector<unsigned char> native_cpu_fallback_;
|
||||||
|
|
||||||
// Written by the decode callback thread and consumed by the UI thread.
|
// Written by the decode callback thread and consumed by the UI thread.
|
||||||
std::mutex video_frame_mutex_;
|
std::mutex video_frame_mutex_;
|
||||||
|
|||||||
Reference in New Issue
Block a user