Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c9e7848 authored by Pawin Vongmasa's avatar Pawin Vongmasa
Browse files

Revert to new Codec2 HAL

This includes the following changes:
1. Revert commit 7570e3cd.
2. Revert commit 2a40d309b7eefe36d2f78bbff42aafad24eb65b0.
3. Use the new bufferpool (@2.0).
4. Use the old bufferqueue (@1.0).
5. Add IInputSink to eliminate downcasting from IBase.

Test: Builds
Bug: 112362730
Change-Id: I2b5f2e2821c62cbb7166320e1e128d883e278480
parent e8ef7232
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ hidl_interface {
        "IComponentListener.hal",
        "IComponentStore.hal",
        "IConfigurable.hal",
        "IInputSink.hal",
        "IInputSurface.hal",
        "IInputSurfaceConnection.hal",
    ],
+186 −150
Original line number Diff line number Diff line
@@ -22,13 +22,19 @@ import android.hardware.media.omx@1.0::IGraphicBufferSource;
import IConfigurable;
import IComponentInterface;
import IComponentListener;
import IInputSurface;
import IInputSurfaceConnection;

/**
 * Interface for a Codec 2.0 component corresponding to API level 1.0 or
 * below. Components have two states: stopped and running. The running
 * state has three sub-states: executing, tripped and error.
 * Interface for a Codec2 component corresponding to API level 1.0 or below.
 * Components have two states: stopped and running. The running state has three
 * sub-states: executing, tripped and error.
 *
 * All methods in `IComponent` must not block. If a method call cannot be
 * completed in a timely manner, it must return `TIMED_OUT` in the return
 * status.
 */
interface IComponent extends IComponentInterface {
interface IComponent {

