mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
FrameDumpingEncoder: relax threading assumptions.
The wrapped encoders may sometimes shift the callback threads, so SequenceChecker is not legits for this case. Replaced with a Mutex. Bug: b/296242528 Change-Id: I7b2e6e630563246d5214ff4f18c6855ba7869a92 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/317460 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Markus Handell <handellm@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40609}
This commit is contained in:
parent
c08df4bdca
commit
1692e54146
1 changed files with 17 additions and 11 deletions
|
@ -36,8 +36,11 @@ class FrameDumpingEncoder : public VideoEncoder, public EncodedImageCallback {
|
||||||
std::string output_directory)
|
std::string output_directory)
|
||||||
: wrapped_(std::move(wrapped)),
|
: wrapped_(std::move(wrapped)),
|
||||||
output_directory_(output_directory),
|
output_directory_(output_directory),
|
||||||
origin_time_micros_(origin_time_micros) {
|
origin_time_micros_(origin_time_micros) {}
|
||||||
sequence_checker_.Detach();
|
|
||||||
|
~FrameDumpingEncoder() override {
|
||||||
|
MutexLock lock(&mu_);
|
||||||
|
writers_by_simulcast_index_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// VideoEncoder overloads.
|
// VideoEncoder overloads.
|
||||||
|
@ -77,18 +80,20 @@ class FrameDumpingEncoder : public VideoEncoder, public EncodedImageCallback {
|
||||||
// EncodedImageCallback overrides.
|
// EncodedImageCallback overrides.
|
||||||
Result OnEncodedImage(const EncodedImage& encoded_image,
|
Result OnEncodedImage(const EncodedImage& encoded_image,
|
||||||
const CodecSpecificInfo* codec_specific_info) override {
|
const CodecSpecificInfo* codec_specific_info) override {
|
||||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
{
|
||||||
GetFileWriterForSimulcastIndex(encoded_image.SimulcastIndex().value_or(0))
|
MutexLock lock(&mu_);
|
||||||
.WriteFrame(encoded_image, codec_settings_.codecType);
|
GetFileWriterForSimulcastIndex(encoded_image.SimulcastIndex().value_or(0))
|
||||||
|
.WriteFrame(encoded_image, codec_settings_.codecType);
|
||||||
|
}
|
||||||
return callback_->OnEncodedImage(encoded_image, codec_specific_info);
|
return callback_->OnEncodedImage(encoded_image, codec_specific_info);
|
||||||
}
|
}
|
||||||
void OnDroppedFrame(DropReason reason) override {
|
void OnDroppedFrame(DropReason reason) override {
|
||||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
|
||||||
callback_->OnDroppedFrame(reason);
|
callback_->OnDroppedFrame(reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string FilenameFromSimulcastIndex(int index) {
|
std::string FilenameFromSimulcastIndex(int index)
|
||||||
|
RTC_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
||||||
char filename_buffer[1024];
|
char filename_buffer[1024];
|
||||||
rtc::SimpleStringBuilder builder(filename_buffer);
|
rtc::SimpleStringBuilder builder(filename_buffer);
|
||||||
builder << output_directory_ << "/webrtc_encoded_frames"
|
builder << output_directory_ << "/webrtc_encoded_frames"
|
||||||
|
@ -96,7 +101,8 @@ class FrameDumpingEncoder : public VideoEncoder, public EncodedImageCallback {
|
||||||
return builder.str();
|
return builder.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
IvfFileWriter& GetFileWriterForSimulcastIndex(int index) {
|
IvfFileWriter& GetFileWriterForSimulcastIndex(int index)
|
||||||
|
RTC_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
||||||
const auto& it = writers_by_simulcast_index_.find(index);
|
const auto& it = writers_by_simulcast_index_.find(index);
|
||||||
if (it != writers_by_simulcast_index_.end()) {
|
if (it != writers_by_simulcast_index_.end()) {
|
||||||
return *it->second;
|
return *it->second;
|
||||||
|
@ -110,10 +116,10 @@ class FrameDumpingEncoder : public VideoEncoder, public EncodedImageCallback {
|
||||||
return *writer_ptr;
|
return *writer_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
SequenceChecker sequence_checker_;
|
|
||||||
std::unique_ptr<VideoEncoder> wrapped_;
|
std::unique_ptr<VideoEncoder> wrapped_;
|
||||||
std::map<int, std::unique_ptr<IvfFileWriter>> writers_by_simulcast_index_;
|
Mutex mu_;
|
||||||
std::unique_ptr<IvfFileWriter> writer_;
|
std::map<int, std::unique_ptr<IvfFileWriter>> writers_by_simulcast_index_
|
||||||
|
RTC_GUARDED_BY(mu_);
|
||||||
VideoCodec codec_settings_;
|
VideoCodec codec_settings_;
|
||||||
EncodedImageCallback* callback_ = nullptr;
|
EncodedImageCallback* callback_ = nullptr;
|
||||||
std::string output_directory_;
|
std::string output_directory_;
|
||||||
|
|
Loading…
Reference in a new issue