Selaa lähdekoodia

video: driver: Add support for AV1 dynamic frame resolution change

AV1 bitstream frames can have different resolutions than
sequence resolutions. Subscribe to BITSTREAM_RESOLUTION and
CROP_OFFSETS metadatas and exopose them to clients so that
clients can receive per-frame resolution and crop.

Change-Id: I7c0503f25ddde201979d13ff18028681f685d649
Signed-off-by: Mihir Ganu <[email protected]>
Mihir Ganu 3 vuotta sitten
vanhempi
sitoutus
1b5a6b1d6f

+ 12 - 0
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -1491,6 +1491,18 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		0,
 		HFI_PROP_AV1_SUPER_BLOCK_ENABLED},
 
+	{META_BITSTREAM_RESOLUTION, DEC, AV1,
+		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_BITSTREAM_RESOLUTION,
+		HFI_PROP_BITSTREAM_RESOLUTION},
+
+	{META_CROP_OFFSETS, DEC, AV1,
+		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_CROP_OFFSETS,
+		HFI_PROP_CROP_OFFSETS},
+
 	{META_LTR_MARK_USE, ENC, H264|HEVC,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,

+ 3 - 1
driver/vidc/inc/msm_vidc_driver.h

@@ -114,7 +114,9 @@ static inline bool is_output_meta_enabled(struct msm_vidc_inst *inst)
 	bool enabled = false;
 
 	if (is_decode_session(inst)) {
-		enabled = (inst->capabilities->cap[META_DPB_MISR].value ||
+		enabled = (inst->capabilities->cap[META_BITSTREAM_RESOLUTION].value ||
+			inst->capabilities->cap[META_CROP_OFFSETS].value ||
+			inst->capabilities->cap[META_DPB_MISR].value ||
 			inst->capabilities->cap[META_OPB_MISR].value ||
 			inst->capabilities->cap[META_INTERLACE].value ||
 			inst->capabilities->cap[META_CONCEALED_MB_CNT].value ||

+ 2 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -472,6 +472,8 @@ enum msm_vidc_inst_capability_type {
 	FILM_GRAIN,
 	SUPER_BLOCK,
 	ALL_INTRA,
+	META_BITSTREAM_RESOLUTION,
+	META_CROP_OFFSETS,
 	META_LTR_MARK_USE,
 	META_DPB_MISR,
 	META_OPB_MISR,

+ 2 - 0
driver/vidc/src/msm_vdec.c

@@ -1183,6 +1183,8 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
 	static const u32 metadata_list[] = {
+		META_BITSTREAM_RESOLUTION,
+		META_CROP_OFFSETS,
 		META_DPB_MISR,
 		META_OPB_MISR,
 		META_INTERLACE,

+ 3 - 1
driver/vidc/src/msm_vidc_control.c

@@ -80,7 +80,9 @@ static bool is_meta_ctrl(u32 id)
 		id == V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA);
+		id == V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA ||
+		id == V4L2_CID_MPEG_VIDC_METADATA_BITSTREAM_RESOLUTION ||
+		id == V4L2_CID_MPEG_VIDC_METADATA_CROP_OFFSETS);
 }
 
 static const char *const mpeg_video_rate_control[] = {

+ 2 - 0
driver/vidc/src/msm_vidc_driver.c

@@ -168,6 +168,8 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{FILM_GRAIN,                     "FILM_GRAIN"                 },
 	{SUPER_BLOCK,                    "SUPER_BLOCK"                },
 	{ALL_INTRA,                      "ALL_INTRA"                  },
+	{META_BITSTREAM_RESOLUTION,      "META_BITSTREAM_RESOLUTION"  },
+	{META_CROP_OFFSETS,              "META_CROP_OFFSETS"          },
 	{META_LTR_MARK_USE,              "META_LTR_MARK_USE"          },
 	{META_DPB_MISR,                  "META_DPB_MISR"              },
 	{META_OPB_MISR,                  "META_OPB_MISR"              },

+ 6 - 0
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -123,6 +123,10 @@ enum v4l2_mpeg_vidc_blur_types {
 	(V4L2_CID_MPEG_VIDC_BASE + 0x22)
 #define V4L2_CID_MPEG_VIDC_MIN_BITSTREAM_SIZE_OVERWRITE                       \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x23)
+#define V4L2_CID_MPEG_VIDC_METADATA_BITSTREAM_RESOLUTION                      \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x24)
+#define V4L2_CID_MPEG_VIDC_METADATA_CROP_OFFSETS                              \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x25)
 
 /* Encoder Super frame control */
 #define V4L2_CID_MPEG_VIDC_SUPERFRAME           (V4L2_CID_MPEG_VIDC_BASE + 0x28)
@@ -296,6 +300,8 @@ struct msm_vidc_metapayload_header {
 	__u32 reserved[3];
 };
 enum v4l2_mpeg_vidc_metadata {
+	METADATA_BITSTREAM_RESOLUTION         = 0x03000103,
+	METADATA_CROP_OFFSETS                 = 0x03000105,
 	METADATA_LTR_MARK_USE_DETAILS         = 0x03000137,
 	METADATA_SEQ_HEADER_NAL               = 0x0300014a,
 	METADATA_DPB_LUMA_CHROMA_MISR         = 0x03000153,