Skip to content

Commit 3a906a2

Browse files
authored
Merge pull request #308 from gouravk-qualcomm/backport-iris-venus-av1-v3
BACKPORT: media: iris/venus: AV1 decode enablement and EOS quirk fix
2 parents 313e97d + e1ba742 commit 3a906a2

18 files changed

Lines changed: 754 additions & 27 deletions

Documentation/userspace-api/media/v4l/pixfmt-compressed.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,14 @@ Compressed Formats
274274
of macroblocks to decode a full corresponding frame to the matching
275275
capture buffer.
276276

277+
* .. _V4L2-PIX-FMT-AV1:
278+
279+
- ``V4L2_PIX_FMT_AV1``
280+
- 'AV01'
281+
- AV1 compressed video frame. This format is adapted for implementing AV1
282+
pipeline. The decoder implements stateful video decoder and expects one
283+
temporal unit per buffer in OBU stream format.
284+
The encoder generates one Temporal Unit per buffer.
277285
.. raw:: latex
278286

279287
\normalsize

drivers/media/platform/qcom/iris/iris_buffer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct iris_inst;
2727
* @BUF_SCRATCH_1: buffer to store decoding/encoding context data for HW
2828
* @BUF_SCRATCH_2: buffer to store encoding context data for HW
2929
* @BUF_VPSS: buffer to store VPSS context data for HW
30+
* @BUF_PARTIAL: buffer for AV1 IBC data
3031
* @BUF_TYPE_MAX: max buffer types
3132
*/
3233
enum iris_buffer_type {
@@ -42,6 +43,7 @@ enum iris_buffer_type {
4243
BUF_SCRATCH_1,
4344
BUF_SCRATCH_2,
4445
BUF_VPSS,
46+
BUF_PARTIAL,
4547
BUF_TYPE_MAX,
4648
};
4749

drivers/media/platform/qcom/iris/iris_ctrls.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
9898
return B_FRAME_QP_H264;
9999
case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
100100
return B_FRAME_QP_HEVC;
101+
case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
102+
return PROFILE_AV1;
103+
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
104+
return LEVEL_AV1;
101105
default:
102106
return INST_FW_CAP_MAX;
103107
}
@@ -185,6 +189,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
185189
return V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
186190
case B_FRAME_QP_HEVC:
187191
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
192+
case PROFILE_AV1:
193+
return V4L2_CID_MPEG_VIDEO_AV1_PROFILE;
194+
case LEVEL_AV1:
195+
return V4L2_CID_MPEG_VIDEO_AV1_LEVEL;
188196
default:
189197
return 0;
190198
}

drivers/media/platform/qcom/iris/iris_hfi_common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ struct hfi_subscription_params {
141141
u32 profile;
142142
u32 level;
143143
u32 tier;
144+
u32 drap;
145+
u32 film_grain;
146+
u32 super_block;
144147
};
145148

146149
u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);

drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#define UNSPECIFIED_COLOR_FORMAT 5
1212
#define NUM_SYS_INIT_PACKETS 8
13+
#define NUM_COMV_AV1 18
1314

1415
#define SYS_INIT_PKT_SIZE (sizeof(struct iris_hfi_header) + \
1516
NUM_SYS_INIT_PACKETS * (sizeof(struct iris_hfi_packet) + sizeof(u32)))
@@ -121,6 +122,7 @@ static u32 iris_hfi_gen2_get_port_from_buf_type(struct iris_inst *inst,
121122
case BUF_COMV:
122123
case BUF_NON_COMV:
123124
case BUF_LINE:
125+
case BUF_PARTIAL:
124126
return HFI_PORT_BITSTREAM;
125127
case BUF_OUTPUT:
126128
case BUF_DPB:
@@ -380,6 +382,9 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst, u32 plane)
380382
case V4L2_PIX_FMT_H264:
381383
profile = inst->fw_caps[PROFILE_H264].value;
382384
break;
385+
case V4L2_PIX_FMT_AV1:
386+
profile = inst->fw_caps[PROFILE_AV1].value;
387+
break;
383388
}
384389

385390
inst_hfi_gen2->src_subcr_params.profile = profile;
@@ -409,6 +414,9 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst, u32 plane)
409414
case V4L2_PIX_FMT_H264:
410415
level = inst->fw_caps[LEVEL_H264].value;
411416
break;
417+
case V4L2_PIX_FMT_AV1:
418+
level = inst->fw_caps[LEVEL_AV1].value;
419+
break;
412420
}
413421

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

