Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,14 @@ Compressed Formats
of macroblocks to decode a full corresponding frame to the matching
capture buffer.

* .. _V4L2-PIX-FMT-AV1:

- ``V4L2_PIX_FMT_AV1``
- 'AV01'
- AV1 compressed video frame. This format is adapted for implementing AV1
pipeline. The decoder implements stateful video decoder and expects one
temporal unit per buffer in OBU stream format.
The encoder generates one Temporal Unit per buffer.
.. raw:: latex

\normalsize
2 changes: 2 additions & 0 deletions drivers/media/platform/qcom/iris/iris_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ struct iris_inst;
* @BUF_SCRATCH_1: buffer to store decoding/encoding context data for HW
* @BUF_SCRATCH_2: buffer to store encoding context data for HW
* @BUF_VPSS: buffer to store VPSS context data for HW
* @BUF_PARTIAL: buffer for AV1 IBC data
* @BUF_TYPE_MAX: max buffer types
*/
enum iris_buffer_type {
Expand All @@ -42,6 +43,7 @@ enum iris_buffer_type {
BUF_SCRATCH_1,
BUF_SCRATCH_2,
BUF_VPSS,
BUF_PARTIAL,
BUF_TYPE_MAX,
};

Expand Down
8 changes: 8 additions & 0 deletions drivers/media/platform/qcom/iris/iris_ctrls.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return B_FRAME_QP_H264;
case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
return B_FRAME_QP_HEVC;
case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
return PROFILE_AV1;
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
return LEVEL_AV1;
default:
return INST_FW_CAP_MAX;
}
Expand Down Expand Up @@ -185,6 +189,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
case B_FRAME_QP_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
case PROFILE_AV1:
return V4L2_CID_MPEG_VIDEO_AV1_PROFILE;
case LEVEL_AV1:
return V4L2_CID_MPEG_VIDEO_AV1_LEVEL;
default:
return 0;
}
Expand Down
3 changes: 3 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ struct hfi_subscription_params {
u32 profile;
u32 level;
u32 tier;
u32 drap;
u32 film_grain;
u32 super_block;
};

u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
Expand Down
85 changes: 83 additions & 2 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#define UNSPECIFIED_COLOR_FORMAT 5
#define NUM_SYS_INIT_PACKETS 8
#define NUM_COMV_AV1 18

#define SYS_INIT_PKT_SIZE (sizeof(struct iris_hfi_header) + \
NUM_SYS_INIT_PACKETS * (sizeof(struct iris_hfi_packet) + sizeof(u32)))
Expand Down Expand Up @@ -121,6 +122,7 @@ static u32 iris_hfi_gen2_get_port_from_buf_type(struct iris_inst *inst,
case BUF_COMV:
case BUF_NON_COMV:
case BUF_LINE:
case BUF_PARTIAL:
return HFI_PORT_BITSTREAM;
case BUF_OUTPUT:
case BUF_DPB:
Expand Down Expand Up @@ -380,6 +382,9 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst, u32 plane)
case V4L2_PIX_FMT_H264:
profile = inst->fw_caps[PROFILE_H264].value;
break;
case V4L2_PIX_FMT_AV1:
profile = inst->fw_caps[PROFILE_AV1].value;
break;
}

inst_hfi_gen2->src_subcr_params.profile = profile;
Expand Down Expand Up @@ -409,6 +414,9 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst, u32 plane)
case V4L2_PIX_FMT_H264:
level = inst->fw_caps[LEVEL_H264].value;
break;
case V4L2_PIX_FMT_AV1:
level = inst->fw_caps[LEVEL_AV1].value;
break;
}

inst_hfi_gen2->src_subcr_params.level = level;
Expand Down Expand Up @@ -496,10 +504,12 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst, u32

