video: driver: Add NAL length based encoding

Add support to set HFI_PROP_NAL_LENGTH_FIELD property to
video firmware.

Change-Id: I20db36bad394fe0b5163a156199340836af3f740
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2021-03-02 19:14:03 -08:00
parent 51c2ce468d
commit 660008370e
5 changed files with 74 additions and 0 deletions

View File

@@ -279,6 +279,26 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL}, V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL},
{WITHOUT_STARTCODE, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDEO_HEVC_WITHOUT_STARTCODE,
HFI_PROP_NAL_LENGTH_FIELD,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{0}, {0},
NULL, msm_vidc_set_nal_length},
{NAL_LENGTH_FIELD, ENC, CODECS_ALL,
V4L2_MPEG_VIDEO_HEVC_SIZE_0,
V4L2_MPEG_VIDEO_HEVC_SIZE_4,
BIT(V4L2_MPEG_VIDEO_HEVC_SIZE_0) |
BIT(V4L2_MPEG_VIDEO_HEVC_SIZE_4),
V4L2_MPEG_VIDEO_HEVC_SIZE_0,
V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD,
HFI_PROP_NAL_LENGTH_FIELD,
CAP_FLAG_MENU | CAP_FLAG_OUTPUT_PORT},
/* TODO: Firmware introduced enumeration type for this /* TODO: Firmware introduced enumeration type for this
* with and without seq header. * with and without seq header.
*/ */

View File

@@ -476,6 +476,20 @@ enum hfi_picture_type {
#define HFI_BITMASK_RAW_HEIGHT 0x0000ffff #define HFI_BITMASK_RAW_HEIGHT 0x0000ffff
#define HFI_PROP_RAW_RESOLUTION 0x03000178 #define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_DPB_TAG_LIST 0x03000179
#define HFI_PROP_DPB_LIST 0x0300017A
enum hfi_nal_length_field_type {
HFI_NAL_LENGTH_STARTCODES = 0,
HFI_NAL_LENGTH_SIZE_4 = 4,
};
#define HFI_PROP_NAL_LENGTH_FIELD 0x0300017B
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
#define HFI_PROP_MAINTAIN_MIN_QUALITY 0x0300017D
#define HFI_PROP_END 0x03FFFFFF #define HFI_PROP_END 0x03FFFFFF
#define HFI_SESSION_ERROR_BEGIN 0x04000000 #define HFI_SESSION_ERROR_BEGIN 0x04000000

View File

@@ -57,6 +57,8 @@ int msm_vidc_set_constant_quality(void *instance,
enum msm_vidc_inst_capability_type cap_id); enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_use_and_mark_ltr(void *instance, int msm_vidc_set_use_and_mark_ltr(void *instance,
enum msm_vidc_inst_capability_type cap_id); enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_nal_length(void* instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_s32(void *instance, int msm_vidc_set_s32(void *instance,
enum msm_vidc_inst_capability_type cap_id); enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_array(void *instance, int msm_vidc_set_array(void *instance,

View File

@@ -329,6 +329,8 @@ enum msm_vidc_inst_capability_type {
HEADER_MODE, HEADER_MODE,
PREPEND_SPSPPS_TO_IDR, PREPEND_SPSPPS_TO_IDR,
META_SEQ_HDR_NAL, META_SEQ_HDR_NAL,
WITHOUT_STARTCODE,
NAL_LENGTH_FIELD,
REQUEST_I_FRAME, REQUEST_I_FRAME,
BIT_RATE, BIT_RATE,
BITRATE_MODE, BITRATE_MODE,

View File

@@ -1550,6 +1550,32 @@ int msm_vidc_set_slice_count(void* instance,
return rc; return rc;
} }
int msm_vidc_set_nal_length(void* instance,
enum msm_vidc_inst_capability_type cap_id)
{
int rc = 0;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
u32 hfi_value = HFI_NAL_LENGTH_STARTCODES;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (!inst->capabilities->cap[WITHOUT_STARTCODE].value) {
hfi_value = HFI_NAL_LENGTH_STARTCODES;
} else {
rc = msm_vidc_v4l2_to_hfi_enum(inst, NAL_LENGTH_FIELD, &hfi_value);
if (rc)
return -EINVAL;
}
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
&hfi_value, sizeof(u32), __func__);
return rc;
}
/* TODO /* TODO
int msm_vidc_set_flip(void *instance, int msm_vidc_set_flip(void *instance,
enum msm_vidc_inst_capability_type cap_id) enum msm_vidc_inst_capability_type cap_id)
@@ -1863,6 +1889,16 @@ int msm_vidc_v4l2_to_hfi_enum(struct msm_vidc_inst *inst,
goto set_default; goto set_default;
} }
return 0; return 0;
case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
switch (capability->cap[cap_id].value) {
case V4L2_MPEG_VIDEO_HEVC_SIZE_4:
*value = HFI_NAL_LENGTH_SIZE_4;
break;
default:
*value = HFI_NAL_LENGTH_STARTCODES;
goto set_default;
}
return 0;
default: default:
i_vpr_e(inst, i_vpr_e(inst,
"%s: mapping not specified for ctrl_id: %#x\n", "%s: mapping not specified for ctrl_id: %#x\n",