blob: 5019518967ee92b8e8e5601f2501b632a8d1318a [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_GPU_V4L2_BUFFER_AFFINITY_TRACKER_H_
#define MEDIA_GPU_V4L2_BUFFER_AFFINITY_TRACKER_H_
#include <cstddef>
#include <map>
#include "base/synchronization/lock.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/generic_shared_memory_id.h"
namespace media {
/**
* Maintains affinity between native handles and V4L2 buffers.
*
* Give a handle ID, `get_buffer_for_id()` will attempt to always return the
* same V4L2 buffer ID so handles are always used with the same buffer. This
* is both beneficial for performance, and necessary in some cases like the
* stateful decoder.
*
* All the methods of this class are thread-safe.
*/
class BufferAffinityTracker {
public:
explicit BufferAffinityTracker(size_t nb_buffers);
~BufferAffinityTracker();
size_t nb_buffers() const { return nb_buffers_; }
// Resize this tracker and reset its state.
void resize(size_t nb_buffers);
/**
* Return the V4L2 buffer index suitable for this buffer ID.
*
* If it is the first time this method is called with a given id, return the
* first available buffer it can find, and memorize the association between
* the id and the V4L2 buffer.
*
* On subsequent calls with the same id, that same V4L2 buffer will be
* returned.
*/
absl::optional<size_t> get_buffer_for_id(gfx::GenericSharedMemoryId id);
private:
base::Lock lock_;
std::map<gfx::GenericSharedMemoryId, size_t> id_to_buffer_map_;
// Maximum number of buffers we are allowed to track.
size_t nb_buffers_;
};
} // namespace media
#endif // MEDIA_GPU_V4L2_BUFFER_AFFINITY_TRACKER_H_