static int iris_hfi_gen2_set_tier(struct iris_inst *inst, u32 plane)
{
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
u32 tier = inst->fw_caps[TIER].value;

tier = (inst->codec == V4L2_PIX_FMT_AV1) ? inst->fw_caps[TIER_AV1].value :
inst->fw_caps[TIER].value;
inst_hfi_gen2->src_subcr_params.tier = tier;

return iris_hfi_gen2_session_set_property(inst,
Expand All @@ -525,6 +535,40 @@ static int iris_hfi_gen2_set_frame_rate(struct iris_inst *inst, u32 plane)
sizeof(u32));
}

static int iris_hfi_gen2_set_film_grain(struct iris_inst *inst, u32 plane)
{
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
u32 film_grain = inst->fw_caps[FILM_GRAIN].value;

inst_hfi_gen2->src_subcr_params.film_grain = film_grain;

return iris_hfi_gen2_session_set_property(inst,
HFI_PROP_AV1_FILM_GRAIN_PRESENT,
HFI_HOST_FLAGS_NONE,
port,
HFI_PAYLOAD_U32_ENUM,
&film_grain,
sizeof(u32));
}

static int iris_hfi_gen2_set_super_block(struct iris_inst *inst, u32 plane)
{
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
u32 super_block = inst->fw_caps[SUPER_BLOCK].value;

inst_hfi_gen2->src_subcr_params.super_block = super_block;

return iris_hfi_gen2_session_set_property(inst,
HFI_PROP_AV1_SUPER_BLOCK_ENABLED,
HFI_HOST_FLAGS_NONE,
port,
HFI_PAYLOAD_U32_ENUM,
&super_block,
sizeof(u32));
}

static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
{
const struct iris_platform_data *pdata = inst->core->iris_platform_data;
Expand All @@ -548,6 +592,9 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
{HFI_PROP_LINEAR_STRIDE_SCANLINE, iris_hfi_gen2_set_linear_stride_scanline },
{HFI_PROP_TIER, iris_hfi_gen2_set_tier },
{HFI_PROP_FRAME_RATE, iris_hfi_gen2_set_frame_rate },
{HFI_PROP_AV1_FILM_GRAIN_PRESENT, iris_hfi_gen2_set_film_grain },
{HFI_PROP_AV1_SUPER_BLOCK_ENABLED, iris_hfi_gen2_set_super_block },
{HFI_PROP_OPB_ENABLE, iris_hfi_gen2_set_opb_enable },
};

if (inst->domain == DECODER) {
Expand All @@ -561,6 +608,9 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
} else if (inst->codec == V4L2_PIX_FMT_VP9) {
config_params = pdata->dec_input_config_params_vp9;
config_params_size = pdata->dec_input_config_params_vp9_size;
} else if (inst->codec == V4L2_PIX_FMT_AV1) {
config_params = pdata->dec_input_config_params_av1;
config_params_size = pdata->dec_input_config_params_av1_size;
} else {
return -EINVAL;
}
Expand Down Expand Up @@ -615,6 +665,9 @@ static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
break;
case V4L2_PIX_FMT_VP9:
codec = HFI_CODEC_DECODE_VP9;
break;
case V4L2_PIX_FMT_AV1:
codec = HFI_CODEC_DECODE_AV1;
}

iris_hfi_gen2_packet_session_property(inst,
Expand Down Expand Up @@ -780,6 +833,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
change_param_size =
core->iris_platform_data->dec_input_config_params_vp9_size;
break;
case V4L2_PIX_FMT_AV1:
change_param = core->iris_platform_data->dec_input_config_params_av1;
change_param_size =
core->iris_platform_data->dec_input_config_params_av1_size;
break;
}

payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
Expand Down Expand Up @@ -862,6 +920,16 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
payload_size = sizeof(u32);
payload_type = HFI_PAYLOAD_U32;
break;
case HFI_PROP_AV1_FILM_GRAIN_PRESENT:
payload[0] = subsc_params.film_grain;
payload_size = sizeof(u32);
payload_type = HFI_PAYLOAD_U32;
break;
case HFI_PROP_AV1_SUPER_BLOCK_ENABLED:
payload[0] = subsc_params.super_block;
payload_size = sizeof(u32);
payload_type = HFI_PAYLOAD_U32;
break;
default:
prop_type = 0;
ret = -EINVAL;
Expand Down Expand Up @@ -917,6 +985,11 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
subscribe_prop_size =
core->iris_platform_data->dec_output_prop_vp9_size;
break;
case V4L2_PIX_FMT_AV1:
subcribe_prop = core->iris_platform_data->dec_output_prop_av1;
subscribe_prop_size =
core->iris_platform_data->dec_output_prop_av1_size;
break;
}
}

Expand Down Expand Up @@ -1092,6 +1165,8 @@ static u32 iris_hfi_gen2_buf_type_from_driver(u32 domain, enum iris_buffer_type
return HFI_BUFFER_ARP;
case BUF_VPSS:
return HFI_BUFFER_VPSS;
case BUF_PARTIAL:
return HFI_BUFFER_PARTIAL_DATA;
default:
return 0;
}
Expand All @@ -1104,7 +1179,13 @@ static int iris_set_num_comv(struct iris_inst *inst)
u32 num_comv;

caps = core->iris_platform_data->inst_caps;
num_comv = caps->num_comv;

/*
* AV1 needs more comv buffers than other codecs.
* Update accordingly.
*/
num_comv = (inst->codec == V4L2_PIX_FMT_AV1) ?
NUM_COMV_AV1 : caps->num_comv;

return core->hfi_ops->session_set_property(inst,
HFI_PROP_COMV_BUFFER_COUNT,
Expand Down
9 changes: 9 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,18 @@ enum hfi_seq_header_mode {
#define HFI_PROP_DEC_START_FROM_RAP_FRAME 0x03000169
#define HFI_PROP_NO_OUTPUT 0x0300016a
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174
#define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
#define HFI_PROP_AV1_SUPER_BLOCK_ENABLED 0x03000181
#define HFI_PROP_AV1_OP_POINT 0x03000182
#define HFI_PROP_OPB_ENABLE 0x03000184
#define HFI_PROP_AV1_TILE_ROWS_COLUMNS 0x03000187
#define HFI_PROP_AV1_DRAP_CONFIG 0x03000189
#define HFI_PROP_COMV_BUFFER_COUNT 0x03000193
#define HFI_PROP_AV1_UNIFORM_TILE_SPACING 0x03000197
#define HFI_PROP_END 0x03FFFFFF

#define HFI_SESSION_ERROR_BEGIN 0x04000000
Expand Down Expand Up @@ -139,6 +147,7 @@ enum hfi_codec_type {
HFI_CODEC_DECODE_HEVC = 3,
HFI_CODEC_ENCODE_HEVC = 4,
HFI_CODEC_DECODE_VP9 = 5,
HFI_CODEC_DECODE_AV1 = 7,
};

enum hfi_picture_type {
Expand Down
22 changes: 22 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
return BUF_SCRATCH_2;
case HFI_BUFFER_PERSIST:
return BUF_PERSIST;
case HFI_BUFFER_PARTIAL_DATA:
return BUF_PARTIAL;
default:
return 0;
}
Expand All @@ -72,6 +74,7 @@ static bool iris_hfi_gen2_is_valid_hfi_buffer_type(u32 buffer_type)
case HFI_BUFFER_DPB:
case HFI_BUFFER_PERSIST:
case HFI_BUFFER_VPSS:
case HFI_BUFFER_PARTIAL_DATA:
return true;
default:
return false;
Expand Down Expand Up @@ -596,6 +599,10 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
inst->fw_caps[LEVEL_H264].value = subsc_params.level;
break;
case V4L2_PIX_FMT_AV1:
inst->fw_caps[PROFILE_AV1].value = subsc_params.profile;
inst->fw_caps[LEVEL_AV1].value = subsc_params.level;
break;
}

inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
Expand All @@ -608,6 +615,11 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
iris_inst_change_state(inst, IRIS_INST_ERROR);
}

