// 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_); }