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 <quic_mganu@quicinc.com>
This commit is contained in:
Mihir Ganu
2021-12-03 15:16:38 -08:00
parent 2f7df152f2
commit 1b5a6b1d6f
7 changed files with 30 additions and 2 deletions

View File

@@ -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,

View File

@@ -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 ||

View File

@@ -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,

View File

@@ -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,

View File

@@ -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[] = {

View File

@@ -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" },

View File

@@ -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,