if (inst->codec == V4L2_PIX_FMT_AV1) {
inst->fw_caps[FILM_GRAIN].value = subsc_params.film_grain;
inst->fw_caps[SUPER_BLOCK].value = subsc_params.super_block;
}

inst->fw_min_count = subsc_params.fw_min_count;
inst->buffers[BUF_OUTPUT].min_count = iris_vpu_buf_count(inst, BUF_OUTPUT);
inst->buffers[BUF_OUTPUT].size = pixmp_op->plane_fmt[0].sizeimage;
Expand Down Expand Up @@ -711,6 +723,12 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
case HFI_PROP_NO_OUTPUT:
inst_hfi_gen2->hfi_frame_info.no_output = 1;
break;
case HFI_PROP_AV1_FILM_GRAIN_PRESENT:
inst_hfi_gen2->src_subcr_params.film_grain = pkt->payload[0];
break;
case HFI_PROP_AV1_SUPER_BLOCK_ENABLED:
inst_hfi_gen2->src_subcr_params.super_block = pkt->payload[0];
break;
case HFI_PROP_QUALITY_MODE:
case HFI_PROP_STAGE:
case HFI_PROP_PIPE:
Expand Down Expand Up @@ -841,6 +859,10 @@ static void iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
subsc_params->level = inst->fw_caps[LEVEL_H264].value;
break;
case V4L2_PIX_FMT_AV1:
subsc_params->profile = inst->fw_caps[PROFILE_AV1].value;
subsc_params->level = inst->fw_caps[LEVEL_AV1].value;
break;
}

subsc_params->pic_order_cnt = inst->fw_caps[POC].value;
Expand Down
1 change: 1 addition & 0 deletions drivers/media/platform/qcom/iris/iris_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ enum iris_fmt_type_out {
IRIS_FMT_H264,
IRIS_FMT_HEVC,
IRIS_FMT_VP9,
IRIS_FMT_AV1,
};

enum iris_fmt_type_cap {
Expand Down
13 changes: 13 additions & 0 deletions drivers/media/platform/qcom/iris/iris_platform_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,13 @@ enum platform_inst_fw_cap_type {
LEVEL_H264,
LEVEL_HEVC,
LEVEL_VP9,
PROFILE_AV1,
LEVEL_AV1,
TIER_AV1,
DRAP,
FILM_GRAIN,
SUPER_BLOCK,
ENH_LAYER_COUNT,
INPUT_BUF_HOST_MAX_COUNT,
OUTPUT_BUF_HOST_MAX_COUNT,
STAGE,
Expand Down Expand Up @@ -217,6 +224,8 @@ struct iris_platform_data {
u64 dma_mask;
const char *fwname;
u32 pas_id;
struct iris_fmt *inst_iris_fmts;
u32 inst_iris_fmts_size;
struct platform_inst_caps *inst_caps;
const struct platform_inst_fw_cap *inst_fw_caps_dec;
u32 inst_fw_caps_dec_size;
Expand All @@ -239,6 +248,8 @@ struct iris_platform_data {
unsigned int dec_input_config_params_hevc_size;
const u32 *dec_input_config_params_vp9;
unsigned int dec_input_config_params_vp9_size;
const u32 *dec_input_config_params_av1;
unsigned int dec_input_config_params_av1_size;
const u32 *dec_output_config_params;
unsigned int dec_output_config_params_size;
const u32 *enc_input_config_params;
Expand All @@ -253,6 +264,8 @@ struct iris_platform_data {
unsigned int dec_output_prop_hevc_size;
const u32 *dec_output_prop_vp9;
unsigned int dec_output_prop_vp9_size;
const u32 *dec_output_prop_av1;
unsigned int dec_output_prop_av1_size;
const u32 *dec_ip_int_buf_tbl;
unsigned int dec_ip_int_buf_tbl_size;
const u32 *dec_op_int_buf_tbl;
Expand Down
Loading