Merge "android.hardware.media.bufferpool@1.0 HAL"

This commit is contained in:
TreeHugger Robot
2018-01-31 00:36:35 +00:00
committed by Android (Google) Code Review
6 changed files with 331 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: "android.hardware.media.bufferpool@1.0",
root: "android.hardware",
vndk: {
enabled: true,
},
srcs: [
"types.hal",
"IAccessor.hal",
"IClientManager.hal",
"IConnection.hal",
],
interfaces: [
"android.hidl.base@1.0",
],
types: [
"Buffer",
"BufferStatus",
"BufferStatusMessage",
"ResultStatus",
],
gen_java: false,
}

View File

@@ -0,0 +1,68 @@
/*
* 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.
*/
package android.hardware.media.bufferpool@1.0;
import IConnection;
/**
* IAccessor creates IConnection which is used from IClientManager in order to
* use functionality of the specified buffer pool.
*/
interface IAccessor {
/**
* Registers a new client and creates IConnection to the buffer pool for
* the client. IConnection and FMQ are used by IClientManager in order to
* communicate with the buffer pool. Via FMQ IClientManager sends
* BufferStatusMesage(s) to the buffer pool.
*
* FMQ is used to send buffer ownership status changes to a buffer pool
* from a buffer pool client. A buffer pool synchronizes FMQ messages when
* there is a hidl request from the clients. Every client has its own
* connection and FMQ to communicate with the buffer pool. So sending an
* FMQ message on behalf of other clients is not possible.
*
* FMQ messages are sent when a buffer is acquired or released. Also, FMQ
* messages are sent when a buffer is transferred from a client to another
* client. FMQ has its own ID from a buffer pool. A client is specified
* with the ID.
*
* To transfer a buffer, a sender must send an FMQ message. The message
* must include a receiver's ID and a transaction ID. A receiver must send
* the transaction ID to fetch a buffer from a buffer pool. Since the
* sender already registered the receiver via an FMQ message, The buffer
* pool must verify the receiver with the transaction ID. In order to
* prevent faking a receiver, a connection to a buffer pool from client is
* made and kept private. Also part of transaction ID is a sender ID in
* order to prevent fake transactions from other clients. This must be
* verified with an FMQ message from a buffer pool.
*
* @return status The status of the call.
* OK - A connection is made successfully.
* NO_MEMORY - Memory allocation failure occurred.
* ALREADY_EXISTS - A connection was already made.
* CRITICAL_ERROR - Other errors.
* @return connection The IConnection have interfaces
* to get shared buffers from the buffer pool.
* @return connectionId Id of IConnection. The Id identifies
* sender and receiver in FMQ messages during buffer transfer.
* @return mqDesc FMQ descriptor. The descriptor can be used to
* send/receive FMQ messages.
*/
connect()
generates (ResultStatus status, IConnection connection,
int64_t connectionId, fmq_sync<BufferStatusMessage> mqDesc);
};

View File

@@ -0,0 +1,47 @@
/*
* 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.
*/
package android.hardware.media.bufferpool@1.0;
import IAccessor;
/**
* IClientManager manages IConnection(s) inside a process. A locally
* created IConnection represents a communication node(receiver) with the
* specified buffer pool(IAccessor).
* IConnection(s) are not exposed to other processes(IClientManager).
* IClientManager instance must be unique within a process.
*/
interface IClientManager {
/**
* Sets up a buffer receiving communication node for the specified
* buffer pool. A manager must create a IConnection to the buffer
* pool if it does not already have a connection.
*
* @param bufferPool a buffer pool which is specified with the IAccessor.
* The specified buffer pool is the owner of received buffers.
* @return status The status of the call.
* OK - A sender was set successfully.
* NO_MEMORY - Memory allocation failure occurred.
* ALREADY_EXISTS - A sender was registered already.
* CRITICAL_ERROR - Other errors.
* @return connectionId the Id of the communication node to the buffer pool.
* This id is used in FMQ to notify IAccessor that a buffer has been
* sent to that connection during transfers.
*/
registerSender(IAccessor bufferPool) generates
(ResultStatus status, int64_t connectionId);
};

View File

@@ -0,0 +1,43 @@
/*
* 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.
*/
package android.hardware.media.bufferpool@1.0;
/**
* A connection to a buffer pool which handles requests from a buffer pool
* client. The connection must be made in order to receive buffers from
* other buffer pool clients.
*/
interface IConnection {
/**
* Retrieves a buffer using bufferId. The method must be called from
* receiving side of buffer during transferring only when the specified
* buffer is neither cached nor used. This fails if the specified
* transaction is not valid.
*
* @param transactionId Unique transaction id for buffer transferring.
* @param bufferId Id of the buffer to be fetched.
* @return status The status of the call.
* OK - A buffer was fetched successfully.
* NO_MEMORY - Memory allocation failure occurred.
* NOT_FOUND - A buffer was not found due to invalidation.
* CRITICAL_ERROR - Other errors.
* @return buffer The actual buffer which is specified with bufferId.
*/
fetch(uint64_t transactionId, uint32_t bufferId) generates
(ResultStatus status, Buffer buffer);
};

