1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm.h" 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h" 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_parser_ops.h" 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_emitter.h" 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_workload.h" 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm_utils_bstream.h" 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeextern void viddec_pm_utils_list_emit_pixel_tags(viddec_pm_utils_list_t *list, uint32_t start, viddec_emitter *emitter, uint32_t using_next); 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeextern 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); 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_get_bits(void *parent, uint32_t *data, uint32_t num_bits) 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_utils_bstream_peekbits(&(cxt->getbits), data, num_bits, 1); 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(ret == -1) 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee {DEB("FAILURE!!!! getbits returned %d\n", ret);} 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_peek_bits(void *parent, uint32_t *data, uint32_t num_bits) 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_utils_bstream_peekbits(&(cxt->getbits), data, num_bits, 0); 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_skip_bits(void *parent, uint32_t num_bits) 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_utils_bstream_skipbits(&(cxt->getbits), num_bits); 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_append_workitem(void *parent, viddec_workload_item_t *item) 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_emit_append(&(cxt->emitter.cur), item); 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_append_workitem_next(void *parent, viddec_workload_item_t *item) 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_emit_append(&(cxt->emitter.next), item); 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_get_au_pos(void *parent, uint32_t *bit, uint32_t *byte, uint8_t *is_emul) 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_utils_bstream_get_au_offsets(&(cxt->getbits), bit, byte, is_emul); 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic inline int32_t viddec_pm_append_restof_pixel_data(void *parent, uint32_t cur_wkld) 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t start=0, b_off=0; 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t emul=0; 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_workload_item_t wi; 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_utils_bstream_get_au_offsets(&(cxt->getbits), &b_off, &start, &emul); 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(emul) start--; 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi.vwi_type = VIDDEC_WORKLOAD_PIXEL_ES; 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi.es.es_flags = 0; 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_utils_list_emit_slice_tags(&(cxt->list), start, cxt->list.total_bytes -1, &(cxt->emitter), cur_wkld, &wi); 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_append_pixeldata(void *parent) 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return viddec_pm_append_restof_pixel_data(parent, 1); 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_append_pixeldata_next(void *parent) 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return viddec_pm_append_restof_pixel_data(parent, 0); 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeviddec_workload_t* viddec_pm_get_header(void *parent) 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return cxt->emitter.cur.data; 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeviddec_workload_t* viddec_pm_get_next_header(void *parent) 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return cxt->emitter.next.data; 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_is_nomoredata(void *parent) 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret=0; 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_utils_bstream_nomorerbspdata(&(cxt->getbits)); 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_pm_get_cur_byte(void *parent, uint8_t *byte) 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret=-1; 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_utils_bstream_get_current_byte(&(cxt->getbits), byte); 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t viddec_pm_append_misc_tags(void *parent, uint32_t start, uint32_t end, viddec_workload_item_t *wi, uint32_t using_next) 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 1; 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (end == VIDDEC_PARSE_INVALID_POS) end = (cxt->list.total_bytes -1); 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_utils_list_emit_slice_tags(&(cxt->list), start, end, &(cxt->emitter), using_next, wi); 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_pm_set_next_frame_error_on_eos(void *parent, uint32_t error) 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt->next_workload_error_eos = error; 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_pm_set_late_frame_detect(void *parent) 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_cxt_t *cxt; 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt = (viddec_pm_cxt_t *)parent; 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cxt->late_frame_detect = true; 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_pm_setup_userdata(viddec_workload_item_t *wi) 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef MFDBIGENDIAN 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi->vwi_payload[0] = SWAP_WORD(wi->vwi_payload[0]); 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi->vwi_payload[1] = SWAP_WORD(wi->vwi_payload[1]); 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi->vwi_payload[2] = SWAP_WORD(wi->vwi_payload[2]); 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wi=wi; 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 179