
#include "viddec_pm.h"
#include "viddec_fw_debug.h"
#include "viddec_parser_ops.h"
#include "viddec_emitter.h"
#include "viddec_fw_workload.h"
#include "viddec_pm_utils_bstream.h"

extern void viddec_pm_utils_list_emit_pixel_tags(viddec_pm_utils_list_t *list, uint32_t start, viddec_emitter *emitter, uint32_t using_next);
extern void viddec_pm_utils_list_emit_slice_tags(viddec_pm_utils_list_t *list, uint32_t start, uint32_t end, viddec_emitter *emitter, uint32_t is_cur_wkld, viddec_workload_item_t *wi);

int32_t viddec_pm_get_bits(void *parent, uint32_t *data, uint32_t num_bits)
{
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;
    ret = viddec_pm_utils_bstream_peekbits(&(cxt->getbits), data, num_bits, 1);
    if(ret == -1)
    {DEB("FAILURE!!!! getbits returned %d\n", ret);}

    return ret;
}

int32_t viddec_pm_peek_bits(void *parent, uint32_t *data, uint32_t num_bits)
{
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;    
    ret = viddec_pm_utils_bstream_peekbits(&(cxt->getbits), data, num_bits, 0);
    return ret;
}

int32_t viddec_pm_skip_bits(void *parent, uint32_t num_bits)
{
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;
    ret = viddec_pm_utils_bstream_skipbits(&(cxt->getbits), num_bits);
    return ret;
}

int32_t viddec_pm_append_workitem(void *parent, viddec_workload_item_t *item, uint32_t next)
{
#ifndef VBP
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;
    viddec_emitter_wkld *emit;
    
    cxt = (viddec_pm_cxt_t *)parent;
    emit = (next) ? &(cxt->emitter.next) : &(cxt->emitter.cur);
    ret = viddec_emit_append(emit, item);
    return ret;
#else
	return 1;
#endif
}

int32_t viddec_pm_get_au_pos(void *parent, uint32_t *bit, uint32_t *byte, uint8_t *is_emul)
{
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;
    viddec_pm_utils_skip_if_current_is_emulation(&(cxt->getbits));
    viddec_pm_utils_bstream_get_au_offsets(&(cxt->getbits), bit, byte, is_emul);

    return ret;
    
}

static inline int32_t viddec_pm_append_restof_pixel_data(void *parent, uint32_t cur_wkld)
{
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;
    uint32_t start=0, b_off=0;
    uint8_t emul=0;
    viddec_workload_item_t wi;
    
    cxt = (viddec_pm_cxt_t *)parent;
    viddec_pm_utils_skip_if_current_is_emulation(&(cxt->getbits));
    viddec_pm_utils_bstream_get_au_offsets(&(cxt->getbits), &b_off, &start, &emul);
    if(emul) start--;

    wi.vwi_type = VIDDEC_WORKLOAD_PIXEL_ES;
    wi.es.es_flags = 0;
    viddec_pm_utils_list_emit_slice_tags(&(cxt->list), start, cxt->list.total_bytes -1, &(cxt->emitter), cur_wkld, &wi);
    return ret;
}

int32_t viddec_pm_append_pixeldata(void *parent)
{
    return viddec_pm_append_restof_pixel_data(parent,  1);
}

int32_t viddec_pm_append_pixeldata_next(void *parent)
{
    return viddec_pm_append_restof_pixel_data(parent,  0);
}

viddec_workload_t* viddec_pm_get_header(void *parent)
{
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;

    return cxt->emitter.cur.data;
}

viddec_workload_t* viddec_pm_get_next_header(void *parent)
{
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;

    return cxt->emitter.next.data;
}

int32_t viddec_pm_is_nomoredata(void *parent)
{
    int32_t ret=0;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;    
    ret = viddec_pm_utils_bstream_nomorerbspdata(&(cxt->getbits));
    return ret;
}

uint32_t viddec_pm_get_cur_byte(void *parent, uint8_t *byte)
{
    int32_t ret=-1;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;
    ret = viddec_pm_utils_bstream_get_current_byte(&(cxt->getbits), byte);
    return ret;
}

int32_t viddec_pm_append_misc_tags(void *parent, uint32_t start, uint32_t end, viddec_workload_item_t *wi, uint32_t using_next)
{
    int32_t ret = 1;
    viddec_pm_cxt_t *cxt;

    cxt = (viddec_pm_cxt_t *)parent;
    if (end == VIDDEC_PARSE_INVALID_POS) end = (cxt->list.total_bytes -1);
    viddec_pm_utils_list_emit_slice_tags(&(cxt->list), start, end, &(cxt->emitter), using_next, wi);

    return ret;

}

void viddec_pm_set_next_frame_error_on_eos(void *parent, uint32_t error)
{
    viddec_pm_cxt_t *cxt;
    cxt = (viddec_pm_cxt_t *)parent;
    cxt->next_workload_error_eos = error;
}

void viddec_pm_set_late_frame_detect(void *parent)
{
    viddec_pm_cxt_t *cxt;
    cxt = (viddec_pm_cxt_t *)parent;
    cxt->late_frame_detect = true;
}

void viddec_pm_setup_userdata(viddec_workload_item_t *wi)
{
#ifdef  MFDBIGENDIAN
    wi->vwi_payload[0] = SWAP_WORD(wi->vwi_payload[0]);
    wi->vwi_payload[1] = SWAP_WORD(wi->vwi_payload[1]);
    wi->vwi_payload[2] = SWAP_WORD(wi->vwi_payload[2]);
#else
    wi=wi;
#endif
}