View File

@@ -0,0 +1,54 @@
1. Overview
A buffer pool enables processes to transfer buffers asynchronously.
Without a buffer pool, a process calls a synchronous method of the other
process and waits until the call finishes transferring a buffer. This adds
unwanted latency due to context switching. With help from a buffer pool, a
process can pass buffers asynchronously and reduce context switching latency.
Passing an interface and a handle adds extra latency also. To mitigate the
latency, passing IDs with local cache is used. For security concerns about
rogue clients, FMQ is used to communicate between a buffer pool and a client
process. FMQ is used to send buffer ownership change status from a client
process to a buffer pool. Except FMQ, a buffer pool does not use any shared
memory.
2. FMQ
FMQ is used to send buffer ownership status changes to a buffer pool from a
buffer pool client. A buffer pool synchronizes FMQ messages when there is a
hidl request from the clients. Every client has its own connection and FMQ
to communicate with the buffer pool. So sending an FMQ message on behalf of
other clients is not possible.
FMQ messages are sent when a buffer is acquired or released. Also, FMQ messages
are sent when a buffer is transferred from a client to another client. FMQ has
its own ID from a buffer pool. A client is specified with the ID.
To transfer a buffer, a sender must send an FMQ message. The message must
include a receiver's ID and a transaction ID. A receiver must send the
transaction ID to fetch a buffer from a buffer pool. Since the sender already
registered the receiver via an FMQ message, The buffer pool must verify the
receiver with the transaction ID. In order to prevent faking a receiver, a
connection to a buffer pool from client is made and kept privately. Also part of
transaction ID is a sender ID in order to prevent fake transactions from other
clients. This must be verified with an FMQ message from a buffer pool.
FMQ messages are defined in BufferStatus and BufferStatusMessage of 'types.hal'.
3. Interfaces
IConnection
A connection to a buffer pool from a buffer pool client. The connection
provides the functionalities to share buffers between buffer pool clients.
The connection must be unique for each client.
IAccessor
An accessor to a buffer pool which makes a connection to the buffer pool.
IAccesssor#connect creates an IConnection.
IClientManager
A manager of buffer pool clients and clients' connections to buffer pools. It
sets up a process to be a receiver of buffers from a buffer pool. The manager
is unique in a process.

View File

@@ -0,0 +1,93 @@
/*
* 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.
*/
package android.hardware.media.bufferpool@1.0;
enum ResultStatus : int32_t {
OK = 0,
NO_MEMORY = 1,
ALREADY_EXISTS = 2,
NOT_FOUND = 3,
CRITICAL_ERROR = 4,
};
/**
* Generic buffer for fast recycling for media/stagefright.
*
* During media pipeline buffer references are created, shared and
* destroyed frequently. The underlying buffers are allocated on demand
* by a buffer pool, and are recycled to the buffer pool when they are
* no longer referenced by the clients.
*
* E.g. ion or gralloc buffer
*/
struct Buffer {
uint32_t id;
handle buffer;
};
/**
* Buffer ownership status for the specified client.
* Buffer transfer status for the specified buffer transafer transaction.
* BufferStatus is posted along with BufferStatusMessage from a client to
* the buffer pool for synchronization after status change.
*/
enum BufferStatus : int32_t {
/** No longer used by the specified client. */
NOT_USED = 0,
/** Buffer is acquired by the specified client. */
USED = 1,
/** Buffer is sent by the specified client. */
TRANSFER_TO = 2,
/** Buffer transfer is acked by the receiver client. */
TRANSFER_FROM = 3,
/** Buffer transfer is timed out by receiver client. */
TRANSFER_TIMEOUT = 4,
/** Buffer transfer is not acked by the receiver. */
TRANSFER_LOST = 5,
/** Buffer fetch request from the client. */
TRANSFER_FETCH = 6,
/** Buffer transaction succeeded. */
TRANSFER_OK = 7,
/** Buffer transaction failure. */
TRANSFER_ERROR = 8,
};
/**
* Buffer ownership status change message. This message is
* sent via fmq to the buffer pool from client processes.
*/
struct BufferStatusMessage {
/**
* Transaction Id = (SenderId : sender local transaction Id)
* Transaction Id is created from sender and posted via fmq within
* TRANSFER_TO message.
*/
uint64_t transactionId;
uint32_t bufferId;
BufferStatus newStatus;
/** Used by the buffer pool. not by client. */
int64_t connectionId;
/** Valid only when TRANSFER_TO is posted. */
int64_t targetConnectionId;
/**
* Used by the buffer pool, not by client.
* Monotonic timestamp in Us since fixed point in time as decided
* by the sender of the message
*/
int64_t timestampUs;
};