blob: bb772d4e5cec0f8ddd8a92321a3828a8185dddc3 [file] [log] [blame]
#ifndef VIDDEC_FW_MP4_H
#define VIDDEC_FW_MP4_H
#include "viddec_fw_workload.h"
enum viddec_fw_mp4_ref_frame_id
{
VIDDEC_MP4_FRAME_CURRENT = 0,
VIDDEC_MP4_FRAME_PAST = 1,
VIDDEC_MP4_FRAME_FUTURE = 2,
VIDDEC_MP4_FRAME_MAX = 3,
};
enum mp4_workload_item_type
{
VIDDEC_WORKLOAD_MP4_PAST_FRAME = VIDDEC_WORKLOAD_REF_FRAME_SOURCE_0,
VIDDEC_WORKLOAD_MP4_FUTURE_FRAME,
VIDDEC_WORKLOAD_MP4_VOL_INFO = VIDDEC_WORKLOAD_DECODER_SPECIFIC,
VIDDEC_WORKLOAD_MP4_VOP_INFO,
VIDDEC_WORKLOAD_MP4_BVOP_INFO,
VIDDEC_WORKLOAD_MP4_SPRT_TRAJ,
VIDDEC_WORKLOAD_MP4_IQUANT,
VIDDEC_WORKLOAD_MP4_NIQUANT,
VIDDEC_WORKLOAD_MP4_SVH,
};
enum viddec_fw_mp4_vop_coding_type_t
{
VIDDEC_MP4_VOP_TYPE_I = 0,
VIDDEC_MP4_VOP_TYPE_P,
VIDDEC_MP4_VOP_TYPE_B,
VIDDEC_MP4_VOP_TYPE_S
};
// This structure contains the information extracted from the Video Object Layer.
// This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_VOL_INFO, using
// the "vwi_payload" array in viddec_workload_item_t.
// TODO: Add default values in the comments for each item
typedef struct
{
// Flags extracted from the Video Object Layer
// 0:0 - short_video_header
// 1:2 - vol_shape
// 3:3 - interlaced
// 4:4 - obmc_disable
// 5:5 - quarter_sample
// 6:6 - resync_marker_disable
// 7:7 - data_partitioned
// 8:8 - reversible_vlc
#define viddec_fw_mp4_get_reversible_vlc(x) viddec_fw_bitfields_extract((x)->vol_flags, 8, 0x1)
#define viddec_fw_mp4_set_reversible_vlc(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 8, 0x1)
#define viddec_fw_mp4_get_data_partitioned(x) viddec_fw_bitfields_extract((x)->vol_flags, 7, 0x1)
#define viddec_fw_mp4_set_data_partitioned(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 7, 0x1)
#define viddec_fw_mp4_get_resync_marker_disable(x) viddec_fw_bitfields_extract((x)->vol_flags, 6, 0x1)
#define viddec_fw_mp4_set_resync_marker_disable(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 6, 0x1)
#define viddec_fw_mp4_get_quarter_sample(x) viddec_fw_bitfields_extract((x)->vol_flags, 5, 0x1)
#define viddec_fw_mp4_set_quarter_sample(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 5, 0x1)
#define viddec_fw_mp4_get_obmc_disable(x) viddec_fw_bitfields_extract((x)->vol_flags, 4, 0x1)
#define viddec_fw_mp4_set_obmc_disable(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 4, 0x1)
#define viddec_fw_mp4_get_interlaced(x) viddec_fw_bitfields_extract((x)->vol_flags, 3, 0x1)
#define viddec_fw_mp4_set_interlaced(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 3, 0x1)
#define viddec_fw_mp4_get_vol_shape(x) viddec_fw_bitfields_extract((x)->vol_flags, 1, 0x3)
#define viddec_fw_mp4_set_vol_shape(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 1, 0x3)
#define viddec_fw_mp4_get_short_video_header_flag(x) viddec_fw_bitfields_extract((x)->vol_flags, 0, 0x1)
#define viddec_fw_mp4_set_short_video_header_flag(x, val) viddec_fw_bitfields_insert((x)->vol_flags, val, 0, 0x1)
unsigned int vol_flags;
// Size extracted from the Video Object Layer
// 0:12 - width
// 13:25 - height
// MFD_MPG4VD_MB_PER_ROW can be calculated as (width+15) >> 4
// MFD_MPG4VD_MB_ROWS can be calculated as (height+15) >> 4
#define viddec_fw_mp4_get_vol_width(x) viddec_fw_bitfields_extract((x)->vol_size, 13, 0x1FFF)
#define viddec_fw_mp4_set_vol_width(x, val) viddec_fw_bitfields_insert((x)->vol_size, val, 13, 0x1FFF)
#define viddec_fw_mp4_get_vol_height(x) viddec_fw_bitfields_extract((x)->vol_size, 0, 0x1FFF)
#define viddec_fw_mp4_set_vol_height(x, val) viddec_fw_bitfields_insert((x)->vol_size, val, 0, 0x1FFF)
unsigned int vol_size;
// Sprite, time increments and quantization details from the Video Object Layer
// 0:15 - vop_time_increment_resolution
// 16:17 - sprite_enable
// 18:23 - sprite_warping_points
// 24:25 - sprite_warping_accuracy
// 26:29 - quant_precision
// 30:30 - quant_type
#define viddec_fw_mp4_get_quant_type(x) viddec_fw_bitfields_extract((x)->vol_item, 30, 0x1)
#define viddec_fw_mp4_set_quant_type(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 30, 0x1)
#define viddec_fw_mp4_get_quant_precision(x) viddec_fw_bitfields_extract((x)->vol_item, 26, 0xF)
#define viddec_fw_mp4_set_quant_precision(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 26, 0xF)
#define viddec_fw_mp4_get_sprite_warping_accuracy(x) viddec_fw_bitfields_extract((x)->vol_item, 24, 0x3)
#define viddec_fw_mp4_set_sprite_warping_accuracy(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 24, 0x3)
#define viddec_fw_mp4_get_sprite_warping_points(x) viddec_fw_bitfields_extract((x)->vol_item, 18, 0x3F)
#define viddec_fw_mp4_set_sprite_warping_points(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 18, 0x3F)
#define viddec_fw_mp4_get_sprite_enable(x) viddec_fw_bitfields_extract((x)->vol_item, 16, 0x3)
#define viddec_fw_mp4_set_sprite_enable(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 16, 0x3)
#define viddec_fw_mp4_get_vop_time_increment_resolution(x) viddec_fw_bitfields_extract((x)->vol_item, 0, 0xFFFF)
#define viddec_fw_mp4_set_vop_time_increment_resolution(x, val) viddec_fw_bitfields_insert((x)->vol_item, val, 0, 0xFFFF)
unsigned int vol_item;
} viddec_fw_mp4_vol_info_t;
// This structure contains the information extracted from the Video Object Layer.
// This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_VOP_INFO, using
// the "vwi_payload" array in viddec_workload_item_t.
// TODO: Add default values in the comments for each item
typedef struct
{
// Frame Info - to populate register MFD_MPG4VD_BSP_FRAME_INFO
// 0:4 - current_frame_id
// 5:5 - current_field_frame
// 6:10 - future_frame_id
// 11:11 - future_field_frame
// 12:16 - past_frame_id
// 17:17 - past_field_frame
#define viddec_fw_mp4_get_past_field_frame(x) viddec_fw_bitfields_extract((x)->frame_info, 17, 0x1)
#define viddec_fw_mp4_set_past_field_frame(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 17, 0x1)
#define viddec_fw_mp4_get_past_frame_id(x) viddec_fw_bitfields_extract((x)->frame_info, 12, 0x1F)
#define viddec_fw_mp4_set_past_frame_id(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 12, 0x1F)
#define viddec_fw_mp4_get_future_field_frame(x) viddec_fw_bitfields_extract((x)->frame_info, 11, 0x1)
#define viddec_fw_mp4_set_future_field_frame(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 11, 0x1)
#define viddec_fw_mp4_get_future_frame_id(x) viddec_fw_bitfields_extract((x)->frame_info, 6, 0x1F)
#define viddec_fw_mp4_set_future_frame_id(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 6, 0x1F)
#define viddec_fw_mp4_get_current_field_frame(x) viddec_fw_bitfields_extract((x)->frame_info, 5, 0x1)
#define viddec_fw_mp4_set_current_field_frame(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 5, 0x1)
#define viddec_fw_mp4_get_current_frame_id(x) viddec_fw_bitfields_extract((x)->frame_info, 0, 0x1F)
#define viddec_fw_mp4_set_current_frame_id(x, val) viddec_fw_bitfields_insert((x)->frame_info, val, 0, 0x1F)
unsigned int frame_info;
// Video Object Plane Info
// 0:1 - vop_coding_type
// 2:2 - vop_rounding_type
// 3:5 - intra_dc_vlc_thr
// 6:6 - top_field_first
// 7:7 - alternate_vertical_scan_flag
// 8:16 - vop_quant
// 17:19 - vop_fcode_forward
// 20:22 - vop_fcode_backward
// 23:31 - quant_scale
#define viddec_fw_mp4_get_vop_quant_scale(x) viddec_fw_bitfields_extract((x)->vop_data, 23, 0x1FF)
#define viddec_fw_mp4_set_vop_quant_scale(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 23, 0x1FF)
#define viddec_fw_mp4_get_vop_fcode_backward(x) viddec_fw_bitfields_extract((x)->vop_data, 20, 0x7)
#define viddec_fw_mp4_set_vop_fcode_backward(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 20, 0x7)
#define viddec_fw_mp4_get_vop_fcode_forward(x) viddec_fw_bitfields_extract((x)->vop_data, 17, 0x7)
#define viddec_fw_mp4_set_vop_fcode_forward(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 17, 0x7)
#define viddec_fw_mp4_get_vop_quant(x) viddec_fw_bitfields_extract((x)->vop_data, 8, 0x1FF)
#define viddec_fw_mp4_set_vop_quant(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 8, 0x1FF)
#define viddec_fw_mp4_get_alternate_vertical_scan_flag(x) viddec_fw_bitfields_extract((x)->vop_data, 7, 0x1)
#define viddec_fw_mp4_set_alternate_vertical_scan_flag(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 7, 0x1)
#define viddec_fw_mp4_get_top_field_first(x) viddec_fw_bitfields_extract((x)->vop_data, 6, 0x1)
#define viddec_fw_mp4_set_top_field_first(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 6, 0x1)
#define viddec_fw_mp4_get_intra_dc_vlc_thr(x) viddec_fw_bitfields_extract((x)->vop_data, 3, 0x7)
#define viddec_fw_mp4_set_intra_dc_vlc_thr(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 3, 0x7)
#define viddec_fw_mp4_get_vop_rounding_type(x) viddec_fw_bitfields_extract((x)->vop_data, 2, 0x1)
#define viddec_fw_mp4_set_vop_rounding_type(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 2, 0x1)
#define viddec_fw_mp4_get_vop_coding_type(x) viddec_fw_bitfields_extract((x)->vop_data, 0, 0x3)
#define viddec_fw_mp4_set_vop_coding_type(x, val) viddec_fw_bitfields_insert((x)->vop_data, val, 0, 0x3)
unsigned int vop_data;
// No of bits used in first byte of MB data
unsigned int bit_offset;
} viddec_fw_mp4_vop_info_t;
// This structure contains the information extracted from the Video Object Layer.
// This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_BVOP_INFO, using
// the "vwi_payload" array in viddec_workload_item_t.
// TODO: Add default values in the comments for each item
typedef struct
{
// Frame period = T(first B-VOP after VOL) - T(past reference of first B-VOP after VOL)
unsigned int Tframe;
// TRD is the difference in temporal reference of the temporally next reference VOP with
// temporally previous reference VOP, assuming B-VOPs or skipped VOPs in between.
unsigned int TRD;
// TRB is the difference in temporal reference of the B-VOP and the previous reference VOP.
unsigned int TRB;
} viddec_fw_mp4_bvop_info_t;
// This structure contains the information extracted from the sprite trajectory.
// This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_SPRT_TRAJ,
// using the fields vwi_payload in viddec_workload_item_t.
// TODO: Add default values in the comments for each item
typedef struct
{
// Sprite Trajectory can have dmv_codes for each warping point.
// 0:13 - warping_mv_code_dv
// 14:27 - warping_mv_code_du
// 28:31 - warping_point_index - identifies which warping point the warping code refers to.
// The default value for index is 0xF which should be treated as invalid.
#define viddec_fw_mp4_get_warping_point_index(x) viddec_fw_bitfields_extract((x), 28, 0xF)
#define viddec_fw_mp4_set_warping_point_index(x, val) viddec_fw_bitfields_insert((x), val, 28, 0xF)
#define viddec_fw_mp4_get_warping_mv_code_du(x) viddec_fw_bitfields_extract((x), 14, 0x3FFF)
#define viddec_fw_mp4_set_warping_mv_code_du(x, val) viddec_fw_bitfields_insert((x), val, 14, 0x3FFF)
#define viddec_fw_mp4_get_warping_mv_code_dv(x) viddec_fw_bitfields_extract((x), 0, 0x3FFF)
#define viddec_fw_mp4_set_warping_mv_code_dv(x, val) viddec_fw_bitfields_insert((x), val, 0, 0x3FFF)
unsigned int warping_mv_code[3];
} viddec_fw_mp4_sprite_trajectory_t;
// IQUANT entries will be populated in the workload using items of type VIDDEC_WORKLOAD_MP4_IQUANT and the
// vwi_payload array. The entries will be in the order in which they need to be programmed in the registers.
// There is no need for a separate structure for these values.
// This structure contains the information extracted from the Video Plane with Short Header.
// This info will be populated in the workload as item type VIDDEC_WORKLOAD_MP4_SVH, using
// the "vwi_payload" array in viddec_workload_item_t.
// TODO: Add default values in the comments for each item
typedef struct
{
// Video Plane with Short Header
// 0:7 - temporal_reference
// 8:19 - num_macroblocks_in_gob
// 20:24 - num_gobs_in_vop
// 25:27 - num_rows_in_gob
#define viddec_fw_mp4_get_num_rows_in_gob(x) viddec_fw_bitfields_extract((x)->svh_data, 25, 0x7)
#define viddec_fw_mp4_set_num_rows_in_gob(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 25, 0x7)
#define viddec_fw_mp4_get_num_gobs_in_vop(x) viddec_fw_bitfields_extract((x)->svh_data, 20, 0x1F)
#define viddec_fw_mp4_set_num_gobs_in_vop(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 20, 0x1F)
#define viddec_fw_mp4_get_num_macroblocks_in_gob(x) viddec_fw_bitfields_extract((x)->svh_data, 8, 0xFFF)
#define viddec_fw_mp4_set_num_macroblocks_in_gob(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 8, 0xFFF)
#define viddec_fw_mp4_get_temporal_reference(x) viddec_fw_bitfields_extract((x)->svh_data, 0, 0xFF)
#define viddec_fw_mp4_set_temporal_reference(x, val) viddec_fw_bitfields_insert((x)->svh_data, val, 0, 0xFF)
unsigned int svh_data;
unsigned int pad1;
unsigned int pad2;
} viddec_fw_mp4_svh_t;
#endif