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