1/** 2 * viddec_mpeg2_frame_attr.c 3 * ------------------------- 4 * This is a helper file for viddec_mpeg2_workload.c to translate the data 5 * stored in the parser context into frame attributes in the workload. 6 */ 7 8#include "viddec_mpeg2.h" 9 10/* viddec_mpeg2_print_attr() - Prints collected frame attributes */ 11static inline void viddec_mpeg2_print_attr(viddec_frame_attributes_t *attr) 12{ 13 unsigned int index = 0; 14 15 MPEG2_FA_DEB("Content_Size=%dx%d\n", attr->cont_size.width, 16 attr->cont_size.height); 17 MPEG2_FA_DEB("Repeat=%d\n", attr->mpeg2.repeat_first_field); 18 MPEG2_FA_DEB("Frame_Type=%d\n", attr->frame_type); 19 MPEG2_FA_DEB("Temporal_Reference=%d\n", attr->mpeg2.temporal_ref); 20 MPEG2_FA_DEB("Top_Field_First=%d\n", attr->mpeg2.top_field_first); 21 MPEG2_FA_DEB("Progressive_Frame=%d\n", attr->mpeg2.progressive_frame); 22 MPEG2_FA_DEB("Picture_Struct=%d\n", attr->mpeg2.picture_struct); 23 MPEG2_FA_DEB("Pan_Scan_Offsets=%d\n", attr->mpeg2.number_of_frame_center_offsets); 24 25 for (index = 0; index < attr->mpeg2.number_of_frame_center_offsets; index++) 26 { 27 MPEG2_FA_DEB("\tPan_Scan_Offset_%d= %dx%d\n", index, 28 attr->mpeg2.frame_center_offset[index].horz, 29 attr->mpeg2.frame_center_offset[index].vert); 30 } 31 32 return; 33} 34 35/* viddec_mpeg2_set_default_values() - Resets attributes that are optional */ 36/* in the bitstream to their default values. */ 37static inline void viddec_mpeg2_set_default_values(viddec_frame_attributes_t *attrs) 38{ 39 unsigned int index = 0; 40 41 attrs->mpeg2.number_of_frame_center_offsets = 0; 42 for (index = 0; index < MPEG2_MAX_VID_OFFSETS ; index++) 43 { 44 attrs->mpeg2.frame_center_offset[index].horz = 0; 45 attrs->mpeg2.frame_center_offset[index].vert = 0; 46 } 47 48 return; 49} 50 51/* viddec_mpeg2_translate_attr() - Translates metadata parsed into frame */ 52/* attributes in the workload */ 53void viddec_mpeg2_translate_attr(void *parent, void *ctxt) 54{ 55 /* Get MPEG2 Parser context */ 56 struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt; 57 58 /* Get workload */ 59 viddec_workload_t *wl = viddec_pm_get_header( parent ); 60 61 /* Get attributes in workload */ 62 viddec_frame_attributes_t *attrs = &wl->attrs; 63 64 /* Get the default values for optional attributes */ 65 viddec_mpeg2_set_default_values(attrs); 66 67 /* Populate attributes from parser context */ 68 /* Content Size */ 69 attrs->cont_size.height = ((parser->info.seq_ext.vertical_size_extension << 12) 70 | parser->info.seq_hdr.vertical_size_value); 71 attrs->cont_size.width = ((parser->info.seq_ext.horizontal_size_extension << 12) 72 | parser->info.seq_hdr.horizontal_size_value); 73 74 /* Repeat field */ 75 attrs->mpeg2.repeat_first_field = parser->info.pic_cod_ext.repeat_first_field; 76 77 /* Temporal Reference */ 78 attrs->mpeg2.temporal_ref = parser->info.pic_hdr.temporal_reference; 79 80 /* Top field first */ 81 attrs->mpeg2.top_field_first = parser->info.pic_cod_ext.top_field_first; 82 83 /* Progressive frame */ 84 attrs->mpeg2.progressive_frame = parser->info.pic_cod_ext.progressive_frame; 85 86 /* Picture Structure */ 87 attrs->mpeg2.picture_struct = parser->info.pic_cod_ext.picture_structure; 88 89 /* Populate the frame type */ 90 switch (parser->info.pic_hdr.picture_coding_type) 91 { 92 case MPEG2_PC_TYPE_I: attrs->frame_type = VIDDEC_FRAME_TYPE_I; break; 93 case MPEG2_PC_TYPE_P: attrs->frame_type = VIDDEC_FRAME_TYPE_P; break; 94 case MPEG2_PC_TYPE_B: attrs->frame_type = VIDDEC_FRAME_TYPE_B; break; 95 default: attrs->frame_type = VIDDEC_FRAME_TYPE_INVALID; 96 } 97 98 /* Update PanScan data */ 99 if (parser->mpeg2_curr_frame_headers & MPEG2_HEADER_PIC_DISP_EXT) 100 { 101 unsigned int index = 0; 102 attrs->mpeg2.number_of_frame_center_offsets = parser->mpeg2_num_pan_scan_offsets; 103 for (index = 0; index < parser->mpeg2_num_pan_scan_offsets; index++) 104 { 105 attrs->mpeg2.frame_center_offset[index].horz = parser->info.pic_disp_ext.frame_center_horizontal_offset[index]; 106 attrs->mpeg2.frame_center_offset[index].vert = parser->info.pic_disp_ext.frame_center_vertical_offset[index]; 107 } 108 } 109 110 /* Print frame attributes */ 111 viddec_mpeg2_print_attr(attrs); 112 113 return; 114} 115