chromium的回調 callback 與 bind bindonce

 

  // Request a copy of the next frame from the frame sink.
  std::unique_ptr<CopyOutputRequest> request(new CopyOutputRequest(
      pixel_format_ == media::PIXEL_FORMAT_I420
          ? CopyOutputRequest::ResultFormat::I420_PLANES
          : CopyOutputRequest::ResultFormat::RGBA_BITMAP,
      base::BindOnce(&FrameSinkVideoCapturerImpl::DidCopyFrame,
                     capture_weak_factory_.GetWeakPtr(), capture_frame_number,
                     oracle_frame_number, content_version_, content_rect,
                     VideoCaptureOverlay::MakeCombinedRenderer(
                         GetOverlaysInOrder(), content_rect, frame->format()),
                     std::move(frame), base::TimeTicks::Now())));

new了一個CopyOutputRequest類,給了unique_ptr。

這個類CopyOutputRequest的第二個參數是個回調,它的原型定義在copy_output_request.h

using CopyOutputRequestCallback =
base::OnceCallback<void(std::unique_ptr<CopyOutputResult> result)>;

CopyOutputRequest(ResultFormat result_format,
CopyOutputRequestCallback result_callback);

這裏看到函數原型應該是:

void(std::unique_ptr<CopyOutputResult> result)

返回值是void,一個參數result。

而我們看DidCopyFrame確有8個參數。將前面7個去掉,最後一個result是否和上面的函數原型定義的。這就是base::BindOnce的作用,在生產時初始化了前面7個參數。只留了最後一個做。這樣base::BindOnce返回的callback就符合原型定義了。

void FrameSinkVideoCapturerImpl::DidCopyFrame(
    int64_t capture_frame_number,
    OracleFrameNumber oracle_frame_number,
    int64_t content_version,
    const gfx::Rect& content_rect,
    VideoCaptureOverlay::OnceRenderer overlay_renderer,
    scoped_refptr<VideoFrame> frame,
    base::TimeTicks request_time,
    std::unique_ptr<CopyOutputResult> result)

 


 

void PageHandler::ScreencastFrameCaptured(
    std::unique_ptr<Page::ScreencastFrameMetadata> page_metadata,
    const SkBitmap& bitmap) {
  if (bitmap.drawsNothing()) {
    if (capture_retry_count_) {
      --capture_retry_count_;
      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
          FROM_HERE,
          base::BindOnce(&PageHandler::InnerSwapCompositorFrame,
                         weak_factory_.GetWeakPtr()),
          base::TimeDelta::FromMilliseconds(kFrameRetryDelayMs));
    }
    --frames_in_flight_;
    return;
  }
  base::ThreadPool::PostTaskAndReplyWithResult(
      FROM_HERE, {base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
      base::BindOnce(&EncodeSkBitmap, bitmap, screencast_format_,
                     screencast_quality_),
      base::BindOnce(&PageHandler::ScreencastFrameEncoded,
                     weak_factory_.GetWeakPtr(), std::move(page_metadata)));
}
base::ThreadPool::PostTaskAndReplyWithResult

將第一個回調結果給第二個回調。

第一個結果是Binary:

Binary EncodeSkBitmap(const SkBitmap& image,
                      const std::string& format,
                      int quality) {
  return EncodeImage(gfx::Image::CreateFrom1xBitmap(image), format, quality);
}

第二個回調的第一個參數已經綁定,Binary將傳送到第二個:

 base::BindOnce(&PageHandler::ScreencastFrameEncoded,
                     weak_factory_.GetWeakPtr(), std::move(page_metadata)

void PageHandler::ScreencastFrameEncoded(
    std::unique_ptr<Page::ScreencastFrameMetadata> page_metadata,
    const protocol::Binary& data) {
  if (data.size() == 0) {
    --frames_in_flight_;
    return;  // Encode failed.
  }

  frontend_->ScreencastFrame(data, std::move(page_metadata), session_id_);
}

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章