497505
static int iris_hfi_gen2_set_tier(struct iris_inst *inst, u32 plane)
498506
{
499-
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
500507
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
508+
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
501509
u32 tier = inst->fw_caps[TIER].value;
502510

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

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

538+
static int iris_hfi_gen2_set_film_grain(struct iris_inst *inst, u32 plane)
539+
{
540+
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
541+
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
542+
u32 film_grain = inst->fw_caps[FILM_GRAIN].value;
543+
544+
inst_hfi_gen2->src_subcr_params.film_grain = film_grain;
545+
546+
return iris_hfi_gen2_session_set_property(inst,
547+
HFI_PROP_AV1_FILM_GRAIN_PRESENT,
548+
HFI_HOST_FLAGS_NONE,
549+
port,
550+
HFI_PAYLOAD_U32_ENUM,
551+
&film_grain,
552+
sizeof(u32));
553+
}
554+
555+
static int iris_hfi_gen2_set_super_block(struct iris_inst *inst, u32 plane)
556+
{
557+
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
558+
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
559+
u32 super_block = inst->fw_caps[SUPER_BLOCK].value;
560+
561+
inst_hfi_gen2->src_subcr_params.super_block = super_block;
562+
563+
return iris_hfi_gen2_session_set_property(inst,
564+
HFI_PROP_AV1_SUPER_BLOCK_ENABLED,
565+
HFI_HOST_FLAGS_NONE,
566+
port,
567+
HFI_PAYLOAD_U32_ENUM,
568+
&super_block,
569+
sizeof(u32));
570+
}
571+
528572
static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
529573
{
530574
const struct iris_platform_data *pdata = inst->core->iris_platform_data;
@@ -548,6 +592,9 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
548592
{HFI_PROP_LINEAR_STRIDE_SCANLINE, iris_hfi_gen2_set_linear_stride_scanline },
549593
{HFI_PROP_TIER, iris_hfi_gen2_set_tier },
550594
{HFI_PROP_FRAME_RATE, iris_hfi_gen2_set_frame_rate },
595+
{HFI_PROP_AV1_FILM_GRAIN_PRESENT, iris_hfi_gen2_set_film_grain },
596+
{HFI_PROP_AV1_SUPER_BLOCK_ENABLED, iris_hfi_gen2_set_super_block },
597+
{HFI_PROP_OPB_ENABLE, iris_hfi_gen2_set_opb_enable },
551598
};
552599

553600
if (inst->domain == DECODER) {
@@ -561,6 +608,9 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
561608
} else if (inst->codec == V4L2_PIX_FMT_VP9) {
562609
config_params = pdata->dec_input_config_params_vp9;
563610
config_params_size = pdata->dec_input_config_params_vp9_size;
611+
} else if (inst->codec == V4L2_PIX_FMT_AV1) {
612+
config_params = pdata->dec_input_config_params_av1;
613+
config_params_size = pdata->dec_input_config_params_av1_size;
564614
} else {
565615
return -EINVAL;
566616
}
@@ -615,6 +665,9 @@ static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
615665
break;
616666
case V4L2_PIX_FMT_VP9:
617667
codec = HFI_CODEC_DECODE_VP9;
668+
break;
669+
case V4L2_PIX_FMT_AV1:
670+
codec = HFI_CODEC_DECODE_AV1;
618671
}
619672

620673
iris_hfi_gen2_packet_session_property(inst,
@@ -780,6 +833,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
780833
change_param_size =
781834
core->iris_platform_data->dec_input_config_params_vp9_size;
782835
break;
836+
case V4L2_PIX_FMT_AV1:
837+
change_param = core->iris_platform_data->dec_input_config_params_av1;
838+
change_param_size =
839+
core->iris_platform_data->dec_input_config_params_av1_size;
840+
break;
783841
}
784842

