You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
7.6 KiB
231 lines
7.6 KiB
/*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V2_0_BUFFERSTATUS_H
|
|
#define ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V2_0_BUFFERSTATUS_H
|
|
|
|
#include <android/hardware/media/bufferpool/2.0/types.h>
|
|
#include <bufferpool/BufferPoolTypes.h>
|
|
#include <fmq/MessageQueue.h>
|
|
#include <hidl/MQDescriptor.h>
|
|
#include <hidl/Status.h>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <vector>
|
|
#include <list>
|
|
|
|
namespace android {
|
|
namespace hardware {
|
|
namespace media {
|
|
namespace bufferpool {
|
|
namespace V2_0 {
|
|
namespace implementation {
|
|
|
|
/** Returns monotonic timestamp in Us since fixed point in time. */
|
|
int64_t getTimestampNow();
|
|
|
|
bool isMessageLater(uint32_t curMsgId, uint32_t prevMsgId);
|
|
|
|
bool isBufferInRange(BufferId from, BufferId to, BufferId bufferId);
|
|
|
|
/**
|
|
* A collection of buffer status message FMQ for a buffer pool. buffer
|
|
* ownership/status change messages are sent via the FMQs from the clients.
|
|
*/
|
|
class BufferStatusObserver {
|
|
private:
|
|
std::map<ConnectionId, std::unique_ptr<BufferStatusQueue>>
|
|
mBufferStatusQueues;
|
|
|
|
public:
|
|
/** Creates a buffer status message FMQ for the specified
|
|
* connection(client).
|
|
*
|
|
* @param connectionId connection Id of the specified client.
|
|
* @param fmqDescPtr double ptr of created FMQ's descriptor.
|
|
*
|
|
* @return OK if FMQ is created successfully.
|
|
* NO_MEMORY when there is no memory.
|
|
* CRITICAL_ERROR otherwise.
|
|
*/
|
|
ResultStatus open(ConnectionId id, const StatusDescriptor** fmqDescPtr);
|
|
|
|
/** Closes a buffer status message FMQ for the specified
|
|
* connection(client).
|
|
*
|
|
* @param connectionId connection Id of the specified client.
|
|
*
|
|
* @return OK if the specified connection is closed successfully.
|
|
* CRITICAL_ERROR otherwise.
|
|
*/
|
|
ResultStatus close(ConnectionId id);
|
|
|
|
/** Retrieves all pending FMQ buffer status messages from clients.
|
|
*
|
|
* @param messages retrieved pending messages.
|
|
*/
|
|
void getBufferStatusChanges(std::vector<BufferStatusMessage> &messages);
|
|
};
|
|
|
|
/**
|
|
* A buffer status message FMQ for a buffer pool client. Buffer ownership/status
|
|
* change messages are sent via the fmq to the buffer pool.
|
|
*/
|
|
class BufferStatusChannel {
|
|
private:
|
|
bool mValid;
|
|
std::unique_ptr<BufferStatusQueue> mBufferStatusQueue;
|
|
|
|
public:
|
|
/**
|
|
* Connects to a buffer status message FMQ from a descriptor of
|
|
* the created FMQ.
|
|
*
|
|
* @param fmqDesc Descriptor of the created FMQ.
|
|
*/
|
|
BufferStatusChannel(const StatusDescriptor &fmqDesc);
|
|
|
|
/** Returns whether the FMQ is connected successfully. */
|
|
bool isValid();
|
|
|
|
/** Returns whether the FMQ needs to be synced from the buffer pool */
|
|
bool needsSync();
|
|
|
|
/**
|
|
* Posts a buffer release message to the buffer pool.
|
|
*
|
|
* @param connectionId connection Id of the client.
|
|
* @param pending currently pending buffer release messages.
|
|
* @param posted posted buffer release messages.
|
|
*/
|
|
void postBufferRelease(
|
|
ConnectionId connectionId,
|
|
std::list<BufferId> &pending, std::list<BufferId> &posted);
|
|
|
|
/**
|
|
* Posts a buffer status message regarding the specified buffer
|
|
* transfer transaction.
|
|
*
|
|
* @param transactionId Id of the specified transaction.
|
|
* @param bufferId buffer Id of the specified transaction.
|
|
* @param status new status of the buffer.
|
|
* @param connectionId connection Id of the client.
|
|
* @param targetId connection Id of the receiver(only when the sender
|
|
* posts a status message).
|
|
* @param pending currently pending buffer release messages.
|
|
* @param posted posted buffer release messages.
|
|
*
|
|
* @return {@code true} when the specified message is posted,
|
|
* {@code false} otherwise.
|
|
*/
|
|
bool postBufferStatusMessage(
|
|
TransactionId transactionId,
|
|
BufferId bufferId,
|
|
BufferStatus status,
|
|
ConnectionId connectionId,
|
|
ConnectionId targetId,
|
|
std::list<BufferId> &pending, std::list<BufferId> &posted);
|
|
|
|
/**
|
|
* Posts a buffer invaliadation messge to the buffer pool.
|
|
*
|
|
* @param connectionId connection Id of the client.
|
|
* @param invalidateId invalidation ack to the buffer pool.
|
|
* if invalidation id is zero, the ack will not be
|
|
* posted.
|
|
* @param invalidated sets {@code true} only when the invalidation ack is
|
|
* posted.
|
|
*/
|
|
void postBufferInvalidateAck(
|
|
ConnectionId connectionId,
|
|
uint32_t invalidateId,
|
|
bool *invalidated);
|
|
};
|
|
|
|
/**
|
|
* A buffer invalidation FMQ for a buffer pool client. Buffer invalidation
|
|
* messages are received via the fmq from the buffer pool. Buffer invalidation
|
|
* messages are handled as soon as possible.
|
|
*/
|
|
class BufferInvalidationListener {
|
|
private:
|
|
bool mValid;
|
|
std::unique_ptr<BufferInvalidationQueue> mBufferInvalidationQueue;
|
|
|
|
public:
|
|
/**
|
|
* Connects to a buffer invalidation FMQ from a descriptor of the created FMQ.
|
|
*
|
|
* @param fmqDesc Descriptor of the created FMQ.
|
|
*/
|
|
BufferInvalidationListener(const InvalidationDescriptor &fmqDesc);
|
|
|
|
/** Retrieves all pending buffer invalidation messages from the buffer pool.
|
|
*
|
|
* @param messages retrieved pending messages.
|
|
*/
|
|
void getInvalidations(std::vector<BufferInvalidationMessage> &messages);
|
|
|
|
/** Returns whether the FMQ is connected succesfully. */
|
|
bool isValid();
|
|
};
|
|
|
|
/**
|
|
* A buffer invalidation FMQ for a buffer pool. A buffer pool will send buffer
|
|
* invalidation messages to the clients via the FMQ. The FMQ is shared among
|
|
* buffer pool clients.
|
|
*/
|
|
class BufferInvalidationChannel {
|
|
private:
|
|
bool mValid;
|
|
std::unique_ptr<BufferInvalidationQueue> mBufferInvalidationQueue;
|
|
|
|
public:
|
|
/**
|
|
* Creates a buffer invalidation FMQ for a buffer pool.
|
|
*/
|
|
BufferInvalidationChannel();
|
|
|
|
/** Returns whether the FMQ is connected succesfully. */
|
|
bool isValid();
|
|
|
|
/**
|
|
* Retrieves the descriptor of a buffer invalidation FMQ. the descriptor may
|
|
* be passed to the client for buffer invalidation handling.
|
|
*
|
|
* @param fmqDescPtr double ptr of created FMQ's descriptor.
|
|
*/
|
|
void getDesc(const InvalidationDescriptor **fmqDescPtr);
|
|
|
|
/** Posts a buffer invalidation for invalidated buffers.
|
|
*
|
|
* @param msgId Invalidation message id which is used when clients send
|
|
* acks back via BufferStatusMessage
|
|
* @param fromId The start bufferid of the invalidated buffers(inclusive)
|
|
* @param toId The end bufferId of the invalidated buffers(inclusive)
|
|
*/
|
|
void postInvalidation(uint32_t msgId, BufferId fromId, BufferId toId);
|
|
};
|
|
|
|
} // namespace implementation
|
|
} // namespace V2_0
|
|
} // namespace bufferpool
|
|
} // namespace media
|
|
} // namespace hardware
|
|
} // namespace android
|
|
|
|
#endif // ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V2_0_BUFFERSTATUS_H
|