Home | History | Annotate | Download | only in parser
      1 #include "viddec_emitter.h"
      2 #include "viddec_fw_workload.h"
      3 #include "viddec_fw_debug.h"
      4 
      5 int32_t viddec_emit_flush_current_wkld(viddec_emitter *emit)
      6 {
      7     if(emit->cur.data != NULL)
      8     {
      9         emit->cur.data->num_items = emit->cur.num_items;
     10     }
     11     if(emit->next.data != NULL)
     12     {
     13         emit->next.data->num_items = emit->next.num_items;
     14     }
     15     emit->cur.num_items = emit->next.num_items;
     16     emit->next.num_items = 0;
     17     if(emit->cur.data != NULL)
     18     {
     19         emit->cur.data->result = emit->cur.result;
     20     }
     21     if(emit->next.data != NULL)
     22     {
     23         emit->next.data->result = emit->next.result;
     24     }
     25     emit->cur.result = emit->next.result;
     26     emit->next.result = 0;
     27     return 1;
     28 }
     29 
     30 int32_t viddec_emit_append(viddec_emitter_wkld *cxt, viddec_workload_item_t *item)
     31 {
     32     int32_t ret =0;
     33     if((cxt->num_items < cxt->max_items) && (cxt->data != NULL))
     34     {
     35         cxt->data->item[cxt->num_items] = *item;
     36         cxt->num_items++;
     37         ret = 1;
     38         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]);
     39     }
     40     else
     41     {
     42         cxt->result |= (VIDDEC_FW_WORKLOAD_ERR_ITEMS_OVERFLOW | VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE);
     43         WRITE_SVEN(SVEN_MODULE_EVENT_GV_FW_FATAL_WKLD_OVERLFOW, (int)item->vwi_type, (int)(cxt->data), 0, 0, 0, 0);
     44     }
     45     return ret;
     46 }
     47 
     48 int32_t viddec_emit_contr_tag(viddec_emitter *emit, viddec_input_buffer_t *ibuf, uint8_t incomplete, uint32_t using_next)
     49 {
     50     viddec_workload_item_t   item;
     51     viddec_emitter_wkld *cur_wkld;
     52 
     53     cur_wkld = (using_next == 0)? &(emit->cur):&(emit->next);
     54 
     55     if(!incomplete)
     56         item.vwi_type           = VIDDEC_WORKLOAD_IBUF_DONE;
     57     else
     58         item.vwi_type           = VIDDEC_WORKLOAD_IBUF_CONTINUED;
     59     item.tag.tag_phys_addr  = ibuf->phys;
     60     item.tag.tag_phys_len   = ibuf->len;
     61     item.tag.tag_value      = ibuf->id;
     62 
     63     return viddec_emit_append(cur_wkld, &item);
     64 }
     65 
     66 int32_t viddec_emit_assoc_tag(viddec_emitter *emit, uint32_t id, uint32_t using_next)
     67 {
     68     viddec_workload_item_t   item;
     69     viddec_emitter_wkld *cur_wkld;
     70 
     71     cur_wkld = (using_next == false)? &(emit->cur):&(emit->next);
     72     item.vwi_type           = VIDDEC_WORKLOAD_TAG;
     73     item.tag.tag_phys_addr  = -1;
     74     item.tag.tag_phys_len   = -1;
     75     item.tag.tag_value      = id;
     76     return viddec_emit_append(cur_wkld, &item);
     77 }
     78 
     79