Skip to content

Commit 13fe8b2

Browse files
cloudwebrtchiroshihoriedavidliu
authored
fix h264 freeze. (#93)
* Improve e2ee, add setSharedKey to KeyProvider. * update. * reset has_valid_key after RatchetKey. * update. * clone key_handler from share_key for each participant. * add RatchetSharedKey and ExportSharedKey. * make KeyProvider::SetSharedKey only valid when KeyProviderOptions::shared_key == true. * remove unused enum. * Fix memory leak when creating audio CMSampleBuffer #86 * add scalabilityMode for AV1. * fix bug for scalability-mode. * add scalability-mode support for VP9. * add failure tolerance for framecryptor. * add failureTolerance for android/objc. * fix: make H264's unencrypted_bytes consistent with js-sdk. * wip: ScalabilityModes for android. * update. * wip. * wip. * wip. * wip. * Fix camera rotation (#92) Use UIInterfaceOrientation instead of UIDeviceOrientation for RTCVideoFrame's rotation * done. * fix * update. * Expose audio sample buffers for Android (#89) * Initial draft * Working impl * doc and cleanup * doc update * add SetSifTrailer. * fix h264 freeze. --------- Co-authored-by: Hiroshi Horie <[email protected]> Co-authored-by: davidliu <[email protected]>
1 parent 7159977 commit 13fe8b2

File tree

1 file changed

+72
-21
lines changed

1 file changed

+72
-21
lines changed

api/crypto/frame_crypto_transformer.cc

Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,28 @@ const EVP_CIPHER* GetAesCbcAlgorithmFromKeySize(size_t key_size_bytes) {
8282
}
8383
}
8484

