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