1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * viddec_mpeg2_workload.c
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * -----------------------
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * This file packs the data parsed and stored in the context into workload and
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * emits it out. The current list of workitems emitter into the workload
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * include:
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * - DMEM - Register Data
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * - Past and Future picture references
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * - Quantization matrix data
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Slice data gets appended into the workload in viddec_mpeg2_parse.c
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Also, the frame attributes are updated in the workload.
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_mpeg2.h"
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_item_types.h"
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_mpeg2_append_workitem(void *parent, viddec_workload_item_t *wi, uint8_t next_wl)
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (next_wl)
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_pm_append_workitem_next(parent, wi);
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_pm_append_workitem(parent, wi);
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeviddec_workload_t* viddec_mpeg2_get_header(void *parent, uint8_t next_wl)
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_t *ret;
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (next_wl)
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = viddec_pm_get_next_header(parent);
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = viddec_pm_get_header(parent);
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return ret;
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_set_seq_ext_defaults() - Sets non-zero default values for    */
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* sequence extension items in case sequence extension is not present.       */
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_set_seq_ext_defaults(struct viddec_mpeg2_parser *parser)
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->info.seq_ext.progressive_sequence = true;
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->info.seq_ext.chroma_format        = MPEG2_CF_420;
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_set_pic_cod_ext_defaults() - Sets non-zero default values for*/
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* picture coding extension items in case picture coding extension is not    */
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* present.                                                                  */
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_set_pic_cod_ext_defaults(struct viddec_mpeg2_parser *parser)
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->info.pic_cod_ext.picture_structure    = MPEG2_PIC_STRUCT_FRAME;
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->info.pic_cod_ext.frame_pred_frame_dct = true;
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->info.pic_cod_ext.progressive_frame    = true;
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_pack_qmat() - Packs the 256 byte quantization matrix data    */
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 64 32-bit values.                                                         */
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef MFDBIGENDIAN
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_pack_qmat(struct viddec_mpeg2_parser *parser)
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Quantization Matrix Support */
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Populate Quantization Matrices */
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t index = 0;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t *qmat_packed, *qmat_unpacked;
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* When transferring the quantization matrix data from the parser */
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* context into workload items, we are packing four 8 bit         */
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* quantization values into one DWORD (32 bits). To do this, the  */
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* array of values of type uint8_t, is typecast as uint32 * and   */
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* read.                                                          */
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    qmat_packed   = (uint32_t *) parser->wi.qmat;
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    qmat_unpacked = (uint32_t *) &parser->info.qnt_mat;
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    for (index=0; index<MPEG2_QUANT_MAT_SIZE; index++)
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        qmat_packed[index] = qmat_unpacked[index];
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_pack_qmat(struct viddec_mpeg2_parser *parser)
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Quantization Matrix Support */
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Populate Quantization Matrices */
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t index = 0;
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t *qmat_packed;
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t  *qmat_unpacked;
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* When transferring the quantization matrix data from the parser */
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* context into workload items, we are packing four 8 bit         */
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* quantization values into one DWORD (32 bits). To do this, the  */
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* array of values of type uint8_t, is typecast as uint32 * and   */
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* read.                                                          */
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    qmat_packed   = (uint32_t *) parser->wi.qmat;
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    qmat_unpacked = (uint8_t *) &parser->info.qnt_mat;
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    for (index=0; index<MPEG2_QUANT_MAT_SIZE; index++)
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        qmat_packed[index] =
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            (((uint32_t)qmat_unpacked[(index<<2)+0])<< 24) |
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            (((uint32_t)qmat_unpacked[(index<<2)+1])<< 16) |
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            (((uint32_t)qmat_unpacked[(index<<2)+2])<<  8) |
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            (((uint32_t)qmat_unpacked[(index<<2)+3])<<  0) ;
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_trans_metadata_workitems() - Transfers the metadata stored   */
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* in parser context into workitems by bit masking. These workitems are then */
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* sent through emitter                                                      */
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_trans_metadata_workitems(void *ctxt)
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt;
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Reset register values */
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1  = 0x0;
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi2  = 0x0;
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1  = 0x0;
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 = 0x0;
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Set defaults for missing fields */
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (!(parser->mpeg2_curr_seq_headers & MPEG2_HEADER_SEQ_EXT))
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_set_seq_ext_defaults(parser);
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (!(parser->mpeg2_curr_frame_headers & MPEG2_HEADER_PIC_COD_EXT))
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_set_pic_cod_ext_defaults(parser);
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Populate Core Sequence Info 1 */
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->mpeg2_stream) <<  1;
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.seq_hdr.constrained_parameters_flag) <<  2;
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.seq_ext.progressive_sequence) <<  3;
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.seq_ext.chroma_format) << 16;
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.qnt_ext.load_intra_quantiser_matrix) << 19;
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.qnt_ext.load_non_intra_quantiser_matrix) << 20;
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.qnt_ext.load_chroma_intra_quantiser_matrix) << 21;
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi1 |= (parser->info.qnt_ext.load_chroma_non_intra_quantiser_matrix) << 22;
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Core Sequence Info 1: 0x%.8X\n", parser->wi.csi1);
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Populate Core Sequence Info 2 */
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi2 |= (parser->info.seq_hdr.horizontal_size_value & MPEG2_BIT_MASK_11);
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.csi2 |= (parser->info.seq_hdr.vertical_size_value & MPEG2_BIT_MASK_11) << 14;
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Core Sequence Info 2: 0x%.8X\n", parser->wi.csi2);
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Populate Core Picture Info */
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_hdr.full_pel_forward_vect);
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_hdr.forward_f_code) <<  1;
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_hdr.full_pel_backward_vect) <<  4;
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_hdr.backward_f_code) <<  5;
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_cod_ext.fcode00) <<  8;
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_cod_ext.fcode01) << 12;
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_cod_ext.fcode10) << 16;
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_cod_ext.fcode11) << 20;
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_cod_ext.intra_dc_precision) << 24;
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpi1 |= (parser->info.pic_hdr.picture_coding_type-1) << 26;
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Core Picture Info 1: 0x%.8X\n", parser->wi.cpi1);
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Populate Core Picture Extension Info */
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.composite_display_flag);
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.progressive_frame) <<  1;
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.chroma_420_type) <<  2;
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.repeat_first_field) <<  3;
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.alternate_scan) <<  4;
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.intra_vlc_format) <<  5;
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.q_scale_type) <<  6;
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.concealment_motion_vectors) <<  7;
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.frame_pred_frame_dct) <<  8;
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.top_field_first) <<  9;
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->wi.cpce1 |= (parser->info.pic_cod_ext.picture_structure) << 10;
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Core Picture Ext Info 1: 0x%.8X\n", parser->wi.cpce1);
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* mpeg2_emit_display_frame() - Sends the frame id as a workload item.       */
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic inline void mpeg2_emit_frameid(void *parent, int32_t wl_type, uint8_t flag)
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_item_t wi;
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.vwi_type = wl_type;
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.ref_frame.reference_id     = 0;
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.ref_frame.luma_phys_addr   = 0;
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.ref_frame.chroma_phys_addr = 0;
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_append_workitem( parent, &wi, flag );
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* mpeg2_send_ref_reorder() - Reorders reference frames */
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic inline void mpeg2_send_ref_reorder(void *parent, uint8_t flag)
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_item_t wi;
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.vwi_type = VIDDEC_WORKLOAD_REFERENCE_FRAME_REORDER;
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.ref_reorder.ref_table_offset = 0;
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Reorder index 1 to index 0 only */
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.ref_reorder.ref_reorder_00010203 = 0x01010203;
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wi.ref_reorder.ref_reorder_04050607 = 0x04050607;
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_append_workitem( parent, &wi, flag );
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_manage_ref() - Manages frame references by inserting the     */
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* past and future references (if any) for every frame inserted in the       */
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* workload.                                                                 */
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_manage_ref(void *parent, void *ctxt)
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int32_t frame_id = 1;
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int32_t frame_type;
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Get MPEG2 Parser context */
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt;
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_t *wl = viddec_mpeg2_get_header( parent, parser->mpeg2_use_next_workload );
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wl->is_reference_frame = 0;
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Identify the frame type (I, P or B) */
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    frame_type = parser->info.pic_hdr.picture_coding_type;
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Send reference frame information based on whether the picture is a */
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* frame picture or field picture. */
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if ((!parser->mpeg2_picture_interlaced)
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        || ((parser->mpeg2_picture_interlaced) && (parser->mpeg2_first_field)))
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* Check if we need to reorder frame references/send frame for display */
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* in case of I or P type */
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (frame_type != MPEG2_PC_TYPE_B)
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            /* Checking reorder */
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (parser->mpeg2_ref_table_updated)
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg2_send_ref_reorder(parent, parser->mpeg2_use_next_workload);
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* Send reference frame workitems */
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        switch(frame_type)
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MPEG2_PC_TYPE_I:
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MPEG2_PC_TYPE_P:
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg2_emit_frameid(parent, VIDDEC_WORKLOAD_MPEG2_REF_PAST, parser->mpeg2_use_next_workload);
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MPEG2_PC_TYPE_B:
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg2_emit_frameid(parent, VIDDEC_WORKLOAD_MPEG2_REF_PAST, parser->mpeg2_use_next_workload);
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg2_emit_frameid(parent, VIDDEC_WORKLOAD_MPEG2_REF_FUTURE, parser->mpeg2_use_next_workload);
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* Set reference information updated flag */
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!parser->mpeg2_picture_interlaced)
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parser->mpeg2_wl_status |= MPEG2_WL_REF_INFO;
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* Set reference information updated flag for second fiel */
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->mpeg2_wl_status |= MPEG2_WL_REF_INFO;
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Set the reference frame flags for I and P types */
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (frame_type != MPEG2_PC_TYPE_B)
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wl->is_reference_frame |= WORKLOAD_REFERENCE_FRAME | (frame_id & WORKLOAD_REFERENCE_FRAME_BMASK);
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->mpeg2_ref_table_updated = true;
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_check_unsupported() - Check for unsupported feature in the stream */
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_check_unsupported(void *parent, void *ctxt)
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    unsigned int unsupported_feature_found = 0;
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Get MPEG2 Parser context */
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt;
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Get workload */
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_t *wl = viddec_mpeg2_get_header( parent, parser->mpeg2_use_next_workload );
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Get attributes in workload */
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_frame_attributes_t *attrs = &wl->attrs;
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Check for unsupported content size */
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    unsupported_feature_found |= (attrs->cont_size.height > MPEG2_MAX_CONTENT_HEIGHT);
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    unsupported_feature_found |= (attrs->cont_size.width  > MPEG2_MAX_CONTENT_WIDTH);
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Update parser status, if found */
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (unsupported_feature_found)
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parser->mpeg2_wl_status |= MPEG2_WL_UNSUPPORTED;
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_append_metadata() - Appends meta data from the stream.       */
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_mpeg2_append_metadata(void *parent, void *ctxt)
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Get MPEG2 Parser context */
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt;
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_item_t  wi;
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Append sequence info, if found with current frame */
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parser->mpeg2_curr_frame_headers & MPEG2_HEADER_SEQ)
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memset(&wi, 0, sizeof(viddec_workload_item_t));
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.vwi_type = VIDDEC_WORKLOAD_SEQUENCE_INFO;
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sh_set_horizontal_size_value       ( &(wi.mp2_sh) , parser->info.seq_hdr.horizontal_size_value);
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sh_set_vertical_size_value         ( &(wi.mp2_sh) , parser->info.seq_hdr.vertical_size_value);
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sh_set_aspect_ratio_information    ( &(wi.mp2_sh) , parser->info.seq_hdr.aspect_ratio_information);
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sh_set_frame_rate_code             ( &(wi.mp2_sh) , parser->info.seq_hdr.frame_rate_code);
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sh_set_bit_rate_value              ( &(wi.mp2_sh) , parser->info.seq_hdr.bit_rate_value);
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sh_set_vbv_buffer_size_value       ( &(wi.mp2_sh) , parser->info.seq_hdr.vbv_buffer_size_value);
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_append_workitem(parent, &wi, parser->mpeg2_use_next_workload);
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Append sequence extension info, if found with current frame */
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parser->mpeg2_curr_frame_headers & MPEG2_HEADER_SEQ_EXT)
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memset(&wi, 0, sizeof(viddec_workload_item_t));
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.vwi_type = VIDDEC_WORKLOAD_MPEG2_SEQ_EXT;
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_profile_and_level_indication( &(wi.mp2_se) , parser->info.seq_ext.profile_and_level_indication);
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_progressive_sequence        ( &(wi.mp2_se) , parser->info.seq_ext.progressive_sequence);
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_chroma_format               ( &(wi.mp2_se) , parser->info.seq_ext.chroma_format);
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_horizontal_size_extension   ( &(wi.mp2_se) , parser->info.seq_ext.horizontal_size_extension);
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_vertical_size_extension     ( &(wi.mp2_se) , parser->info.seq_ext.vertical_size_extension);
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_bit_rate_extension          ( &(wi.mp2_se) , parser->info.seq_ext.bit_rate_extension);
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_vbv_buffer_size_extension   ( &(wi.mp2_se) , parser->info.seq_ext.vbv_buffer_size_extension);
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_frame_rate_extension_n      ( &(wi.mp2_se) , parser->info.seq_ext.frame_rate_extension_n);
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_se_set_frame_rate_extension_d      ( &(wi.mp2_se) , parser->info.seq_ext.frame_rate_extension_d);
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_append_workitem(parent, &wi, parser->mpeg2_use_next_workload);
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Append Display info, if present */
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parser->mpeg2_curr_frame_headers & MPEG2_HEADER_SEQ_DISP_EXT)
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memset(&wi, 0, sizeof(viddec_workload_item_t));
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.vwi_type = VIDDEC_WORKLOAD_DISPLAY_INFO;
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sde_set_video_format            ( &(wi.mp2_sde) , parser->info.seq_disp_ext.video_format);
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sde_set_color_description       ( &(wi.mp2_sde) , parser->info.seq_disp_ext.colour_description);
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sde_set_color_primaries         ( &(wi.mp2_sde) , parser->info.seq_disp_ext.colour_primaries);
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sde_set_transfer_characteristics( &(wi.mp2_sde) , parser->info.seq_disp_ext.transfer_characteristics);
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sde_set_display_horizontal_size ( &(wi.mp2_sde) , parser->info.seq_disp_ext.display_horizontal_size);
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_sde_set_display_vertical_size   ( &(wi.mp2_sde) , parser->info.seq_disp_ext.display_vertical_size);
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_append_workitem(parent, &wi, parser->mpeg2_use_next_workload);
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Append GOP info, if present */
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parser->mpeg2_curr_frame_headers & MPEG2_HEADER_GOP)
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memset(&wi, 0, sizeof(viddec_workload_item_t));
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.vwi_type = VIDDEC_WORKLOAD_GOP_INFO;
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_gop_set_closed_gop ( &(wi.mp2_gop) , parser->info.gop_hdr.closed_gop);
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_fw_mp2_gop_set_broken_link( &(wi.mp2_gop) , parser->info.gop_hdr.broken_link);
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_append_workitem(parent, &wi, parser->mpeg2_use_next_workload);
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_append_workitems() - Appends decoder specific workitems      */
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* to the workload starting at the address and length specified.             */
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_mpeg2_append_workitems
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee(
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    void *parent,
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t* address,
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int workitem_type,
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int num_items,
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t flag
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee)
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    int32_t                  index=0;
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    const uint32_t*          initial_address = address;
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_workload_item_t   wi;
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    for (index=0; index < num_items; index++)
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.vwi_type = workitem_type;
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.data.data_offset = (char *) address - (const char *) initial_address;
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.data.data_payload[0] = address[0];
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        wi.data.data_payload[1] = address[1];
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        address += 2;
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        viddec_mpeg2_append_workitem(parent, &wi, flag);
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* viddec_mpeg2_emit_workload() - Emits MPEG2 parser generated work load     */
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* items.                                                                    */
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Items include: MPEG2 DMEM Data, Quantization Matrices.                    */
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Pixel ES data sent separately whenever parser sees slice data             */
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_mpeg2_emit_workload(void *parent, void *ctxt)
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Emitting workloads.\n");
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Get MPEG2 Parser context */
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt;
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Append meta data workitems */
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_append_metadata(parent, ctxt);
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Transfer metadata into attributes */
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_translate_attr(parent, ctxt);
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Check for unsupported features in the stream and update parser status */
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_check_unsupported(parent, ctxt);
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Transfer all stored metadata into MPEG2 Hardware Info */
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_trans_metadata_workitems(parser);
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Send MPEG2 DMEM workitems */
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_append_workitems(parent,
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   (uint32_t *) &parser->wi,
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   VIDDEC_WORKLOAD_MPEG2_DMEM,
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   MPEG2_NUM_DMEM_WL_ITEMS,
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   parser->mpeg2_use_next_workload);
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parser->mpeg2_wl_status |= MPEG2_WL_DMEM_DATA;
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Adding %d items as DMEM Data.\n", MPEG2_NUM_DMEM_WL_ITEMS);
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Send MPEG2 Quantization Matrix workitems, if updated */
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_pack_qmat(parser);
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_append_workitems(parent,
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   (uint32_t *) parser->wi.qmat,
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   VIDDEC_WORKLOAD_MPEG2_QMAT,
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   MPEG2_NUM_QMAT_WL_ITEMS,
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                   parser->mpeg2_use_next_workload);
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MPEG2_DEB("Adding %d items as QMAT Data.\n", MPEG2_NUM_QMAT_WL_ITEMS);
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Manage reference frames */
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    viddec_mpeg2_manage_ref(parent, ctxt);
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
462