宽藤会话更新无休止循环
Widevine Session Update endless Loop
我正在使用chrome的libwidevinecdm.so
来处理受DRM保护的数据。我目前正在成功设置从许可证服务器获得的宽藤服务器证书。我还可以使用我尝试解码的媒体的 pssh 框创建一个会话。到目前为止,一切都很成功(所有承诺都解决得很好(。
(会话是这样创建的:_cdm->CreateSessionAndGenerateRequest(promise_id, cdm::SessionType::kTemporary, cdm::InitDataType::kCenc, pssh_box.data(), static_cast<uint32_t>(pssh_box.size()));
(
然后,我收到kLicenseRequest
类型的会话消息,我将其转发到相应的许可证服务器。许可证服务器以有效的响应和与我在使用 Chrome 时在浏览器中看到的相同数量的数据进行响应。然后我像这样将其传递给我的会话:
_cdm->UpdateSession(promise_id, session_id.data(), static_cast<uint32_t>(session_id.size()),
license_response.data(), static_cast<uint32_t>(license_response.size()));
现在的问题是,这个承诺永远不会解决。它一遍又一遍地将kLicenseRequest
消息发布到我的会话中,而从未返回过。这是否意味着我的回答是错误的?还是别的什么?
溴 亚尼克
这个问题是由以下事实引起的:CreateSessionAndGenerateRequest
中的所有内容都是同步完成的 - 这意味着当CreateSessionAndGenerateRequest
返回时,您的承诺将始终得到解决。
CDM 将在CreateSessionAndGenerateRequest
内部发出kLicenseRequest
,它不会以"即发即弃"的方式这样做,但该函数会在那里等待,直到您从cdm::Host_10::OnSessionMessage
返回。由于我的OnSessionMessage
实现是在调用UpdateSession
之前(也是同步的(向许可证服务器创建同步HTTP请求,因此整个链最终被阻塞。
所以最终我在CreateSessionAndGenerateRequest
内部调用UpdateSession
,我认为 CDM 无法处理这个问题,并通过使用给定 ID 创建一个新会话并再次生成请求来做出反应,这当然触发了另一个UpdateSession
等等。
最终,打破循环的最简单方法是制作异步的东西。我决定在收到kLicenseRequest
时启动一个单独的线程,等待几毫秒以确保CreateSessionAndGenerateRequest
有时间完成(不确定是否真的需要(,然后向许可证服务器发出请求。
我唯一需要做的更改是添加周围的std::thread
:
void WidevineSession::forward_license_request(const std::vector<uint8_t> &data) {
std::thread{
[=]() {
std::this_thread::sleep_for(std::chrono::milliseconds{100});
net::HttpRequest request{"POST", _license_server_url};
request.add_header("Authorization", fmt::format("Bearer {}", _access_token))
.byte_body(data);
const auto response = _client.execute(request);
if (response.status_code() != 200) {
log->error("Widevine license request not accepted by license server: {} {} ({})", response.status_code(), response.status_text(), utils::bytes_to_utf8(response.body()));
throw std::runtime_error{"Error requesting widevine license"};
}
log->info("Successfully requested widevine license from license server");
_adapter->update_session(this, _session_id, response.body());
}
}.detach();
}
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 关于 SIGTSTP 错误和无休止的输入
- 宽藤会话更新无休止循环
- 无字母循环
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 在图像上覆盖文本的程序会产生无休止的字符串错误
- OpenSSL客户端陷入无休止的读取
- 无休止的 do while 循环C++代码
- 循环无休止地做
- 卡死胡同-无休止的循环,没有解决方案
- C++:如果输入不是整数,为什么这段代码会运行一个无休止的循环
- C++无休止的循环瓶颈
- 这无休止地循环是否有明显的原因
- 静态分析工具,用于检测由于类型提升而导致的无休止循环
- c++:在修改c字符串数组时帮助纠正无休止循环
- std::advanced()导致无休止的循环
- 为什么我的函数无休止地循环
- 在无休止地循环cout时执行,忽略cin
- boost::asio系统的无休止循环:第一次连接后出现9个错误
- 我如何阻止它无休止地循环