| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromeos/ash/services/recording/recording_service_test_api.h" |
| |
| #include "base/functional/bind.h" |
| #include "base/run_loop.h" |
| #include "base/test/bind.h" |
| #include "base/threading/thread_checker.h" |
| #include "chromeos/ash/services/recording/audio_stream_mixer.h" |
| |
| namespace recording { |
| |
| RecordingServiceTestApi::RecordingServiceTestApi( |
| mojo::PendingReceiver<mojom::RecordingService> receiver) |
| : recording_service_(std::move(receiver)) {} |
| |
| viz::FrameSinkId RecordingServiceTestApi::GetCurrentFrameSinkId() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| DCHECK(recording_service_.current_video_capture_params_); |
| |
| return recording_service_.current_video_capture_params_->frame_sink_id(); |
| } |
| |
| float RecordingServiceTestApi::GetCurrentDeviceScaleFactor() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| DCHECK(recording_service_.current_video_capture_params_); |
| |
| return recording_service_.current_video_capture_params_ |
| ->current_device_scale_factor(); |
| } |
| |
| gfx::Size RecordingServiceTestApi::GetCurrentFrameSinkSizeInPixels() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| DCHECK(recording_service_.current_video_capture_params_); |
| |
| return recording_service_.current_video_capture_params_ |
| ->current_frame_sink_size_pixels(); |
| } |
| |
| gfx::Size RecordingServiceTestApi::GetCurrentVideoSize() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| DCHECK(recording_service_.current_video_capture_params_); |
| |
| return recording_service_.current_video_capture_params_->GetVideoSize(); |
| } |
| |
| gfx::ImageSkia RecordingServiceTestApi::GetVideoThumbnail() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| |
| return recording_service_.video_thumbnail_; |
| } |
| |
| int RecordingServiceTestApi::GetNumberOfVideoEncoderReconfigures() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| |
| return recording_service_.number_of_video_encoder_reconfigures_; |
| } |
| |
| void RecordingServiceTestApi::RequestAndWaitForVideoFrame( |
| VerifyVideoFrameCallback verify_frame_callback) { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| DCHECK(recording_service_.video_capturer_remote_); |
| DCHECK(!recording_service_.on_video_frame_delivered_callback_for_testing_); |
| |
| // Flush any pending calls from before. |
| recording_service_.video_capturer_remote_.FlushForTesting(); |
| recording_service_.consumer_receiver_.FlushForTesting(); |
| |
| base::RunLoop run_loop; |
| |
| recording_service_.on_video_frame_delivered_callback_for_testing_ = |
| base::BindOnce( |
| [](base::OnceClosure run_loop_quit_closure, |
| VerifyVideoFrameCallback verify_callback, |
| const media::VideoFrame& frame, const gfx::Rect& content_rect) { |
| if (verify_callback) |
| std::move(verify_callback).Run(frame, content_rect); |
| |
| std::move(run_loop_quit_closure).Run(); |
| }, |
| run_loop.QuitClosure(), std::move(verify_frame_callback)); |
| |
| recording_service_.video_capturer_remote_->RequestRefreshFrame(); |
| recording_service_.video_capturer_remote_.FlushForTesting(); |
| |
| run_loop.Run(); |
| } |
| |
| bool RecordingServiceTestApi::IsDoingAudioRecording() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| |
| return !!recording_service_.audio_stream_mixer_; |
| } |
| |
| int RecordingServiceTestApi::GetNumberOfAudioCapturers() const { |
| DCHECK_CALLED_ON_VALID_THREAD(recording_service_.main_thread_checker_); |
| |
| if (recording_service_.audio_stream_mixer_) { |
| base::RunLoop loop; |
| int num_capturers = 0; |
| // Since `audio_stream_mixer_` is bound to the `encoding_task_runner_`, we |
| // can't call into it directly. We must flush all the posted tasks on it to |
| // make sure all the capturers that it was supposed to create have already |
| // been created. Then we can asynchronously get their number. |
| recording_service_.audio_stream_mixer_.FlushPostedTasksForTesting(); |
| recording_service_.audio_stream_mixer_ |
| .AsyncCall(&AudioStreamMixer::GetNumberOfCapturers) |
| .Then(base::BindLambdaForTesting([&loop, &num_capturers](int num) { |
| num_capturers = num; |
| loop.Quit(); |
| })); |
| loop.Run(); |
| return num_capturers; |
| } |
| |
| return 0; |
| } |
| |
| } // namespace recording |