webrtc-sdk / libwebrtc

A C++ wrapper for binary release, mainly used for flutter-webrtc desktop (windows, linux, embedded).
MIT License
378 stars 77 forks source link

When i dispose videorender, it crashed #77

Closed nikohpng closed 1 year ago

nikohpng commented 1 year ago

Description

One videorender leaveed When I work under high loads. then the videorender will be disposed. when it is disposing, the app crashed. I find that _mtx_destroy_in_situ was called.

Log

2f823af38e3348aacf94463c32c3577

ViewPoint

I think there is a risk of being disposed of while rendering is being called. such like this


const FlutterDesktopPixelBuffer* FlutterVideoRenderer::CopyPixelBuffer(
    size_t width,
    size_t height) const {
  mutex_.lock();
  if (pixel_buffer_.get() && frame_.get()) {
    if (pixel_buffer_->width != frame_->width() ||
        pixel_buffer_->height != frame_->height()) {
      size_t buffer_size =
          (size_t(frame_->width()) * size_t(frame_->height())) * (32 >> 3);
      rgb_buffer_.reset(new uint8_t[buffer_size]);
      pixel_buffer_->width = frame_->width();
      pixel_buffer_->height = frame_->height();
    }

    frame_->ConvertToARGB(RTCVideoFrame::Type::kABGR, rgb_buffer_.get(), 0,
                          (int)pixel_buffer_->width,
                          (int)pixel_buffer_->height);

    pixel_buffer_->buffer = rgb_buffer_.get();
    mutex_.unlock();
    return pixel_buffer_.get();
  }
  mutex_.unlock();
  return nullptr;
}
void FlutterVideoRenderer::OnFrame(scoped_refptr<RTCVideoFrame> frame) {
mutex_.lock();
frame_ = frame;
// haven't do this
// mutex_.unlock();
}
//sametime
void FlutterVideoRendererManager::VideoRendererDispose(
    int64_t texture_id,
    std::unique_ptr<MethodResultProxy> result) {
  auto it = renderers_.find(texture_id);
  if (it != renderers_.end()) {
    base_->textures_->UnregisterTexture(texture_id);
    renderers_.erase(it);
    result->Success();
    return;
  }
  result->Error("VideoRendererDisposeFailed",
                "VideoRendererDispose() texture not found!");
}

because of asynchronous, when mutex_.lock(),we immediately call renderers_.erase(it). Then it will crash

nikohpng commented 1 year ago

I have solved. This issue shouldn't be here.