85+
inline bool FrameIsH264(webrtc::TransformableFrameInterface* frame,
86+
webrtc::FrameCryptorTransformer::MediaType type) {
87+
switch (type) {
88+
case webrtc::FrameCryptorTransformer::MediaType::kVideoFrame: {
89+
auto videoFrame =
90+
static_cast<webrtc::TransformableVideoFrameInterface*>(frame);
91+
return videoFrame->header().codec ==
92+
webrtc::VideoCodecType::kVideoCodecH264;
93+
}
94+
default:
95+
return false;
96+
}
97+
}
98+
99+
inline bool NeedsRbspUnescaping(const uint8_t* frameData, size_t frameSize) {
100+
for (size_t i = 0; i < frameSize - 3; ++i) {
101+
if (frameData[i] == 0 && frameData[i + 1] == 0 && frameData[i + 2] == 3)
102+
return true;
103+
}
104+
return false;
105+
}
106+
85107
std::string to_uint8_list(const uint8_t* data, int len) {
86108
std::stringstream ss;
87109
ss << "[";
@@ -395,26 +417,41 @@ void FrameCryptorTransformer::encryptFrame(
395417
key_set->encryption_key, iv, frame_header, payload,
396418
&buffer) == Success) {
397419
rtc::Buffer encrypted_payload(buffer.data(), buffer.size());
420+
rtc::Buffer tag(encrypted_payload.data() + encrypted_payload.size() - 16,
421+
16);
422+
rtc::Buffer data_without_header;
423+
data_without_header.AppendData(encrypted_payload);
424+
data_without_header.AppendData(iv);
425+
data_without_header.AppendData(frame_trailer);
426+
398427
rtc::Buffer data_out;
399428
data_out.AppendData(frame_header);
400-
data_out.AppendData(encrypted_payload);
401-
data_out.AppendData(iv);
402-
data_out.AppendData(frame_trailer);
403429

404-
RTC_CHECK_EQ(data_out.size(), frame_header.size() +
405-
encrypted_payload.size() + iv.size() +
406-
frame_trailer.size());
430+
if (FrameIsH264(frame.get(), type_)) {
431+
H264::WriteRbsp(data_without_header.data(),data_without_header.size(), &data_out);
432+
} else {
433+
data_out.AppendData(data_without_header);
434+
RTC_CHECK_EQ(data_out.size(), frame_header.size() +
435+
encrypted_payload.size() + iv.size() +
436+
frame_trailer.size());
437+
}
407438

408439
frame->SetData(data_out);
409440

410-
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::encryptFrame() ivLength="
411-
<< static_cast<int>(iv.size()) << " unencrypted_bytes="
441+
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::encryptFrame() "
442+
<< "frame length = " << static_cast<int>(date_in.size())
443+
<< " encrypted_length = "
444+
<< static_cast<int>(data_out.size())
445+
<< " ivLength=" << static_cast<int>(iv.size())
446+
<< " unencrypted_bytes="
412447
<< static_cast<int>(unencrypted_bytes)
448+
<< " tag=" << to_hex(tag.data(), tag.size())
413449
<< " key_index=" << static_cast<int>(key_index_)
414450
<< " aesKey="
415451
<< to_hex(key_set->encryption_key.data(),
416452
key_set->encryption_key.size())
417453
<< " iv=" << to_hex(iv.data(), iv.size());
454+
418455
if (last_enc_error_ != FrameCryptionState::kOk) {
419456
last_enc_error_ = FrameCryptionState::kOk;
420457
if (observer_)
@@ -554,11 +591,34 @@ void FrameCryptorTransformer::decryptFrame(
554591
iv[i] = date_in[date_in.size() - 2 - ivLength + i];
555592
}
556593

557-
rtc::Buffer encrypted_payload(date_in.size() - unencrypted_bytes - ivLength -
558-
2);
559-
for (size_t i = unencrypted_bytes; i < date_in.size() - ivLength - 2; i++) {
560-
encrypted_payload[i - unencrypted_bytes] = date_in[i];
594+
rtc::Buffer encrypted_buffer(date_in.size() - unencrypted_bytes);
595+
for (size_t i = unencrypted_bytes; i < date_in.size(); i++) {
596+
encrypted_buffer[i - unencrypted_bytes] = date_in[i];
597+
}
598+
599+
if (FrameIsH264(frame.get(), type_) &&
600+
NeedsRbspUnescaping(encrypted_buffer.data(), encrypted_buffer.size())) {
601+
encrypted_buffer.SetData(H264::ParseRbsp(encrypted_buffer.data(), encrypted_buffer.size()));
602+
}
603+
604+
rtc::Buffer encrypted_payload(encrypted_buffer.size() - ivLength - 2);
605+
for (size_t i = 0; i < encrypted_payload.size(); i++) {
606+
encrypted_payload[i] = encrypted_buffer[i];
561607
}
608+
609+
rtc::Buffer tag(encrypted_payload.data() + encrypted_payload.size() - 16, 16);
610+
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::decryptFrame() "
611+
<< " frame length = " << static_cast<int>(date_in.size())
612+
<< " ivLength=" << static_cast<int>(iv.size())
613+
<< " unencrypted_bytes="
614+
<< static_cast<int>(unencrypted_bytes)
615+
<< " tag=" << to_hex(tag.data(), tag.size())
616+
<< " key_index=" << static_cast<int>(key_index_)
617+
<< " aesKey="
618+
<< to_hex(key_set->encryption_key.data(),
619+
key_set->encryption_key.size())
620+
<< " iv=" << to_hex(iv.data(), iv.size());
621+
562622
std::vector<uint8_t> buffer;
563623

564624
int ratchet_count = 0;
@@ -636,15 +696,6 @@ void FrameCryptorTransformer::decryptFrame(
636696
data_out.AppendData(payload);
637697
frame->SetData(data_out);
638698

639-
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::decryptFrame() ivLength="
640-
<< static_cast<int>(ivLength) << " unencrypted_bytes="
641-
<< static_cast<int>(unencrypted_bytes)
642-
<< " key_index=" << static_cast<int>(key_index_)
643-
<< " aesKey="
644-
<< to_hex(key_set->encryption_key.data(),
645-
key_set->encryption_key.size())
646-
<< " iv=" << to_hex(iv.data(), iv.size());
647-
648699
if (last_dec_error_ != FrameCryptionState::kOk) {
649700
last_dec_error_ = FrameCryptionState::kOk;
650701
if (observer_)

0 commit comments

Comments
 (0)