Merge "media.c2 aidl: Add decoder output allocator interface" am: 3c4de3af67
am: a2147b121e
am: 1c0c72e72b
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/2613750 Change-Id: I01abf77bb3fa539090be72034d3f61c99dd34131 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
commit
16a5725b68
6 changed files with 142 additions and 80 deletions
|
@ -15,7 +15,7 @@ aidl_interface {
|
|||
double_loadable: true,
|
||||
srcs: ["android/hardware/media/c2/*.aidl"],
|
||||
include_dirs: [
|
||||
"frameworks/native/aidl/gui",
|
||||
"frameworks/base/core/java",
|
||||
],
|
||||
imports: [
|
||||
"android.hardware.common-V2",
|
||||
|
|
|
@ -43,7 +43,7 @@ interface IComponent {
|
|||
void queue(in android.hardware.media.c2.WorkBundle workBundle);
|
||||
void release();
|
||||
void reset();
|
||||
void setOutputSurface(in long blockPoolId, in android.view.Surface surface, in android.hardware.media.c2.SurfaceSyncObj syncObject);
|
||||
void setDecoderOutputAllocator(in android.hardware.media.c2.IGraphicBufferAllocator allocator);
|
||||
void start();
|
||||
void stop();
|
||||
parcelable BlockPool {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
* Copyright (C) 2023 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.
|
||||
|
@ -33,9 +33,22 @@
|
|||
|
||||
package android.hardware.media.c2;
|
||||
@VintfStability
|
||||
parcelable SurfaceSyncObj {
|
||||
android.hardware.common.NativeHandle syncMemory;
|
||||
long bqId;
|
||||
int generationId;
|
||||
long consumerUsage;
|
||||
interface IGraphicBufferAllocator {
|
||||
android.hardware.media.c2.IGraphicBufferAllocator.Allocation allocate(in android.hardware.media.c2.IGraphicBufferAllocator.Description desc);
|
||||
boolean deallocate(in long id);
|
||||
android.hardware.media.c2.IGraphicBufferAllocator.WaitableFds getWaitableFds();
|
||||
parcelable Allocation {
|
||||
android.hardware.HardwareBuffer buffer;
|
||||
ParcelFileDescriptor fence;
|
||||
}
|
||||
parcelable Description {
|
||||
int width;
|
||||
int height;
|
||||
int format;
|
||||
long usage;
|
||||
}
|
||||
parcelable WaitableFds {
|
||||
ParcelFileDescriptor allocEvent;
|
||||
ParcelFileDescriptor statusEvent;
|
||||
}
|
||||
}
|
|
@ -17,12 +17,10 @@
|
|||
package android.hardware.media.c2;
|
||||
|
||||
import android.hardware.common.NativeHandle;
|
||||
import android.view.Surface;
|
||||
|
||||
import android.hardware.media.c2.IComponentInterface;
|
||||
import android.hardware.media.c2.IConfigurable;
|
||||
import android.hardware.media.c2.IGraphicBufferAllocator;
|
||||
import android.hardware.media.c2.WorkBundle;
|
||||
import android.hardware.media.c2.SurfaceSyncObj;
|
||||
|
||||
/**
|
||||
* Interface for an AIDL Codec2 component.
|
||||
|
@ -234,23 +232,15 @@ interface IComponent {
|
|||
void reset();
|
||||
|
||||
/**
|
||||
* Starts using a surface for output with a synchronization object
|
||||
* Specify an allocator for decoder output buffer from HAL.
|
||||
*
|
||||
* This method must not block.
|
||||
*
|
||||
* @param blockPoolId Id of the `C2BlockPool` to be associated with the
|
||||
* output surface.
|
||||
* @param surface Output surface.
|
||||
* @param syncObject synchronization object for buffer allocation between
|
||||
* Framework and Component.
|
||||
* @throws ServiceSpecificException with one of the following values:
|
||||
* - `Status::CANNOT_DO` - The component does not support an output surface.
|
||||
* - `Status::REFUSED` - The output surface cannot be accessed.
|
||||
* - `Status::TIMED_OUT` - The operation cannot be finished in a timely manner.
|
||||
* The method will be used once during the life-cycle of a codec instance.
|
||||
* @param allocator Decoder output buffer allocator from the client
|
||||
* @throws ServiceSpecificException with one of the following values
|
||||
* - `Status::CANNOT_DO` - The component does not support allocating from the client.
|
||||
* - `Status::CORRUPTED` - Some unknown error occurred.
|
||||
*/
|
||||
void setOutputSurface(in long blockPoolId, in Surface surface,
|
||||
in SurfaceSyncObj syncObject);
|
||||
void setDecoderOutputAllocator(in IGraphicBufferAllocator allocator);
|
||||
|
||||
/**
|
||||
* Starts the component.
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Copyright (C) 2023 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.c2;
|
||||
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
|
||||
/**
|
||||
* Interface for decoder output buffer allocator for HAL process
|
||||
*
|
||||
* A graphic buffer for decoder output is allocated by the interface.
|
||||
*/
|
||||
@VintfStability
|
||||
interface IGraphicBufferAllocator {
|
||||
/**
|
||||
* A graphic buffer allocation.
|
||||
*
|
||||
* buffer is in android.hardware.HardwareBuffer.
|
||||
* fence is provided in order to signal readiness of the buffer I/O inside
|
||||
* underlying Graphics subsystem. This is called a sync fence throughout Android framework.
|
||||
*/
|
||||
parcelable Allocation {
|
||||
HardwareBuffer buffer;
|
||||
ParcelFileDescriptor fence;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parameters for a graphic buffer allocation.
|
||||
*
|
||||
* Refer to AHardwareBuffer_Desc(libnativewindow) for details.
|
||||
*/
|
||||
parcelable Description {
|
||||
int width;
|
||||
int height;
|
||||
int format;
|
||||
long usage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a graphic buffer.
|
||||
*
|
||||
* @param desc Allocation parameters.
|
||||
* @return an android.hardware.HardwareBuffer which is basically same to
|
||||
* AHardwareBuffer. If underlying grpahics system is blocked, c2::Status::Blocked
|
||||
* will be returned. In this case getWaitableFds() will return file descriptors which
|
||||
* can be used to construct a waitable object. The waitable object will be notified
|
||||
* when underlying graphics system is unblocked
|
||||
* @throws ServiceSpecificException with one of the following values:
|
||||
* - `c2::Status::BAD_STATE` - The client is not in running states.
|
||||
* - `c2::Status::BLOCKED` - Underlying graphics system is blocked.
|
||||
* - `c2::Status::CORRUPTED` - Some unknown error occurred.
|
||||
*/
|
||||
Allocation allocate(in Description desc);
|
||||
|
||||
/**
|
||||
* De-allocate a graphic buffer by graphic buffer's unique id.
|
||||
*
|
||||
* @param id graphic buffer's unique id. See also AHardwareBuffer_getId().
|
||||
* @return {@code true} when de-allocate happened, {@code false} otherwise.
|
||||
*/
|
||||
boolean deallocate(in long id);
|
||||
|
||||
/**
|
||||
* Fds for waitable object events.
|
||||
*
|
||||
* Fds are created by eventfd() with semaphore mode.
|
||||
* For allocEvent, An integer counter regarding dequeuable buffer count is maintained
|
||||
* by client using read()/write() to the fd. The fd can be checked whether it is
|
||||
* readable via poll(). When in readable status, the specified counter is positive
|
||||
* so allocate/dequeue can happen.
|
||||
*
|
||||
* For statusEvent, the client can notify further allocation is not feasible.
|
||||
* e.g.) life-cycle of the underlying allocator is ended.
|
||||
*
|
||||
* C2Fence object should be implemented based on this Fds. Thus, C2Fence can return
|
||||
* either by allocation being ready or allocation being infeasible by the client status
|
||||
* change.
|
||||
*/
|
||||
parcelable WaitableFds {
|
||||
ParcelFileDescriptor allocEvent;
|
||||
ParcelFileDescriptor statusEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets waiable file descriptors.
|
||||
*
|
||||
* Use this method once and cache it in order not to create unnecessary duplicated fds.
|
||||
* The returned array will have two fds.
|
||||
*
|
||||
* If many waitable objects based on the same fd are competing, all watiable objects will be
|
||||
* notified. After being notified, they should invoke allocate(). At least one of them can
|
||||
* successfully allocate. Others not having an Allocation will have c2::Status::BLOCKED
|
||||
* as return value. They should wait again via waitable objects based on the fds which are
|
||||
* already returned from this interface.
|
||||
*
|
||||
* @return an fd array which will be wrapped to C2Fence and will be waited for
|
||||
* until allocating is unblocked.
|
||||
*/
|
||||
WaitableFds getWaitableFds();
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2022 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.c2;
|
||||
|
||||
import android.hardware.common.NativeHandle;
|
||||
/**
|
||||
* Surface(BufferQueue/IGBP) synchronization object regarding # of dequeued
|
||||
* output buffers. This keeps # of dequeued buffers from Surface less than
|
||||
* configured max # of dequeued buffers all the time.
|
||||
*/
|
||||
@VintfStability
|
||||
parcelable SurfaceSyncObj {
|
||||
/**
|
||||
* ASharedMemory for synchronization data. Layout is below
|
||||
*
|
||||
* |lock(futex) 4bytes|
|
||||
* |conditional_variable(futex) 4bytes|
|
||||
* |# of max dequeable buffer 4bytes|
|
||||
* |# of dequeued buffer 4bytes|
|
||||
* |Status of the surface 4bytes|
|
||||
* INIT = 0, Configuring surface is not finished.
|
||||
* ACTIVE = 1, Surface is ready to allocate(dequeue).
|
||||
* SWITCHING = 2, Switching to the new surface. It is blocked
|
||||
* to allocate(dequeue) a buffer until switching
|
||||
* completes.
|
||||
*/
|
||||
NativeHandle syncMemory;
|
||||
/**
|
||||
* BufferQueue id.
|
||||
*/
|
||||
long bqId;
|
||||
/**
|
||||
* Generation id.
|
||||
*/
|
||||
int generationId;
|
||||
/**
|
||||
* Consumer usage flags. See +ndk
|
||||
* libnativewindow#AHardwareBuffer_UsageFlags for possible values.
|
||||
*/
|
||||
long consumerUsage;
|
||||
}
|
Loading…
Reference in a new issue