blob: 51ef4e1dd3d7c98b259050d14313b1afb5386213 [file] [log] [blame]
/*
* 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.c2@1.0;
import android.hardware.graphics.bufferqueue@1.0::IGraphicBufferProducer;
import android.hardware.graphics.bufferqueue@2.0::IGraphicBufferProducer;
import android.hardware.media.omx@1.0::IGraphicBufferSource;
import IConfigurable;
import IComponentInterface;
import IComponentListener;
import IInputSink;
import IInputSurface;
import IInputSurfaceConnection;
/**
* 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 {
// METHODS AVAILABLE WHEN RUNNING
// =========================================================================
/**
* Queues up work for the component.
*
* This method must be supported in running (including tripped) states.
*
* It is acceptable for this method to return `OK` and return an error value
* using the IComponentListener::onWorkDone() callback.
*
* @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 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` items for the component.
*
* This method must be supported in running (including tripped) states.
*
* `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 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 operation cannot be finished in a timely manner.
* - `CORRUPTED` - Some unknown error occurred.
* @return flushedWorkBundle `WorkBundle` object containing flushed `Work`
* items.
*/
flush(
) generates (
Status status,
WorkBundle flushedWorkBundle
);
/**
* Drains the component, and optionally downstream components. This is a
* signalling method; as such it does not wait for any work completion.
*
* 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.
*
* `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 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.
*
* This method must not block.
*
* @param blockPoolId Id of the `C2BlockPool` to be associated with the
* output surface.
* @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 operation cannot be finished in a timely manner.
* - `CORRUPTED` - Some unknown error occurred.
*/
setOutputSurface(
uint64_t blockPoolId,
@2.0::IGraphicBufferProducer surface
) generates (
Status status
);
/**
* Starts using an input surface.
*
* The component must be in running state.
*
* @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` - 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(
@1.0::IGraphicBufferProducer producer,
IGraphicBufferSource source
) generates (
Status status,
IInputSurfaceConnection connection
);
/**
* Stops using an input surface.
*
* 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` - 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 `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.
*
* 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 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` - @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,
uint64_t blockPoolId,
IConfigurable configurable
);
/**
* Destroys a local block pool previously created by createBlockPool().
*
* @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 operation cannot be finished in a timely manner.
* - `CORRUPTED` - Some unknown error occurred.
*/
destroyBlockPool(uint64_t blockPoolId) generates (Status status);
// STATE CHANGE METHODS
// =========================================================================
/**
* Starts the component.
*
* 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 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
* conflict that results in the new trip.
*
* @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
* thread.
* - `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);
/**
* Stops the component.
*
* This method must be supported in running (including tripped) state.
*
* 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.
*
* 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 operation cannot be finished in a timely manner.
* - `CORRUPTED` - Some unknown error occurred.
*/
stop() generates (Status status);
/**
* Resets the component.
*
* This method must be supported in all (including tripped) states other
* than released.
*
* This method must be supported during any other blocking call.
*
* This method must return withing 500ms.
*
* 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 must be in the stopped state.
*
* 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
* thread.
* - `TIMED_OUT` - The operation cannot be finished in a timely manner.
* - `CORRUPTED` - Some unknown error occurred.
*/
reset() generates (Status status);
/**
* Releases the component.
*
* This method must be supported in stopped state.
*
* 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 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 @ref 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);
/**
* Returns an @ref IInputSink instance that has the component as the
* underlying implementation.
*
* @return sink `IInputSink` instance.
*/
asInputSink() generates (IInputSink sink);
};