[go: nahoru, domu]

blob: 6bdb0e68fbc51ab28e38db595cbc58e8f98001f6 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/video_capture/public/cpp/mock_video_frame_handler.h"
#include "base/containers/contains.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
using testing::_;
namespace video_capture {
MockVideoFrameHandler::MockVideoFrameHandler(
mojo::PendingReceiver<mojom::VideoFrameHandler> handler)
: video_frame_handler_(this, std::move(handler)),
should_store_access_permissions_(false) {}
MockVideoFrameHandler::~MockVideoFrameHandler() = default;
void MockVideoFrameHandler::HoldAccessPermissions() {
should_store_access_permissions_ = true;
}
void MockVideoFrameHandler::ReleaseAccessedFrames() {
should_store_access_permissions_ = false;
for (int32_t buffer_id : accessed_frame_ids_) {
frame_access_handler_->OnFinishedConsumingBuffer(buffer_id);
}
accessed_frame_ids_.clear();
}
void MockVideoFrameHandler::OnNewBuffer(
int32_t buffer_id,
media::mojom::VideoBufferHandlePtr buffer_handle) {
CHECK(!base::Contains(known_buffer_ids_, buffer_id));
known_buffer_ids_.push_back(buffer_id);
DoOnNewBuffer(buffer_id, &buffer_handle);
}
void MockVideoFrameHandler::OnFrameAccessHandlerReady(
mojo::PendingRemote<video_capture::mojom::VideoFrameAccessHandler>
pending_frame_access_handler) {
// The MockVideoFrameHandler should take care of frame access.
frame_access_handler_.Bind(std::move(pending_frame_access_handler));
}
void MockVideoFrameHandler::OnFrameReadyInBuffer(
mojom::ReadyFrameInBufferPtr buffer,
std::vector<mojom::ReadyFrameInBufferPtr> scaled_buffers) {
accessed_frame_ids_.push_back(buffer->buffer_id);
for (auto& scaled_buffer : scaled_buffers) {
accessed_frame_ids_.push_back(scaled_buffer->buffer_id);
}
DoOnFrameReadyInBuffer(buffer->buffer_id, buffer->frame_feedback_id,
&buffer->frame_info);
if (!should_store_access_permissions_) {
ReleaseAccessedFrames();
}
}
void MockVideoFrameHandler::OnBufferRetired(int32_t buffer_id) {
auto iter =
std::find(known_buffer_ids_.begin(), known_buffer_ids_.end(), buffer_id);
CHECK(iter != known_buffer_ids_.end());
known_buffer_ids_.erase(iter);
DoOnBufferRetired(buffer_id);
}
FakeVideoFrameAccessHandler::FakeVideoFrameAccessHandler()
: FakeVideoFrameAccessHandler(base::BindRepeating([](int32_t) {})) {}
FakeVideoFrameAccessHandler::FakeVideoFrameAccessHandler(
base::RepeatingCallback<void(int32_t)> callback)
: callback_(std::move(callback)) {}
FakeVideoFrameAccessHandler::~FakeVideoFrameAccessHandler() = default;
const std::vector<int32_t>& FakeVideoFrameAccessHandler::released_buffer_ids()
const {
return released_buffer_ids_;
}
void FakeVideoFrameAccessHandler::ClearReleasedBufferIds() {
released_buffer_ids_.clear();
}
void FakeVideoFrameAccessHandler::OnFinishedConsumingBuffer(int32_t buffer_id) {
released_buffer_ids_.push_back(buffer_id);
callback_.Run(buffer_id);
}
} // namespace video_capture