785843
payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
@@ -862,6 +920,16 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
862920
payload_size = sizeof(u32);
863921
payload_type = HFI_PAYLOAD_U32;
864922
break;
923+
case HFI_PROP_AV1_FILM_GRAIN_PRESENT:
924+
payload[0] = subsc_params.film_grain;
925+
payload_size = sizeof(u32);
926+
payload_type = HFI_PAYLOAD_U32;
927+
break;
928+
case HFI_PROP_AV1_SUPER_BLOCK_ENABLED:
929+
payload[0] = subsc_params.super_block;
930+
payload_size = sizeof(u32);
931+
payload_type = HFI_PAYLOAD_U32;
932+
break;
865933
default:
866934
prop_type = 0;
867935
ret = -EINVAL;
@@ -917,6 +985,11 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
917985
subscribe_prop_size =
918986
core->iris_platform_data->dec_output_prop_vp9_size;
919987
break;
988+
case V4L2_PIX_FMT_AV1:
989+
subcribe_prop = core->iris_platform_data->dec_output_prop_av1;
990+
subscribe_prop_size =
991+
core->iris_platform_data->dec_output_prop_av1_size;
992+
break;
920993
}
921994
}
922995

@@ -1092,6 +1165,8 @@ static u32 iris_hfi_gen2_buf_type_from_driver(u32 domain, enum iris_buffer_type
10921165
return HFI_BUFFER_ARP;
10931166
case BUF_VPSS:
10941167
return HFI_BUFFER_VPSS;
1168+
case BUF_PARTIAL:
1169+
return HFI_BUFFER_PARTIAL_DATA;
10951170
default:
10961171
return 0;
10971172
}
@@ -1104,7 +1179,13 @@ static int iris_set_num_comv(struct iris_inst *inst)
11041179
u32 num_comv;
11051180

11061181
caps = core->iris_platform_data->inst_caps;
1107-
num_comv = caps->num_comv;
1182+
1183+
/*
1184+
* AV1 needs more comv buffers than other codecs.
1185+
* Update accordingly.
1186+
*/
1187+
num_comv = (inst->codec == V4L2_PIX_FMT_AV1) ?
1188+
NUM_COMV_AV1 : caps->num_comv;
11081189

11091190
return core->hfi_ops->session_set_property(inst,
11101191
HFI_PROP_COMV_BUFFER_COUNT,

drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,18 @@ enum hfi_seq_header_mode {
8989
#define HFI_PROP_DEC_START_FROM_RAP_FRAME 0x03000169
9090
#define HFI_PROP_NO_OUTPUT 0x0300016a
9191
#define HFI_PROP_BUFFER_MARK 0x0300016c
92+
#define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174
93+
#define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175
9294
#define HFI_PROP_RAW_RESOLUTION 0x03000178
9395
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
96+
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
97+
#define HFI_PROP_AV1_SUPER_BLOCK_ENABLED 0x03000181
98+
#define HFI_PROP_AV1_OP_POINT 0x03000182
9499
#define HFI_PROP_OPB_ENABLE 0x03000184
100+
#define HFI_PROP_AV1_TILE_ROWS_COLUMNS 0x03000187
101+
#define HFI_PROP_AV1_DRAP_CONFIG 0x03000189
95102
#define HFI_PROP_COMV_BUFFER_COUNT 0x03000193
103+
#define HFI_PROP_AV1_UNIFORM_TILE_SPACING 0x03000197
96104
#define HFI_PROP_END 0x03FFFFFF
97105

98106
#define HFI_SESSION_ERROR_BEGIN 0x04000000
@@ -139,6 +147,7 @@ enum hfi_codec_type {
139147
HFI_CODEC_DECODE_HEVC = 3,
140148
HFI_CODEC_ENCODE_HEVC = 4,
141149
HFI_CODEC_DECODE_VP9 = 5,
150+
HFI_CODEC_DECODE_AV1 = 7,
142151
};
143152

144153
enum hfi_picture_type {

drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
5454
return BUF_SCRATCH_2;
5555
case HFI_BUFFER_PERSIST:
5656
return BUF_PERSIST;
57+
case HFI_BUFFER_PARTIAL_DATA:
58+
return BUF_PARTIAL;
5759
default:
5860
return 0;
5961
}
@@ -72,6 +74,7 @@ static bool iris_hfi_gen2_is_valid_hfi_buffer_type(u32 buffer_type)
7274
case HFI_BUFFER_DPB:
7375
case HFI_BUFFER_PERSIST:
7476
case HFI_BUFFER_VPSS:
77+
case HFI_BUFFER_PARTIAL_DATA:
7578
return true;
7679
default:
7780
return false;
@@ -596,6 +599,10 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
596599
inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
597600
inst->fw_caps[LEVEL_H264].value = subsc_params.level;
598601
break;
602+
case V4L2_PIX_FMT_AV1:
603+
inst->fw_caps[PROFILE_AV1].value = subsc_params.profile;
604+
inst->fw_caps[LEVEL_AV1].value = subsc_params.level;
605+
break;
599606
}
600607

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

618+
if (inst->codec == V4L2_PIX_FMT_AV1) {
619+
inst->fw_caps[FILM_GRAIN].value = subsc_params.film_grain;
620+
inst->fw_caps[SUPER_BLOCK].value = subsc_params.super_block;
621+
}
622+
611623
inst->fw_min_count = subsc_params.fw_min_count;
612624
inst->buffers[BUF_OUTPUT].min_count = iris_vpu_buf_count(inst, BUF_OUTPUT);
613625
inst->buffers[BUF_OUTPUT].size = pixmp_op->plane_fmt[0].sizeimage;
@@ -711,6 +723,12 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
711723
case HFI_PROP_NO_OUTPUT:
712724
inst_hfi_gen2->hfi_frame_info.no_output = 1;
713725
break;
726+
case HFI_PROP_AV1_FILM_GRAIN_PRESENT:
727+
inst_hfi_gen2->src_subcr_params.film_grain = pkt->payload[0];
728+
break;
729+
case HFI_PROP_AV1_SUPER_BLOCK_ENABLED:
730+
inst_hfi_gen2->src_subcr_params.super_block = pkt->payload[0];
731+
break;
714732
case HFI_PROP_QUALITY_MODE:
715733
case HFI_PROP_STAGE:
716734
case HFI_PROP_PIPE:
@@ -841,6 +859,10 @@ static void iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
841859
subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
842860
subsc_params->level = inst->fw_caps[LEVEL_H264].value;
843861
break;
862+
case V4L2_PIX_FMT_AV1:
863+
subsc_params->profile = inst->fw_caps[PROFILE_AV1].value;
864+
subsc_params->level = inst->fw_caps[LEVEL_AV1].value;
865+
break;
844866
}
845867

