#ifndef VIDDEC_PM_UTILS_BSTREAM_H
#define VIDDEC_PM_UTILS_BSTREAM_H

#include "viddec_pm_utils_list.h"

#define CUBBY_SIZE 1024
#define SCRATCH_SIZE 20
#define MIN_DATA     8

typedef struct
{
#ifdef VBP
  uint8_t *buf;
#else
    uint8_t buf[CUBBY_SIZE + 8 + MIN_DATA];/* extra 8 bytes for alignmet, extra 8 bytes for old data */
#endif
    uint32_t buf_st; /* start pos in buf */
    uint32_t buf_end; /* first invalid byte in buf */
    uint32_t buf_index; /* current index in buf */
    uint32_t buf_bitoff; /* bit offset in current index position */    
}viddec_pm_utils_bstream_buf_cxt_t;

typedef struct
{
    uint8_t  buf_scratch[SCRATCH_SIZE];/* scratch for boundary reads*/
    uint32_t st; /* start index of valid byte */
    uint32_t size;/* Total number of bytes in current buffer */
    uint32_t bitoff; /* bit offset in first valid byte */
}viddec_pm_utils_bstream_scratch_cxt_t;

typedef struct
{
#ifdef VBP
	/* counter of emulation prevention byte */
	uint32_t emulation_byte_counter;
#endif	
    /* After First pass of scan we figure out how many bytes are in the current access unit(N bytes). We store
       the bstream buffer's first valid byte index wrt to accessunit in this variable */
    uint32_t au_pos;
    /* This is for keeping track of which list item was used to load data last */
    uint32_t list_off;
    /* This is for tracking emulation prevention bytes */
    uint32_t phase;
    /* This flag tells us whether to look for emulation prevention or not */
    uint32_t is_emul_reqd;
    /* A pointer to list of es buffers which contribute to current access unit */
    viddec_pm_utils_list_t *list;
    /* scratch buffer to stage data on boundaries and reloads */
    viddec_pm_utils_bstream_scratch_cxt_t scratch;
    /* Actual context which has valid data for get bits functionality */
    viddec_pm_utils_bstream_buf_cxt_t bstrm_buf;
}viddec_pm_utils_bstream_cxt_t;

void viddec_pm_utils_bstream_init(viddec_pm_utils_bstream_cxt_t *cxt, viddec_pm_utils_list_t *list, uint32_t is_emul);

int32_t viddec_pm_utils_bstream_skipbits(viddec_pm_utils_bstream_cxt_t *cxt, uint32_t num_bits);

int32_t viddec_pm_utils_bstream_peekbits(viddec_pm_utils_bstream_cxt_t *cxt, uint32_t *out, uint32_t num_bits, uint8_t skip);

int32_t viddec_pm_utils_bstream_get_current_byte(viddec_pm_utils_bstream_cxt_t *cxt, uint8_t *byte);

uint8_t viddec_pm_utils_bstream_nomoredata(viddec_pm_utils_bstream_cxt_t *cxt);

uint8_t viddec_pm_utils_bstream_nomorerbspdata(viddec_pm_utils_bstream_cxt_t *cxt);

void viddec_pm_utils_skip_if_current_is_emulation(viddec_pm_utils_bstream_cxt_t *cxt);

/*
  This function gets bit and byte position of where we are in the current AU. We always return the position of next byte to be
  read.
  is_emul on true indicates we are on second zero byte in emulation prevention sequence.
 */
static inline void viddec_pm_utils_bstream_get_au_offsets(viddec_pm_utils_bstream_cxt_t *cxt, uint32_t *bit, uint32_t *byte, uint8_t *is_emul)
{
    uint32_t phase=cxt->phase;

    *bit = cxt->bstrm_buf.buf_bitoff;
    *byte = cxt->au_pos + (cxt->bstrm_buf.buf_index - cxt->bstrm_buf.buf_st);
    if(cxt->phase > 0)
    {
        phase = phase - ((cxt->bstrm_buf.buf_bitoff != 0)? 1: 0 );
    }
    /* Assumption: we will never be parked on 0x3 byte of emulation prevention sequence */
    *is_emul = (cxt->is_emul_reqd) && (phase > 0) &&
        (cxt->bstrm_buf.buf[cxt->bstrm_buf.buf_index] == 0) && 
        (cxt->bstrm_buf.buf[cxt->bstrm_buf.buf_index+1] == 0x3);
}
#endif
