| #include "viddec_emitter.h" |
| #include "viddec_fw_workload.h" |
| #include "viddec_fw_debug.h" |
| |
| int32_t viddec_emit_flush_current_wkld(viddec_emitter *emit) |
| { |
| if(emit->cur.data != NULL) |
| { |
| emit->cur.data->num_items = emit->cur.num_items; |
| } |
| if(emit->next.data != NULL) |
| { |
| emit->next.data->num_items = emit->next.num_items; |
| } |
| emit->cur.num_items = emit->next.num_items; |
| emit->next.num_items = 0; |
| if(emit->cur.data != NULL) |
| { |
| emit->cur.data->result = emit->cur.result; |
| } |
| if(emit->next.data != NULL) |
| { |
| emit->next.data->result = emit->next.result; |
| } |
| emit->cur.result = emit->next.result; |
| emit->next.result = 0; |
| return 1; |
| } |
| |
| int32_t viddec_emit_append(viddec_emitter_wkld *cxt, viddec_workload_item_t *item) |
| { |
| int32_t ret =0; |
| if((cxt->num_items < cxt->max_items) && (cxt->data != NULL)) |
| { |
| cxt->data->item[cxt->num_items] = *item; |
| cxt->num_items++; |
| ret = 1; |
| CDEB(0, "%s: item(%02d) = [%08x %08x %08x %08x]\n",__FUNCTION__, cxt->num_items - 1, item->vwi_type, item->vwi_payload[0], item->vwi_payload[1], item->vwi_payload[2]); |
| } |
| else |
| { |
| cxt->result |= (VIDDEC_FW_WORKLOAD_ERR_ITEMS_OVERFLOW | VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE); |
| WRITE_SVEN(SVEN_MODULE_EVENT_GV_FW_FATAL_WKLD_OVERLFOW, (int)item->vwi_type, (int)(cxt->data), 0, 0, 0, 0); |
| } |
| return ret; |
| } |
| |
| int32_t viddec_emit_contr_tag(viddec_emitter *emit, viddec_input_buffer_t *ibuf, uint8_t incomplete, uint32_t using_next) |
| { |
| viddec_workload_item_t item; |
| viddec_emitter_wkld *cur_wkld; |
| |
| cur_wkld = (using_next == 0)? &(emit->cur):&(emit->next); |
| |
| if(!incomplete) |
| item.vwi_type = VIDDEC_WORKLOAD_IBUF_DONE; |
| else |
| item.vwi_type = VIDDEC_WORKLOAD_IBUF_CONTINUED; |
| item.tag.tag_phys_addr = ibuf->phys; |
| item.tag.tag_phys_len = ibuf->len; |
| item.tag.tag_value = ibuf->id; |
| |
| return viddec_emit_append(cur_wkld, &item); |
| } |
| |
| int32_t viddec_emit_assoc_tag(viddec_emitter *emit, uint32_t id, uint32_t using_next) |
| { |
| viddec_workload_item_t item; |
| viddec_emitter_wkld *cur_wkld; |
| |
| cur_wkld = (using_next == false)? &(emit->cur):&(emit->next); |
| item.vwi_type = VIDDEC_WORKLOAD_TAG; |
| item.tag.tag_phys_addr = -1; |
| item.tag.tag_phys_len = -1; |
| item.tag.tag_value = id; |
| return viddec_emit_append(cur_wkld, &item); |
| } |
| |