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