blob: 9d488fe5f8fed8f925fd22ebd83ed61cb6f5bdbd [file] [log] [blame]
#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
}