blob: 8473595eca645759175a486b2dbe16afa985f066 [file] [log] [blame]
/*
* Copyright (C) 2015 - 2017 Intel Corporation.
*
* 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 _IA_IPF_H_
#define _IA_IPF_H_
/** @file ia_ipf.h
*
*/
#include <stdarg.h>
#include "ia_types.h"
#include "ia_ipf_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Pipe Line Header Information
*/
/**
* unique identifier for a buffer in the pipe line
*/
typedef struct {
ia_ipf_engine *engine; /**< */
int32_t index; /**< output index : for a provider the index ranges {0,M-1} for M outputs */
int32_t nesting_index; /**< output index to accommodates nesting levels for arrays */
ia_ipf_buffer_owner owner; /**< Indicator of the buffer owner - The owner can be a user app */
} ia_ipf_pipe_engine_input;
/**
* container structure for identifiers of one or multiple buffers involved in the pipe line
*/
typedef struct {
ia_ipf_pipe_engine_input *connection;
int32_t num_connections;
} ia_ipf_pipe_engine_input_container;
/**
* unique identifier for a buffer in the pipe line
*/
typedef struct {
int32_t index; /**< output index : for a provider the index ranges {0,M-1} for M outputs */
int32_t nesting_index; /**< output index to accommodates nesting levels for arrays */
int32_t num_users;
int32_t time_to_live;
} ia_ipf_pipe_engine_output;
/**
* container structure for identifiers of one or multiple buffers involved in the pipe line
*/
typedef struct {
ia_ipf_pipe_engine_output *connection;
int32_t num_connections;
} ia_ipf_pipe_engine_output_container;
/**
* Enum for states for io conn in the pipe line
*/
typedef enum {
ia_ipf_pipe_io_state_uninit,
ia_ipf_pipe_io_state_pipe_io,
ia_ipf_pipe_io_state_buf_list,
ia_ipf_pipe_io_state_eng_init,
ia_ipf_pipe_io_state_eng_execute,
ia_ipf_pipe_io_state_eng_destroy,
ia_ipf_pipe_io_state_buf_list_dealloc,
ia_ipf_pipe_io_state_pipe_io_dealloc,
} ia_ipf_pipe_io_state;
/**
* Enum for states of the pipe line
*/
typedef enum {
ia_ipf_pipe_state_uninit,
ia_ipf_pipe_state_created,
ia_ipf_pipe_state_finalized,
ia_ipf_pipe_state_processed,
ia_ipf_pipe_state_eng_init,
ia_ipf_pipe_state_eng_init_done,
ia_ipf_pipe_state_eng_exec,
ia_ipf_pipe_state_eng_exec_done,
ia_ipf_pipe_state_destroy,
} ia_ipf_pipe_state;
/**
* Declare IPF pipeline structure
*/
typedef struct ia_ipf_pipe_t ia_ipf_pipe;
/**
* creation routine for a pipe line
*/
ia_err
ia_ipf_pipe_create ( const char *name, int num_engines, ia_ipf_pipe **pipe);
/**
* add engine to a pipe line
* inputs:
* 1. pipe line
* 2. engine to be added
* 3. container structure for buffer identifiers
* : this is sufficient to specify all input buffer connectivity for the engine
* outputs:
* engine_id
* : every engine on addition to the pipeline is assigned a unique engine ID which serially increments from 1
* return:
* error value
*/
ia_err
ia_ipf_pipe_add_engine (ia_ipf_pipe *pipe, ia_ipf_engine *engine, ia_ipf_pipe_engine_input_container *inputs);
/**
* set user input to a pipe line
* inputs:
* 1. pipe line
* 2. container structure for buffer identifiers
* : this lists all the buffer identifiers that exists in the pipeline which are provided by the user
* application as the input to the pipe line
* 3. container structure for input buffers
* : this specifies the actual input buffer with input data that is the user input to the pipeline that will be
* linked to the unique buffer identifiers that exists in the pipeline
* return:
* error value
*/
ia_err
ia_ipf_pipe_set_input (ia_ipf_pipe *pipe, ia_ipf_engine *engine,
ia_ipf_buffer_list *output_buffers);
/**
* Init engines in the pipeline
*/
void
ia_ipf_pipe_init_engines (ia_ipf_pipe *pipe);
/**
* execute the pipe line
* inputs:
* 1. pipe line
* outputs:
* 1. output type (void **)
* return:
* error value
*/
ia_err
ia_ipf_pipe_execute_engines (ia_ipf_pipe *pipe,
ia_ipf_buffer_list **output_buffers);
/**
* destroy the pipe line
* inputs:
* 1. pipe line
* return:
* error value
*/
ia_err
ia_ipf_pipe_destroy (ia_ipf_pipe *pipe );
/**
* IPF helper - create an identifier for a buffer
*/
ia_err
ia_ipf_pipe_engine_input_container_create (ia_ipf_pipe_engine_input_container **engine_input_container,
ia_ipf_engine *engine,
int32_t src_index, int32_t src_subindex,
int32_t dest_index, int32_t dest_subindex,
int32_t num_connects);
/**
* IPF helper - adds a identifier for a buffer to container
*/
ia_err
ia_ipf_pipe_engine_input_container_add (ia_ipf_pipe_engine_input_container *engine_input_container,
ia_ipf_engine *engine,
int32_t src_index, int32_t src_subindex,
int32_t dest_index, int32_t dest_subindex);
#ifdef __cplusplus
}
#endif
#endif /* _IA_IPF_H_ */