1 #ifndef VIDDEC_FW_MP4_H 2 #define VIDDEC_FW_MP4_H 3 4 #include "viddec_fw_workload.h" 5 6 enum viddec_fw_mp4_ref_frame_id 7 { 8 VIDDEC_MP4_FRAME_CURRENT = 0, 9 VIDDEC_MP4_FRAME_PAST = 1, 10 VIDDEC_MP4_FRAME_FUTURE = 2, 11 VIDDEC_MP4_FRAME_MAX = 3, 12 }; 13 14 enum mp4_workload_item_type 15 { 16 VIDDEC_WORKLOAD_MP4_PAST_FRAME = VIDDEC_WORKLOAD_REF_FRAME_SOURCE_0, 17 VIDDEC_WORKLOAD_MP4_FUTURE_FRAME, 18 VIDDEC_WORKLOAD_MP4_VOL_INFO = VIDDEC_WORKLOAD_DECODER_SPECIFIC, 19 VIDDEC_WORKLOAD_MP4_VOP_INFO, 20 VIDDEC_WORKLOAD_MP4_BVOP_INFO, 21 VIDDEC_WORKLOAD_MP4_SPRT_TRAJ, 22 VIDDEC_WORKLOAD_MP4_IQUANT, 23 VIDDEC_WORKLOAD_MP4_NIQUANT, 24 VIDDEC_WORKLOAD_MP4_SVH, 25 }; 26 27 enum viddec_fw_mp4_vop_coding_type_t 28 { 29 VIDDEC_MP4_VOP_TYPE_I = 0, 30 VIDDEC_MP4_VOP_TYPE_P, 31 VIDDEC_MP4_VOP_TYPE_B, 32 VIDDEC_MP4_VOP_TYPE_S 33 }; 34 35 // This structure contains the information extracted from the Video Object Layer. 36 // This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_VOL_INFO, using 37 // the "vwi_payload" array in viddec_workload_item_t. 38 // TODO: Add default values in the comments for each item 39 typedef struct 40 { 41 // Flags extracted from the Video Object Layer 42 // 0:0 - short_video_header 43 // 1:2 - vol_shape 44 // 3:3 - interlaced 45 // 4:4 - obmc_disable 46 // 5:5 - quarter_sample 47 // 6:6 - resync_marker_disable 48 // 7:7 - data_partitioned 49 // 8:8 - reversible_vlc 50 #define viddec_fw_mp4_get_reversible_vlc(x) viddec_fw_bitfields_extract((x)->vol_flags, 8, 0x1) 51 #define viddec_fw_mp4_set_reversible_vlc(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 8, 0x1) 52 #define viddec_fw_mp4_get_data_partitioned(x) viddec_fw_bitfields_extract((x)->vol_flags, 7, 0x1) 53 #define viddec_fw_mp4_set_data_partitioned(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 7, 0x1) 54 #define viddec_fw_mp4_get_resync_marker_disable(x) viddec_fw_bitfields_extract((x)->vol_flags, 6, 0x1) 55 #define viddec_fw_mp4_set_resync_marker_disable(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 6, 0x1) 56 #define viddec_fw_mp4_get_quarter_sample(x) viddec_fw_bitfields_extract((x)->vol_flags, 5, 0x1) 57 #define viddec_fw_mp4_set_quarter_sample(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 5, 0x1) 58 #define viddec_fw_mp4_get_obmc_disable(x) viddec_fw_bitfields_extract((x)->vol_flags, 4, 0x1) 59 #define viddec_fw_mp4_set_obmc_disable(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 4, 0x1) 60 #define viddec_fw_mp4_get_interlaced(x) viddec_fw_bitfields_extract((x)->vol_flags, 3, 0x1) 61 #define viddec_fw_mp4_set_interlaced(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 3, 0x1) 62 #define viddec_fw_mp4_get_vol_shape(x) viddec_fw_bitfields_extract((x)->vol_flags, 1, 0x3) 63 #define viddec_fw_mp4_set_vol_shape(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 1, 0x3) 64 #define viddec_fw_mp4_get_short_video_header_flag(x) viddec_fw_bitfields_extract((x)->vol_flags, 0, 0x1) 65 #define viddec_fw_mp4_set_short_video_header_flag(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 0, 0x1) 66 unsigned int vol_flags; 67 68 // Size extracted from the Video Object Layer 69 // 0:12 - width 70 // 13:25 - height 71 // MFD_MPG4VD_MB_PER_ROW can be calculated as (width+15) >> 4 72 // MFD_MPG4VD_MB_ROWS can be calculated as (height+15) >> 4 73 #define viddec_fw_mp4_get_vol_width(x) viddec_fw_bitfields_extract((x)->vol_size, 13, 0x1FFF) 74 #define viddec_fw_mp4_set_vol_width(x, val) viddec_fw_bitfields_insert((x)->vol_size, val, 13, 0x1FFF) 75 #define viddec_fw_mp4_get_vol_height(x) viddec_fw_bitfields_extract((x)->vol_size, 0, 0x1FFF) 76 #define viddec_fw_mp4_set_vol_height(x, val) viddec_fw_bitfields_insert((x)->vol_size, val, 0, 0x1FFF) 77 unsigned int vol_size; 78 79 // Sprite, time increments and quantization details from the Video Object Layer 80 // 0:15 - vop_time_increment_resolution 81 // 16:17 - sprite_enable 82 // 18:23 - sprite_warping_points 83 // 24:25 - sprite_warping_accuracy 84 // 26:29 - quant_precision 85 // 30:30 - quant_type 86 #define viddec_fw_mp4_get_quant_type(x) viddec_fw_bitfields_extract((x)->vol_item, 30, 0x1) 87 #define viddec_fw_mp4_set_quant_type(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 30, 0x1) 88 #define viddec_fw_mp4_get_quant_precision(x) viddec_fw_bitfields_extract((x)->vol_item, 26, 0xF) 89 #define viddec_fw_mp4_set_quant_precision(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 26, 0xF) 90 #define viddec_fw_mp4_get_sprite_warping_accuracy(x) viddec_fw_bitfields_extract((x)->vol_item, 24, 0x3) 91 #define viddec_fw_mp4_set_sprite_warping_accuracy(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 24, 0x3) 92 #define viddec_fw_mp4_get_sprite_warping_points(x) viddec_fw_bitfields_extract((x)->vol_item, 18, 0x3F) 93 #define viddec_fw_mp4_set_sprite_warping_points(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 18, 0x3F) 94 #define viddec_fw_mp4_get_sprite_enable(x) viddec_fw_bitfields_extract((x)->vol_item, 16, 0x3) 95 #define viddec_fw_mp4_set_sprite_enable(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 16, 0x3) 96 #define viddec_fw_mp4_get_vop_time_increment_resolution(x) viddec_fw_bitfields_extract((x)->vol_item, 0, 0xFFFF) 97 #define viddec_fw_mp4_set_vop_time_increment_resolution(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 0, 0xFFFF) 98 unsigned int vol_item; 99 100 } viddec_fw_mp4_vol_info_t; 101 102 // This structure contains the information extracted from the Video Object Layer. 103 // This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_VOP_INFO, using 104 // the "vwi_payload" array in viddec_workload_item_t. 105 // TODO: Add default values in the comments for each item 106 typedef struct 107 { 108 // Frame Info - to populate register MFD_MPG4VD_BSP_FRAME_INFO 109 // 0:4 - current_frame_id 110 // 5:5 - current_field_frame 111 // 6:10 - future_frame_id 112 // 11:11 - future_field_frame 113 // 12:16 - past_frame_id 114 // 17:17 - past_field_frame 115 #define viddec_fw_mp4_get_past_field_frame(x) viddec_fw_bitfields_extract((x)->frame_info, 17, 0x1) 116 #define viddec_fw_mp4_set_past_field_frame(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 17, 0x1) 117 #define viddec_fw_mp4_get_past_frame_id(x) viddec_fw_bitfields_extract((x)->frame_info, 12, 0x1F) 118 #define viddec_fw_mp4_set_past_frame_id(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 12, 0x1F) 119 #define viddec_fw_mp4_get_future_field_frame(x) viddec_fw_bitfields_extract((x)->frame_info, 11, 0x1) 120 #define viddec_fw_mp4_set_future_field_frame(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 11, 0x1) 121 #define viddec_fw_mp4_get_future_frame_id(x) viddec_fw_bitfields_extract((x)->frame_info, 6, 0x1F) 122 #define viddec_fw_mp4_set_future_frame_id(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 6, 0x1F) 123 #define viddec_fw_mp4_get_current_field_frame(x) viddec_fw_bitfields_extract((x)->frame_info, 5, 0x1) 124 #define viddec_fw_mp4_set_current_field_frame(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 5, 0x1) 125 #define viddec_fw_mp4_get_current_frame_id(x) viddec_fw_bitfields_extract((x)->frame_info, 0, 0x1F) 126 #define viddec_fw_mp4_set_current_frame_id(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 0, 0x1F) 127 unsigned int frame_info; 128 129 // Video Object Plane Info 130 // 0:1 - vop_coding_type 131 // 2:2 - vop_rounding_type 132 // 3:5 - intra_dc_vlc_thr 133 // 6:6 - top_field_first 134 // 7:7 - alternate_vertical_scan_flag 135 // 8:16 - vop_quant 136 // 17:19 - vop_fcode_forward 137 // 20:22 - vop_fcode_backward 138 // 23:31 - quant_scale 139 #define viddec_fw_mp4_get_vop_quant_scale(x) viddec_fw_bitfields_extract((x)->vop_data, 23, 0x1FF) 140 #define viddec_fw_mp4_set_vop_quant_scale(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 23, 0x1FF) 141 #define viddec_fw_mp4_get_vop_fcode_backward(x) viddec_fw_bitfields_extract((x)->vop_data, 20, 0x7) 142 #define viddec_fw_mp4_set_vop_fcode_backward(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 20, 0x7) 143 #define viddec_fw_mp4_get_vop_fcode_forward(x) viddec_fw_bitfields_extract((x)->vop_data, 17, 0x7) 144 #define viddec_fw_mp4_set_vop_fcode_forward(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 17, 0x7) 145 #define viddec_fw_mp4_get_vop_quant(x) viddec_fw_bitfields_extract((x)->vop_data, 8, 0x1FF) 146 #define viddec_fw_mp4_set_vop_quant(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 8, 0x1FF) 147 #define viddec_fw_mp4_get_alternate_vertical_scan_flag(x) viddec_fw_bitfields_extract((x)->vop_data, 7, 0x1) 148 #define viddec_fw_mp4_set_alternate_vertical_scan_flag(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 7, 0x1) 149 #define viddec_fw_mp4_get_top_field_first(x) viddec_fw_bitfields_extract((x)->vop_data, 6, 0x1) 150 #define viddec_fw_mp4_set_top_field_first(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 6, 0x1) 151 #define viddec_fw_mp4_get_intra_dc_vlc_thr(x) viddec_fw_bitfields_extract((x)->vop_data, 3, 0x7) 152 #define viddec_fw_mp4_set_intra_dc_vlc_thr(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 3, 0x7) 153 #define viddec_fw_mp4_get_vop_rounding_type(x) viddec_fw_bitfields_extract((x)->vop_data, 2, 0x1) 154 #define viddec_fw_mp4_set_vop_rounding_type(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 2, 0x1) 155 #define viddec_fw_mp4_get_vop_coding_type(x) viddec_fw_bitfields_extract((x)->vop_data, 0, 0x3) 156 #define viddec_fw_mp4_set_vop_coding_type(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 0, 0x3) 157 unsigned int vop_data; 158 159 // No of bits used in first byte of MB data 160 unsigned int bit_offset; 161 162 } viddec_fw_mp4_vop_info_t; 163 164 // This structure contains the information extracted from the Video Object Layer. 165 // This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_BVOP_INFO, using 166 // the "vwi_payload" array in viddec_workload_item_t. 167 // TODO: Add default values in the comments for each item 168 typedef struct 169 { 170 // Frame period = T(first B-VOP after VOL) - T(past reference of first B-VOP after VOL) 171 unsigned int Tframe; 172 173 // TRD is the difference in temporal reference of the temporally next reference VOP with 174 // temporally previous reference VOP, assuming B-VOPs or skipped VOPs in between. 175 unsigned int TRD; 176 177 // TRB is the difference in temporal reference of the B-VOP and the previous reference VOP. 178 unsigned int TRB; 179 180 } viddec_fw_mp4_bvop_info_t; 181 182 // This structure contains the information extracted from the sprite trajectory. 183 // This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_SPRT_TRAJ, 184 // using the fields vwi_payload in viddec_workload_item_t. 185 // TODO: Add default values in the comments for each item 186 typedef struct 187 { 188 // Sprite Trajectory can have dmv_codes for each warping point. 189 // 0:13 - warping_mv_code_dv 190 // 14:27 - warping_mv_code_du 191 // 28:31 - warping_point_index - identifies which warping point the warping code refers to. 192 // The default value for index is 0xF which should be treated as invalid. 193 #define viddec_fw_mp4_get_warping_point_index(x) viddec_fw_bitfields_extract((x), 28, 0xF) 194 #define viddec_fw_mp4_set_warping_point_index(x, val) viddec_fw_bitfields_insert((x), val, 28, 0xF) 195 #define viddec_fw_mp4_get_warping_mv_code_du(x) viddec_fw_bitfields_extract((x), 14, 0x3FFF) 196 #define viddec_fw_mp4_set_warping_mv_code_du(x, val) viddec_fw_bitfields_insert((x), val, 14, 0x3FFF) 197 #define viddec_fw_mp4_get_warping_mv_code_dv(x) viddec_fw_bitfields_extract((x), 0, 0x3FFF) 198 #define viddec_fw_mp4_set_warping_mv_code_dv(x, val) viddec_fw_bitfields_insert((x), val, 0, 0x3FFF) 199 unsigned int warping_mv_code[3]; 200 } viddec_fw_mp4_sprite_trajectory_t; 201 202 // IQUANT entries will be populated in the workload using items of type VIDDEC_WORKLOAD_MP4_IQUANT and the 203 // vwi_payload array. The entries will be in the order in which they need to be programmed in the registers. 204 // There is no need for a separate structure for these values. 205 206 // This structure contains the information extracted from the Video Plane with Short Header. 207 // This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_SVH, using 208 // the "vwi_payload" array in viddec_workload_item_t. 209 // TODO: Add default values in the comments for each item 210 typedef struct 211 { 212 // Video Plane with Short Header 213 // 0:7 - temporal_reference 214 // 8:19 - num_macroblocks_in_gob 215 // 20:24 - num_gobs_in_vop 216 // 25:27 - num_rows_in_gob 217 #define viddec_fw_mp4_get_num_rows_in_gob(x) viddec_fw_bitfields_extract((x)->svh_data, 25, 0x7) 218 #define viddec_fw_mp4_set_num_rows_in_gob(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 25, 0x7) 219 #define viddec_fw_mp4_get_num_gobs_in_vop(x) viddec_fw_bitfields_extract((x)->svh_data, 20, 0x1F) 220 #define viddec_fw_mp4_set_num_gobs_in_vop(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 20, 0x1F) 221 #define viddec_fw_mp4_get_num_macroblocks_in_gob(x) viddec_fw_bitfields_extract((x)->svh_data, 8, 0xFFF) 222 #define viddec_fw_mp4_set_num_macroblocks_in_gob(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 8, 0xFFF) 223 #define viddec_fw_mp4_get_temporal_reference(x) viddec_fw_bitfields_extract((x)->svh_data, 0, 0xFF) 224 #define viddec_fw_mp4_set_temporal_reference(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 0, 0xFF) 225 unsigned int svh_data; 226 227 unsigned int pad1; 228 unsigned int pad2; 229 } viddec_fw_mp4_svh_t; 230 231 #endif 232