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