    // METHODS AVAILABLE WHEN RUNNING
    // =========================================================================
@@ -38,44 +44,42 @@ interface IComponent extends IComponentInterface {
     *
     * This method must be supported in running (including tripped) states.
     *
     * This method must return within 1ms
     *
     * It is acceptable for this method to return OK and return an error value
     * using the onWorkDone() callback.
     * It is acceptable for this method to return `OK` and return an error value
     * using the IComponentListener::onWorkDone() callback.
     *
     * @param workBundle WorkBundle object containing Works to queue to the
     * component.
     * @param workBundle `WorkBundle` object containing a list of `Work` objects
     *     to queue to the component.
     * @return status Status of the call, which may be
     *   - OK        - Works in \p workBundle were successfully queued.
     *   - BAD_INDEX - Some component(s) in some Work do(es) not exist.
     *   - CANNOT_DO - The components are not tunneled.
     *   - NO_MEMORY - Not enough memory to queue \p workBundle.
     *   - CORRUPTED - Some unknown error prevented queuing the Works.
     *                 (unexpected).
     *   - `OK`        - Works in @p workBundle were successfully queued.
     *   - `BAD_INDEX` - Some component id in some `Worklet` is not valid.
     *   - `CANNOT_DO` - The components are not tunneled but some `Work` object
     *                   contains tunneling information.
     *   - `NO_MEMORY` - Not enough memory to queue @p workBundle.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    queue(WorkBundle workBundle) generates (Status status);

    /**
     * Discards and abandons any pending work for the component.
     * Discards and abandons any pending `Work` items for the component.
     *
     * This method must be supported in running (including tripped) states.
     *
     * This method must return within 5ms.
     *
     * Work that could be immediately abandoned/discarded must be returned in
     * \p flushedWorks; this can be done in an arbitrary order.
     * `Work` that could be immediately abandoned/discarded must be returned in
     * @p flushedWorkBundle. The order in which queued `Work` items are
     * discarded can be arbitrary.
     *
     * Work that could not be abandoned or discarded immediately must be marked
     * to be discarded at the earliest opportunity, and must be returned via
     * the onWorkDone() callback. This must be completed within 500ms.
     * `Work` that could not be abandoned or discarded immediately must be
     * marked to be discarded at the earliest opportunity, and must be returned
     * via IComponentListener::onWorkDone(). This must be completed within
     * 500ms.
     *
     * @return status Status of the call, which may be
     *   - OK        - The component has been successfully flushed.
     *   - TIMED_OUT - The flush could not be completed within the time limit.
     *                 (unexpected)
     *   - CORRUPTED - Some unknown error prevented flushing from
     *                 completion. (unexpected)
     * @return flushedWorkBundle WorkBundle object containing flushed Works.
     *   - `OK`        - The component has been successfully flushed.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     * @return flushedWorkBundle `WorkBundle` object containing flushed `Work`
     *     items.
     */
    flush(
        ) generates (
@@ -87,42 +91,39 @@ interface IComponent extends IComponentInterface {
     * Drains the component, and optionally downstream components. This is a
     * signalling method; as such it does not wait for any work completion.
     *
     * Marks last work item as "drain-till-here", so component is notified not
     * to wait for further work before it processes work already queued. This
     * method can also be used to set the end-of-stream flag after work has been
     * queued. Client can continue to queue further work immediately after this
     * method returns.
     * The last `Work` item is marked as "drain-till-here", so the component is
     * notified not to wait for further `Work` before it processes what is
     * already queued. This method can also be used to set the end-of-stream
     * flag after `Work` has been queued. Client can continue to queue further
     * `Work` immediately after this method returns.
     *
     * This method must be supported in running (including tripped) states.
     *
     * This method must return within 1ms.
     *
     * Work that is completed must be returned via the onWorkDone() callback.
     * `Work` that is completed must be returned via
     * IComponentListener::onWorkDone().
     *
     * @param withEos Whether to drain the component with marking end-of-stream.
     * @return status Status of the call, which may be
     *   - OK        - The drain request has been successfully recorded.
     *   - TIMED_OUT - The flush could not be completed within the time limit.
     *                 (unexpected)
     *   - CORRUPTED - Some unknown error prevented flushing from completion.
     *                 (unexpected)
     *   - `OK`        - The drain request has been successfully recorded.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    drain(bool withEos) generates (Status status);

    /**
     * Starts using a surface for output.
     *
     * @param blockPoolId The id of the BlockPool to be associated with the
     * This method must not block.
     *
     * @param blockPoolId Id of the `C2BlockPool` to be associated with the
     *     output surface.
     * @param surface A surface to use for codec output.
     * @param surface Output surface.
     * @return status Status of the call, which may be
     *   - OK        - The operation completed successfully.
     *   - CANNOT_DO - The component does not support an output surface.
     *   - REFUSED   - The output surface cannot be accessed.
     *   - TIMED_OUT - The component could not be connected within the time
     *                 limit. (unexpected)
     *   - CORRUPTED - Some unknown error prevented connecting the component.
     *                 (unexpected)
     *   - `OK`        - The operation completed successfully.
     *   - `CANNOT_DO` - The component does not support an output surface.
     *   - `REFUSED`   - The output surface cannot be accessed.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    setOutputSurface(
            uint64_t blockPoolId,
@@ -132,65 +133,101 @@ interface IComponent extends IComponentInterface {
        );

    /**
     * Starts using a persistent OMX input surface for a component.
     * Starts using an input surface.
     *
     * The component must be in running state.
     *
     * @param producer Producer component of an OMX persistent input surface.
     * @param source Source component of an OMX persistent input surface.
     * @param inputSurface Input surface to connect to.
     * @return status Status of the call, which may be
     *   - OK        - The operation completed successfully.
     *   - CANNOT_DO - The component does not support an input surface.
     *   - BAD_STATE - Component is not in running state.
     *   - DUPLICATE - The component is already connected to an input surface.
     *   - REFUSED   - The input surface is already in use.
     *   - NO_MEMORY - Not enough memory to start the component.
     *   - TIMED_OUT - The component could not be connected within the time
     *                 limit. (unexpected)
     *   - CORRUPTED - Some unknown error prevented connecting the component.
     *                 (unexpected)
     *   - `OK`        - The operation completed successfully.
     *   - `CANNOT_DO` - The component does not support an input surface.
     *   - `BAD_STATE` - The component is not in running state.
     *   - `DUPLICATE` - The component is already connected to an input surface.
     *   - `REFUSED`   - The input surface is already in use.
     *   - `NO_MEMORY` - Not enough memory to start the component.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     * @return connection `IInputSurfaceConnection` object, which can be used to
     *     query and configure properties of the connection. This cannot be
     *     null.
     */
    connectToInputSurface(
            IInputSurface inputSurface
        ) generates (
            Status status,
            IInputSurfaceConnection connection
        );

    /**
     * Starts using an OMX input surface.
     *
     * The component must be in running state.
     *
     * This method is similar to connectToInputSurface(), but it takes an OMX
     * input surface (as a pair of `IGraphicBufferProducer` and
     * `IGraphicBufferSource`) instead of Codec2's own `IInputSurface`.
     *
     * @param producer Producer component of an OMX input surface.
     * @param source Source component of an OMX input surface.
     * @return status Status of the call, which may be
     *   - `OK`        - The operation completed successfully.
     *   - `CANNOT_DO` - The component does not support an OMX input surface.
     *   - `BAD_STATE` - The component is not in running state.
     *   - `DUPLICATE` - The component is already connected to an input surface.
     *   - `REFUSED`   - The input surface is already in use.
     *   - `NO_MEMORY` - Not enough memory to start the component.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     * @return connection `IInputSurfaceConnection` object, which can be used to
     *     query and configure properties of the connection. This cannot be
     *     null.
     */
    connectToOmxInputSurface(
            IGraphicBufferProducer producer,
            IGraphicBufferSource source
        ) generates (Status status);
        ) generates (
            Status status,
            IInputSurfaceConnection connection
        );

    /**
     * Stops using an input surface.
     *
     * This call is used for both Codec 2.0 and OMX input surfaces.
     *
     * The component must be in running state.
     *
     * @return status Status of the call, which may be
     *   - OK        - The operation completed successfully.
     *   - CANNOT_DO - The component does not support an input surface.
     *   - BAD_STATE - Component is not in running state.
     *   - NOT_FOUND - The component is not connected to an input surface.
     *   - TIMED_OUT - The component could not be connected within the time
     *                 limit. (unexpected)
     *   - CORRUPTED - Some unknown error prevented connecting the component.
     *                 (unexpected)
     *   - `OK`        - The operation completed successfully.
     *   - `CANNOT_DO` - The component does not support an input surface.
     *   - `BAD_STATE` - The component is not in running state.
     *   - `NOT_FOUND` - The component is not connected to an input surface.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    disconnectFromInputSurface() generates (Status Status);

    /**
     * Creates a local block pool backed by the given allocator and returns its
     * identifier.
     * Creates a local `C2BlockPool` backed by the given allocator and returns
     * its id.
     *
     * The returned @p blockPoolId is the only way the client can refer to a
     * `C2BlockPool` object in the component. The id can be passed to
     * setOutputSurface() or used in some C2Param objects later.
     *
     * This call must return within 100 msec.
     * The created `C2BlockPool` object can be destroyed by calling
     * destroyBlockPool(), reset() or release(). reset() and release() must
     * destroy all `C2BlockPool` objects that have been created.
     *
     * @param allocatorId The Codec 2.0 allocator ID
     * @param allocatorId Id of a `C2Allocator`.
     * @return status Status of the call, which may be
     *   - OK        - The operation completed successfully.
     *   - NO_MEMORY - Not enough memory to create the pool.
     *   - BAD_VALUE - Invalid allocator.
     *   - TIMED_OUT - The pool could not be created within the time
     *                 limit. (unexpected)
     *   - CORRUPTED - Some unknown error prevented creating the pool.
     *                 (unexpected)
     * @return blockPoolId The Codec 2.0 blockpool ID for the created pool.
     * @return configurable Configuration interface for the created pool.
     *   - `OK`        - The operation completed successfully.
     *   - `NO_MEMORY` - Not enough memory to create the pool.
     *   - `BAD_VALUE` - @p allocatorId is not recognized.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     * @return blockPoolId Id of the created C2BlockPool object. This may be
     *     used in setOutputSurface() if the allocator
     * @return configurable Configuration interface for the created pool. This
     *     must not be null.
     */
    createBlockPool(uint32_t allocatorId) generates (
        Status status,
@@ -201,17 +238,13 @@ interface IComponent extends IComponentInterface {
    /**
     * Destroys a local block pool previously created by createBlockPool().
     *
     * This call must return within 100 msec.
     *
     * @param blockPoolId The block pool id previously returned by
     * @param blockPoolId Id of a `C2BlockPool` that was previously returned by
     *      createBlockPool().
     * @return status Status of the call, which may be
     *   - OK        - The operation completed successfully.
     *   - NOT_FOUND - The supplied blockPoolId is not valid.
     *   - TIMED_OUT - The pool could not be destroyedwithin the time limit.
     *                 (unexpected)
     *   - CORRUPTED - Some unknown error prevented destruction of the pool.
     *                 (unexpected)
     *   - `OK`        - The operation completed successfully.
     *   - `NOT_FOUND` - The supplied blockPoolId is not valid.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    destroyBlockPool(uint64_t blockPoolId) generates (Status status);

@@ -223,28 +256,24 @@ interface IComponent extends IComponentInterface {
     *
     * This method must be supported in stopped state as well as tripped state.
     *
     * If the return value is OK, the component must be in the running state.
     * If the return value is BAD_STATE or DUPLICATE, no state change is
     * expected as a response to this call.
     * Otherwise, the component must be in the stopped state.
     * If the return value is `OK`, the component must be in the running state.
     * If the return value is `BAD_STATE` or `DUPLICATE`, no state change is
     * expected as a response to this call. Otherwise, the component must be in
     * the stopped state.
     *
     * If a component is in the tripped state and start() is called while the
     * component configuration still results in a trip, start must succeed and
     * a new onTripped callback must be used to communicate the configuration
     * component configuration still results in a trip, start() must succeed and
     * a new onTripped() callback must be used to communicate the configuration
     * conflict that results in the new trip.
     *
     * This method must return within 500ms.
     *
     * @return status Status of the call, which may be
     *   - OK        - The component has started successfully.
     *   - BAD_STATE - Component is not in stopped or tripped state.
     *   - DUPLICATE - When called during another start call from another
     *   - `OK`        - The component has started successfully.
     *   - `BAD_STATE` - Component is not in stopped or tripped state.
     *   - `DUPLICATE` - When called during another start call from another
     *                   thread.
     *   - NO_MEMORY - Not enough memory to start the component.
     *   - TIMED_OUT - The component could not be started within the time limit.
     *                 (unexpected)
     *   - CORRUPTED - Some unknown error prevented starting the component.
     *                 (unexpected)
     *   - `NO_MEMORY` - Not enough memory to start the component.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    start() generates (Status status);

@@ -255,22 +284,22 @@ interface IComponent extends IComponentInterface {
     *
     * This method must return withing 500ms.
     *
     * Upon this call, all pending work must be abandoned.
     * If the return value is BAD_STATE or DUPLICATE, no state change is
     * expected as a response to this call.
     * For all other return values, the component must be in the stopped state.
     * Upon this call, all pending `Work` must be abandoned.
     *
     * If the return value is `BAD_STATE` or `DUPLICATE`, no state change is
     * expected as a response to this call. For all other return values, the
     * component must be in the stopped state.
     *
     * This does not alter any settings and tunings that may have resulted in a
     * tripped state.
     *
     * @return status Status of the call, which may be
     *   - OK        - The component has stopped successfully.
     *   - BAD_STATE - Component is not in running state.
     *   - DUPLICATE - When called during another stop call from another thread.
     *   - TIMED_OUT - The component could not be stopped within the time limit.
     *                 (unexpected)
     *   - CORRUPTED - Some unknown error prevented starting the component.
     *                 (unexpected)
     *   - `OK`        - The component has stopped successfully.
     *   - `BAD_STATE` - Component is not in running state.
     *   - `DUPLICATE` - When called during another stop call from another
     *                   thread.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    stop() generates (Status status);

@@ -284,25 +313,24 @@ interface IComponent extends IComponentInterface {
     *
     * This method must return withing 500ms.
     *
     * After this call returns all work must have been abandoned, all references
     * must have been released.
     * When this call returns, if @p status is `OK`, all `Work` items must
     * have been abandoned, and all resources (including `C2BlockPool` objects
     * previously created by createBlockPool()) must have been released.
     *
     * If the return value is BAD_STATE or DUPLICATE, no state change is
     * expected as a response to this call.
     * For all other return values, the component shall be in the stopped state.
     * If the return value is `BAD_STATE` or `DUPLICATE`, no state change is
     * expected as a response to this call. For all other return values, the
     * component must be in the stopped state.
     *
     * This brings settings back to their default - "guaranteeing" no tripped
     * This brings settings back to their default, "guaranteeing" no tripped
     * state.
     *
     * @return status Status of the call, which may be
     *   - OK        - The component has been reset.
     *   - BAD_STATE - Component is in released state.
     *   - DUPLICATE - When called during another reset call from another
     *   - `OK`        - The component has been reset.
     *   - `BAD_STATE` - Component is in released state.
     *   - `DUPLICATE` - When called during another reset call from another
     *                   thread.
     *   - TIMED_OUT - The component could not be reset within the time limit.
     *                 (unexpected)
     *   - CORRUPTED - Some unknown error prevented resetting the component.
     *                 (unexpected)
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    reset() generates (Status status);

@@ -311,19 +339,27 @@ interface IComponent extends IComponentInterface {
     *
     * This method must be supported in stopped state.
     *
     * This method must return withing 500ms. Upon return all references must
     * be abandoned.
     * This method destroys the component. Upon return, if @p status is `OK` or
     * `DUPLICATE`, all resources must have been released.
     *
     * @return status Status of the call, which may be
     *   - OK        - The component has been released.
     *   - BAD_STATE - The component is running.
     *   - DUPLICATE - The component is already released.
     *   - TIMED_OUT - The component could not be released within the time
     *                 limit. (unexpected)
     *   - CORRUPTED - Some unknown error prevented releasing the component.
     *                 (unexpected)
     *   - `OK`        - The component has been released.
     *   - `BAD_STATE` - The component is running.
     *   - `DUPLICATE` - The component is already released.
     *   - `TIMED_OUT` - The operation cannot be finished in a timely manner.
     *   - `CORRUPTED` - Some unknown error occurred.
     */
    release() generates (Status status);

    /**
     * Returns the @ref IComponentInterface instance associated to this
     * component.
     *
     * An @p IConfigurable instance for the component can be obtained by calling
     * IComponentInterface::getConfigurable() on the returned @p intf.
     *
     * @return intf `IComponentInterface` instance. This must not be null.
     */
    getInterface() generates (IComponentInterface intf);
};
+11 −12
Original line number Diff line number Diff line
@@ -19,21 +19,20 @@ package android.hardware.media.c2@1.0;
import IConfigurable;

/**
 * Component interface object. This object contains all of the configuration of
 * Component interface object. This object contains all of the configurations of
 * a potential or actual component. It can be created and used independently of
 * an actual Codec 2.0 component instance to query support and parameters for
 * various component settings and configurations for a potential component.
 * Actual components also expose this interface.
 */
interface IComponentInterface extends IConfigurable {
    /*
     * There are no additional methods to IConfigurable interface.
 * an actual Codec2 component to query supported parameters for various
 * component settings, and configurations for a potential component.
 *
     * Component interfaces have no states.
 * An actual component exposes this interface via IComponent::getInterface().
 */
interface IComponentInterface {
    /**
     * Returns the @ref IConfigurable instance associated to this component
     * interface.
     *
     * The name of the component or component interface object is a unique name
     * for that component or component interface 'class'; however, multiple
     * instances of that component must have the same name.
     * @return configurable `IConfigurable` instance. This must not be null.
     */
    getConfigurable() generates (IConfigurable configurable);
};
Loading