blob: 0e650d5e097c675b42b6b7e260a39863836d5ca1 [file] [log] [blame]
#ifndef VIDDEC_PM_COMMON_LIST_H
#define VIDDEC_PM_COMMON_LIST_H
/* Limitation:This is the maximum numbers of es buffers between start codes. Needs to change if we encounter
a case if this is not sufficent */
#ifdef VBP
#define MAX_IBUFS_PER_SC 512
#else
#define MAX_IBUFS_PER_SC 64
#endif
/* This structure is for storing information on byte position in the current access unit.
stpos is the au byte index of first byte in current es buffer.edpos is the au byte index+1 of last
valid byte in current es buffer.*/
typedef struct
{
uint32_t stpos;
uint32_t edpos;
} viddec_pm_utils_au_bytepos_t;
/* this structure is for storing all necessary information for list handling */
typedef struct
{
uint16_t num_items; /* Number of buffers in List */
uint16_t first_scprfx_length; /* Length of first sc prefix in this list */
int32_t start_offset; /* starting offset of unused data including sc prefix in first buffer */
int32_t end_offset; /* Offset of unsused data in last buffer including 2nd sc prefix */
//viddec_input_buffer_t sc_ibuf[MAX_IBUFS_PER_SC]; /* Place to store buffer descriptors */
viddec_pm_utils_au_bytepos_t data[MAX_IBUFS_PER_SC]; /* place to store au byte positions */
int32_t total_bytes; /* total bytes for current access unit including first sc prefix*/
} viddec_pm_utils_list_t;
/* This function initialises the list to default values */
void viddec_pm_utils_list_init(viddec_pm_utils_list_t *cxt);
#ifndef VBP
/* This function adds a new entry to list and will emit tags if needed */
uint32_t viddec_pm_utils_list_addbuf(viddec_pm_utils_list_t *list, viddec_input_buffer_t *es_buf);
/* This function updates au byte position of the current list. This should be called after sc codes are detected and before
syntax parsing as get bits requires this to be initialized. */
void viddec_pm_utils_list_updatebytepos(viddec_pm_utils_list_t *list, uint8_t sc_prefix_length);
/* This function walks through the list and removes consumed buffers based on total bytes. It then moves
unused entires to the top of list. */
void viddec_pm_utils_list_remove_used_entries(viddec_pm_utils_list_t *list, uint32_t length);
/* this function returns 1 if the requested byte is not found. If found returns list and offset into list */
uint32_t viddec_pm_utils_list_getbyte_position(viddec_pm_utils_list_t *list, uint32_t byte, uint32_t *list_index, uint32_t *offset);
#endif
#endif