846868
subsc_params->pic_order_cnt = inst->fw_caps[POC].value;

drivers/media/platform/qcom/iris/iris_instance.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enum iris_fmt_type_out {
1919
IRIS_FMT_H264,
2020
IRIS_FMT_HEVC,
2121
IRIS_FMT_VP9,
22+
IRIS_FMT_AV1,
2223
};
2324

2425
enum iris_fmt_type_cap {

drivers/media/platform/qcom/iris/iris_platform_common.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ enum platform_inst_fw_cap_type {
103103
LEVEL_H264,
104104
LEVEL_HEVC,
105105
LEVEL_VP9,
106+
PROFILE_AV1,
107+
LEVEL_AV1,
108+
TIER_AV1,
109+
DRAP,
110+
FILM_GRAIN,
111+
SUPER_BLOCK,
112+
ENH_LAYER_COUNT,
106113
INPUT_BUF_HOST_MAX_COUNT,
107114
OUTPUT_BUF_HOST_MAX_COUNT,
108115
STAGE,
@@ -217,6 +224,8 @@ struct iris_platform_data {
217224
u64 dma_mask;
218225
const char *fwname;
219226
u32 pas_id;
227+
struct iris_fmt *inst_iris_fmts;
228+
u32 inst_iris_fmts_size;
220229
struct platform_inst_caps *inst_caps;
221230
const struct platform_inst_fw_cap *inst_fw_caps_dec;
222231
u32 inst_fw_caps_dec_size;
@@ -239,6 +248,8 @@ struct iris_platform_data {
239248
unsigned int dec_input_config_params_hevc_size;
240249
const u32 *dec_input_config_params_vp9;
241250
unsigned int dec_input_config_params_vp9_size;
251+
const u32 *dec_input_config_params_av1;
252+
unsigned int dec_input_config_params_av1_size;
242253
const u32 *dec_output_config_params;
243254
unsigned int dec_output_config_params_size;
244255
const u32 *enc_input_config_params;
@@ -253,6 +264,8 @@ struct iris_platform_data {
253264
unsigned int dec_output_prop_hevc_size;
254265
const u32 *dec_output_prop_vp9;
255266
unsigned int dec_output_prop_vp9_size;
267+
const u32 *dec_output_prop_av1;
268+
unsigned int dec_output_prop_av1_size;
256269
const u32 *dec_ip_int_buf_tbl;
257270
unsigned int dec_ip_int_buf_tbl_size;
258271
const u32 *dec_op_int_buf_tbl;

0 commit comments

Comments
 (0)