video: driver: fixes to get enc start/stop working

below are the fixes added to get enc start/stop working
along with setting default values to firmware for basic
functionality controls.
  - Create and queue COMV and NON COMV internal buffers
  - Use HFI_PAYLOAD_64_PACKED as payload_info type instead
    of HFI_PAYLOAD_32_PACKED HFI_PROP_CROP_OFFSETS
  - Introduce new control port specifier flags in instance
    database to help set correct port to controls while
    packetization
  - Add support to map basic functionality controls
    v4l2 enum values to hfi enum values
  - Enable static adjust and set controls support

Change-Id: Idc0dc3e3d07d8f6349c74136327a45d77ced1035
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2020-12-07 18:58:01 -08:00
parent aa09897cad
commit bdc2de6c93
7 changed files with 260 additions and 125 deletions

View File

@@ -115,7 +115,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 64, 1, 4,
V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/* (8192 * 4320) / 256 */
{MBPF, ENC|DEC, CODECS_ALL, 64, 138240, 1, 138240},
@@ -132,7 +132,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDEO_B_FRAMES,
HFI_PROP_MAX_B_FRAMES,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/* ((4096 * 2304) / 256) * 60 fps */
{POWER_SAVE_MBPS, ENC, CODECS_ALL,
@@ -173,13 +173,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 51, 1, 20,
V4L2_CID_MPEG_VIDC_B_FRAME_MIN_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{B_FRAME_MAX_QP, ENC, HEVC|H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDC_B_FRAME_MAX_QP,
HFI_PROP_MAX_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{HFLIP, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -187,7 +187,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_HFLIP,
HFI_PROP_FLIP,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{VFLIP, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -195,7 +195,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_VFLIP,
HFI_PROP_FLIP,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{PREPEND_SPSPPS_TO_IDR, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -203,13 +203,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR,
HFI_PROP_SEQ_HEADER_MODE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{REQUEST_I_FRAME, ENC, CODECS_ALL,
0, 0, 0, 0,
V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
HFI_PROP_REQUEST_SYNC_FRAME,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{SLICE_INTERFACE, DEC, CODECS_ALL,
0, 0, 0, 0,
@@ -231,7 +231,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
HFI_PROP_RATE_CONTROL,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0}, {0},
NULL, msm_vidc_set_u32},
{HEADER_MODE, ENC, CODECS_ALL,
V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
@@ -241,14 +243,16 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
V4L2_CID_MPEG_VIDEO_HEADER_MODE,
HFI_PROP_SEQ_HEADER_MODE,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0}, {0},
NULL, msm_vidc_set_u32},
// confirm codec
{GOP_SIZE, ENC, CODECS_ALL,
0, MAX_GOP, 1, 2 * DEFAULT_FPS - 1,
V4L2_CID_MPEG_VIDEO_GOP_SIZE,
HFI_PROP_MAX_GOP_FRAMES,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{GOP_CLOSURE, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -260,10 +264,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_BITRATE,
HFI_PROP_TOTAL_BITRATE,
CAP_FLAG_DYNAMIC_ALLOWED,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
/* TO DO parents */ {0},
{SLICE_MAX_BYTES},
msm_vidc_adjust_bitrate, msm_vidc_set_s32},
msm_vidc_adjust_bitrate, msm_vidc_set_u32},
{BIT_RATE, DEC, CODECS_ALL, 1, 220000000, 1, 220000000},
@@ -280,7 +284,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDC_SECURE,
HFI_PROP_SECURE,
CAP_FLAG_ROOT,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{0},
{0}},
@@ -288,13 +292,15 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_NONE,
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES,
HFI_PROP_BLUR_TYPES,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{0}, {0},
NULL, msm_vidc_set_u32},
{BLUR_RESOLUTION, ENC, CODECS_ALL,
0, S32_MAX, 1, 0,
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION,
HFI_PROP_BLUR_RESOLUTION,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/* Needed for control initialization. TODO */
/* {CSC_CUSTOM_MATRIX, ENC, CODECS_ALL,
@@ -303,14 +309,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX,
HFI_PROP_CSC_MATRIX,
CAP_FLAG_ROOT}, */
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, */
{HEIC, ENC, HEVC,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDC_HEIC,
HFI_PROP_HEIC_GRID_ENABLE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{LOWLATENCY_MODE, ENC|DEC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -323,13 +329,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 2, 1, 0,
V4L2_CID_MPEG_VIDC_LTRCOUNT,
HFI_PROP_LTR_COUNT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{USE_LTR, ENC, H264|HEVC,
0, ((1 << MAX_LTR_FRAME_COUNT) - 1), 1, 0,
V4L2_CID_MPEG_VIDC_USELTRFRAME,
HFI_PROP_LTR_USE,
CAP_FLAG_ROOT,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{LTR_COUNT},
{0}},
@@ -337,19 +343,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, (MAX_LTR_FRAME_COUNT - 1), 1, 0,
V4L2_CID_MPEG_VIDC_MARKLTRFRAME,
HFI_PROP_LTR_MARK,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{BASELAYER_PRIORITY, ENC, H264|HEVC,
0, MAX_BASE_LAYER_PRIORITY_ID, 1, 0,
V4L2_CID_MPEG_VIDC_BASELAYER_PRIORITY,
HFI_PROP_BASELAYER_PRIORITYID,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{IR_RANDOM, ENC, CODECS_ALL,
0, MAX_INTRA_REFRESH_MBS, 1, 0,
V4L2_CID_MPEG_VIDC_INTRA_REFRESH_PERIOD,
HFI_PROP_IR_RANDOM_PERIOD,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{AU_DELIMITER, ENC, H264|HEVC,
V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -357,7 +363,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDC_AU_DELIMITER,
HFI_PROP_AUD,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
// confirm codec
{TIME_DELTA_BASED_RC, ENC, CODECS_ALL,
@@ -365,7 +371,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_ENABLE,
V4L2_CID_MPEG_VIDC_TIME_DELTA_BASED_RC,
HFI_PROP_TIME_DELTA_BASED_RATE_CONTROL,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
// confirm codec
{CONTENT_ADAPTIVE_CODING, ENC, CODECS_ALL,
@@ -373,19 +379,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, V4L2_MPEG_MSM_VIDC_ENABLE,
V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING,
HFI_PROP_CONTENT_ADAPTIVE_CODING,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{BITRATE_BOOST, ENC, CODECS_ALL,
0, 100, 25, 25,
V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST,
HFI_PROP_CONST_QUALITY_BITRATE_BOOST,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{ROTATION, ENC, CODECS_ALL,
0, 270, 90, 0,
V4L2_CID_ROTATE,
HFI_PROP_ROTATION,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{VBV_DELAY, ENC, CODECS_ALL,
0, 1000, 500, 0,
@@ -396,20 +402,20 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{MAX_FRAME_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP,
HFI_PROP_MAX_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{HEVC_HIER_QP, ENC, HEVC,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/*
* HEVC I_MIN_QP, I_MAX_QP, P_MIN_QP, P_MAX_QP, B_MIN_QP, B_MAX_QP are missing
@@ -418,19 +424,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 51, 1, 10,
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{P_FRAME_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{B_FRAME_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{HIER_CODING_TYPE, ENC, HEVC,
V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B,
@@ -440,49 +446,51 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE,
HFI_PROP_LAYER_ENCODING_TYPE,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0}, {0},
NULL, msm_vidc_set_u32},
{HIER_CODING_LAYER, ENC, HEVC,
0, 5, 1, 0,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER,
HFI_PROP_LAYER_COUNT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L0_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L1_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L2_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L3_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L4_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L5_QP, ENC, HEVC,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{PROFILE, ENC|DEC, HEVC,
V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
@@ -493,7 +501,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
HFI_PROP_PROFILE,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0},
{ENTROPY_MODE},
NULL, msm_vidc_set_u32},
@@ -517,7 +525,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
HFI_PROP_LEVEL,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0},
{0},
NULL, msm_vidc_set_u32},
@@ -530,7 +538,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
V4L2_CID_MPEG_VIDEO_HEVC_TIER,
HFI_PROP_TIER,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0},
{0},
NULL, msm_vidc_set_u32},
@@ -544,85 +552,85 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED,
V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE,
HFI_PROP_DEBLOCKING_MODE,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
{LF_BETA, ENC, HEVC,
-6, 6, 1, 0,
V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2,
HFI_PROP_DEBLOCKING_MODE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{LF_TC, ENC, HEVC,
-6, 6, 1, 0,
V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2,
HFI_PROP_DEBLOCKING_MODE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{LOSSLESS, ENC, HEVC,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU,
HFI_PROP_RATE_CONTROL,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L0_BR, ENC, HEVC,
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR,
HFI_PROP_BITRATE_LAYER1,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L1_BR, ENC, HEVC,
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR,
HFI_PROP_BITRATE_LAYER2,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L2_BR, ENC, HEVC,
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR,
HFI_PROP_BITRATE_LAYER3,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L3_BR, ENC, HEVC,
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR,
HFI_PROP_BITRATE_LAYER4,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L4_BR, ENC, HEVC,
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR,
HFI_PROP_BITRATE_LAYER5,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{L5_BR, ENC, HEVC,
1, 220000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR,
HFI_PROP_BITRATE_LAYER6,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{BIT_RATE, ENC, HEVC,
1, 160000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_BITRATE,
HFI_PROP_TOTAL_BITRATE,
CAP_FLAG_DYNAMIC_ALLOWED,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
/* TODO parents */{0},
{SLICE_MAX_BYTES},
msm_vidc_adjust_bitrate, msm_vidc_set_s32},
msm_vidc_adjust_bitrate, msm_vidc_set_u32},
{SLICE_MAX_BYTES, ENC, H264|HEVC,
1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
HFI_PROP_MULTI_SLICE_BYTES_COUNT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{SLICE_MAX_MB, ENC, H264|HEVC,
1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
HFI_PROP_MULTI_SLICE_MB_COUNT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{SLICE_MODE, ENC, H264|HEVC,
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
@@ -633,16 +641,16 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
0,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
/* Mpeg2 decoder specific */
{BIT_RATE, DEC, MPEG2,
1, 40000000, 1, 20000000,
V4L2_CID_MPEG_VIDEO_BITRATE,
HFI_PROP_TOTAL_BITRATE,
CAP_FLAG_DYNAMIC_ALLOWED,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
{0}, {0},
msm_vidc_adjust_bitrate, msm_vidc_set_s32},
msm_vidc_adjust_bitrate, msm_vidc_set_u32},
{LEVEL, DEC, MPEG2,
V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW,
@@ -654,7 +662,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH,
V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
HFI_PROP_LEVEL,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
{PROFILE, DEC, MPEG2,
V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE,
@@ -664,7 +672,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN,
V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
HFI_PROP_PROFILE,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
{FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920},
{FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1080},
@@ -681,57 +689,57 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 51, 1, 10,
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{P_FRAME_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{B_FRAME_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{MIN_FRAME_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_MIN_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{MAX_FRAME_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_MAX_QP,
HFI_PROP_MAX_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{LF_BETA, ENC, H264,
-6, 6, 1, 0,
V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA,
HFI_PROP_DEBLOCKING_MODE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{LF_ALPHA, ENC, H264,
-6, 6, 1, 0,
V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA,
HFI_PROP_DEBLOCKING_MODE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{MB_RC, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_ENABLE,
V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE,
0,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{TRANSFORM_8X8, ENC, H264,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_ENABLE,
V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM,
HFI_PROP_8X8_TRANSFORM,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{ENTROPY_MODE, ENC, H264,
V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
@@ -741,7 +749,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
HFI_PROP_CABAC_SESSION,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{PROFILE},
{BIT_RATE},
msm_vidc_adjust_entropy_mode, msm_vidc_set_u32},
@@ -757,7 +765,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
V4L2_CID_MPEG_VIDEO_H264_PROFILE,
HFI_PROP_PROFILE,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0},
{ENTROPY_MODE},
NULL, msm_vidc_set_u32},
@@ -784,7 +792,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
V4L2_CID_MPEG_VIDEO_H264_LEVEL,
HFI_PROP_LEVEL,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0},
{0},
NULL, msm_vidc_set_u32},
@@ -798,14 +806,15 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
HFI_PROP_DEBLOCKING_MODE,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
//TODO (AS)
{HIER_CODING, ENC, H264,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING,
HFI_PROP_LAYER_ENCODING_TYPE,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/* TODO(AS) - ctrl init failing. Need to fix
{HIER_CODING_TYPE, ENC, H264,
@@ -816,20 +825,20 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE,
HFI_PROP_LAYER_ENCODING_TYPE,
CAP_FLAG_ROOT | CAP_FLAG_MENU},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
*/
{HIER_CODING_LAYER, ENC, H264,
0, 6, 1, 0,
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER,
HFI_PROP_LAYER_COUNT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{HIER_LAYER_QP, ENC, H264,
0, 0x0060033, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP,
HFI_PROP_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/* TODO: CHROMA_QP_INDEX_OFFSET is applicable to HEVC as well */
{CHROMA_QP_INDEX_OFFSET, ENC, H264,
@@ -837,44 +846,44 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
1, MAX_CHROMA_QP_OFFSET,
V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET,
HFI_PROP_CHROMA_QP_OFFSET,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{I_FRAME_MIN_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{I_FRAME_MAX_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{P_FRAME_MIN_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{P_FRAME_MAX_QP, ENC, H264,
0, 51, 1, 20,
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP,
HFI_PROP_MIN_QP_PACKED,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{DISPLAY_DELAY, DEC, CODECS_ALL,
0, 1, 1, 0,
V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY,
HFI_PROP_DECODE_ORDER_OUTPUT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE,
HFI_PROP_DECODE_ORDER_OUTPUT,
CAP_FLAG_ROOT},
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
/* VP9 specific */
{I_FRAME_QP, ENC, VP9, 0, 127, 1, 20},
@@ -891,7 +900,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_MPEG_VIDEO_VP9_PROFILE_0,
V4L2_CID_MPEG_VIDEO_VP9_PROFILE,
HFI_PROP_PROFILE,
CAP_FLAG_ROOT | CAP_FLAG_MENU,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
{0},
{ENTROPY_MODE},
NULL, msm_vidc_set_u32},
@@ -900,11 +909,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
{CONCEAL_COLOR_8BIT, DEC, CODECS_ALL, 0x0, 0xff3fcff, 1,
DEFAULT_VIDEO_CONCEAL_COLOR_BLACK,
V4L2_CID_MPEG_VIDEO_MUTE_YUV,
HFI_PROP_CONCEAL_COLOR_8BIT},
HFI_PROP_CONCEAL_COLOR_8BIT,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{CONCEAL_COLOR_10BIT, DEC, CODECS_ALL, 0x0, 0x3fffffff, 1,
DEFAULT_VIDEO_CONCEAL_COLOR_BLACK,
V4L2_CID_MPEG_VIDEO_MUTE_YUV,
HFI_PROP_CONCEAL_COLOR_10BIT},
HFI_PROP_CONCEAL_COLOR_10BIT,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
{STAGE, DEC|ENC, CODECS_ALL, 1, 2, 1, 2},
{PIPE, DEC|ENC, CODECS_ALL, 1, 4, 1, 4},

View File

@@ -315,6 +315,8 @@ enum hfi_quality_mode {
HFI_MODE_MAX_QUALITY = 0x1,
HFI_MODE_POWER_SAVE = 0x2,
};
// TODO (AS): Does not map to any V4l2 control
#define HFI_PROP_QUALITY_MODE 0x03000148
enum hfi_seq_header_mode {

View File

@@ -55,7 +55,8 @@ static inline is_internal_buffer(enum msm_vidc_buffer_type buffer_type)
buffer_type == MSM_VIDC_BUF_NON_COMV ||
buffer_type == MSM_VIDC_BUF_LINE ||
buffer_type == MSM_VIDC_BUF_DPB ||
buffer_type == MSM_VIDC_BUF_PERSIST;
buffer_type == MSM_VIDC_BUF_PERSIST ||
buffer_type == MSM_VIDC_BUF_VPSS;
}
static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst)

View File

@@ -335,6 +335,8 @@ enum msm_vidc_inst_capability_flags {
CAP_FLAG_ROOT = BIT(0),
CAP_FLAG_DYNAMIC_ALLOWED = BIT(1),
CAP_FLAG_MENU = BIT(2),
CAP_FLAG_INPUT_PORT = BIT(3),
CAP_FLAG_OUTPUT_PORT = BIT(4),
};
struct msm_vidc_inst_cap {

View File

@@ -129,6 +129,9 @@ static int msm_venc_set_resolution(struct msm_vidc_inst *inst,
resolution = inst->fmts[port].fmt.pix_mp.width << 16 |
inst->fmts[port].fmt.pix_mp.height;
s_vpr_h(inst->sid, "%s: width: %d height: %d\n", __func__,
inst->fmts[port].fmt.pix_mp.width,
inst->fmts[port].fmt.pix_mp.height);
rc = venus_hfi_session_property(inst,
HFI_PROP_BITSTREAM_RESOLUTION,
HFI_HOST_FLAGS_NONE,
@@ -155,11 +158,14 @@ static int msm_venc_set_crop_offsets(struct msm_vidc_inst *inst,
/* TODO: recheck later */
crop = inst->fmts[INPUT_PORT].fmt.pix_mp.width << 16 |
inst->fmts[INPUT_PORT].fmt.pix_mp.height;
s_vpr_h(inst->sid, "%s: width: %d height: %d\n", __func__,
inst->fmts[INPUT_PORT].fmt.pix_mp.width,
inst->fmts[INPUT_PORT].fmt.pix_mp.height);
rc = venus_hfi_session_property(inst,
HFI_PROP_CROP_OFFSETS,
HFI_HOST_FLAGS_NONE,
get_hfi_port(inst, port),
HFI_PAYLOAD_32_PACKED,
HFI_PAYLOAD_64_PACKED,
&crop,
sizeof(u32));
if (rc)
@@ -301,17 +307,21 @@ static int msm_venc_get_input_internal_buffers(struct msm_vidc_inst *inst)
core = inst->core;
inst->buffers.arp.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_ARP);
inst, MSM_VIDC_BUF_ARP) + 100000000;
inst->buffers.bin.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_BIN);
/* inst->buffers.comv.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_COMV);
inst, MSM_VIDC_BUF_BIN) + 100000000;
inst->buffers.comv.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_COMV) + 100000000;
inst->buffers.non_comv.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_NON_COMV); */
inst, MSM_VIDC_BUF_NON_COMV) + 100000000;
inst->buffers.line.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_LINE);
inst, MSM_VIDC_BUF_LINE) + 100000000;
inst->buffers.dpb.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_DPB);
inst, MSM_VIDC_BUF_DPB) + 100000000;
//inst->buffers.vpss.size = call_session_op(core, buffer_size,
//inst, MSM_VIDC_BUF_VPSS) + 100000000;
//vpss is req - 100 mb
/* inst->buffers.persist.size = call_session_op(core, buffer_size,
inst, MSM_VIDC_BUF_PERSIST); */
@@ -319,10 +329,10 @@ static int msm_venc_get_input_internal_buffers(struct msm_vidc_inst *inst)
inst, MSM_VIDC_BUF_ARP);
inst->buffers.bin.min_count = call_session_op(core, min_count,
inst, MSM_VIDC_BUF_BIN);
/* inst->buffers.comv.min_count = call_session_op(core, min_count,
inst->buffers.comv.min_count = call_session_op(core, min_count,
inst, MSM_VIDC_BUF_COMV);
inst->buffers.non_comv.min_count = call_session_op(core, min_count,
inst, MSM_VIDC_BUF_NON_COMV); */
inst, MSM_VIDC_BUF_NON_COMV);
inst->buffers.line.min_count = call_session_op(core, min_count,
inst, MSM_VIDC_BUF_LINE);
inst->buffers.dpb.min_count = call_session_op(core, min_count,
@@ -337,12 +347,12 @@ static int msm_venc_get_input_internal_buffers(struct msm_vidc_inst *inst)
s_vpr_h(inst->sid, "bin buffer: %d %d\n",
inst->buffers.bin.min_count,
inst->buffers.bin.size);
/* s_vpr_h(inst->sid, "comv buffer: %d %d\n",
s_vpr_h(inst->sid, "comv buffer: %d %d\n",
inst->buffers.comv.min_count,
inst->buffers.comv.size);
s_vpr_h(inst->sid, "non_comv buffer: %d %d\n",
inst->buffers.non_comv.min_count,
inst->buffers.non_comv.size); */
inst->buffers.non_comv.size);
s_vpr_h(inst->sid, "line buffer: %d %d\n",
inst->buffers.line.min_count,
inst->buffers.line.size);
@@ -372,12 +382,12 @@ static int msm_venc_create_input_internal_buffers(struct msm_vidc_inst *inst)
rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_BIN);
if (rc)
return rc;
/* rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_COMV);
rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_COMV);
if (rc)
return rc;
rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
if (rc)
return rc; */
return rc;
rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_LINE);
if (rc)
return rc;
@@ -407,12 +417,12 @@ static int msm_venc_queue_input_internal_buffers(struct msm_vidc_inst *inst)
rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_BIN);
if (rc)
return rc;
/* rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_COMV);
rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_COMV);
if (rc)
return rc;
rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
if (rc)
return rc; */
return rc;
rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_LINE);
if (rc)
return rc;

View File

@@ -31,7 +31,7 @@ static const char *const mpeg_video_rate_control[] = {
"MBR",
"MBR VFR",
"CQ",
NULL
NULL,
};
static const char *const mpeg_video_stream_format[] = {
@@ -57,6 +57,26 @@ static const char *const roi_map_type[] = {
NULL,
};
static u32 msm_vidc_get_port_info(struct msm_vidc_inst *inst,
enum msm_vidc_inst_capability_type cap_id)
{
struct msm_vidc_inst_capability *capability = inst->capabilities;
if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT &&
capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT) {
s_vpr_e(inst->sid,
"%s: both ports enabled. Default port set: BITSTREAM\n",
__func__);
return HFI_PORT_BITSTREAM;
}
if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT)
return get_hfi_port(inst, INPUT_PORT);
else if (capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT)
return get_hfi_port(inst, OUTPUT_PORT);
else
return HFI_PORT_NONE;
}
static const char * const * msm_vidc_get_qmenu_type(
struct msm_vidc_inst *inst, u32 control_id)
{
@@ -682,11 +702,11 @@ int msm_vidc_adjust_properties(struct msm_vidc_inst *inst)
struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
struct msm_vidc_inst_capability *capability;
d_vpr_h("%s()\n", __func__);
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
capability = inst->capabilities;
for (i = 0; i < INST_CAP_MAX; i++) {
@@ -727,21 +747,28 @@ int msm_vidc_set_u32(void *instance,
{
int rc = 0;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
u32 hfi_value;
u32 hfi_value, hfi_payload;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
rc = msm_vidc_v4l2_menu_to_hfi(inst, cap_id, &hfi_value);
if (rc)
return -EINVAL;
if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_MENU) {
rc = msm_vidc_v4l2_menu_to_hfi(inst, cap_id, &hfi_value);
if (rc)
return -EINVAL;
hfi_payload = HFI_PAYLOAD_U32_ENUM;
} else {
hfi_value = inst->capabilities->cap[cap_id].value;
hfi_payload = HFI_PAYLOAD_U32;
}
rc = venus_hfi_session_property(inst,
inst->capabilities->cap[cap_id].hfi_id,
HFI_HOST_FLAGS_NONE, HFI_PORT_NONE,
HFI_PAYLOAD_U32_ENUM,
HFI_HOST_FLAGS_NONE,
msm_vidc_get_port_info(inst, cap_id),
hfi_payload,
&hfi_value,
sizeof(u32));
if (rc)
@@ -830,6 +857,7 @@ int msm_vidc_set_fw_list(struct msm_vidc_inst *inst)
struct msm_vidc_inst_capability *capability;
struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
d_vpr_h("%s()\n", __func__);
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
@@ -862,6 +890,15 @@ int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst,
struct msm_vidc_inst_capability *capability = inst->capabilities;
switch (capability->cap[cap_id].v4l2_id) {
case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES:
*value = capability->cap[cap_id].value;
return 0;
case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
switch (capability->cap[cap_id].value) {
case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC:
@@ -872,16 +909,64 @@ int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst,
break;
default:
*value = 1;
s_vpr_e(inst->sid,
"%s: invalid ctrl %d value %d, default value %u\n",
__func__, capability->cap[cap_id].v4l2_id,
capability->cap[cap_id].value, *value);
goto set_default;
}
break;
return 0;
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
switch (capability->cap[cap_id].value) {
case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
*value = HFI_RC_VBR_CFR;
break;
case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
*value = HFI_RC_CBR_CFR;
break;
default:
*value = HFI_RC_VBR_CFR;
goto set_default;
}
return 0;
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
switch (capability->cap[cap_id].value) {
case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B:
*value = HFI_HIER_B;
break;
case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P:
//TODO (AS): check if this is right mapping
*value = HFI_HIER_P_SLIDING_WINDOW;
break;
default:
*value = HFI_HIER_P_SLIDING_WINDOW;
goto set_default;
}
return 0;
case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
switch (capability->cap[cap_id].value) {
case V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE:
*value = BIT(HFI_SEQ_HEADER_SEPERATE_FRAME);
break;
case V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME:
*value = BIT(HFI_SEQ_HEADER_JOINED_WITH_1ST_FRAME);
break;
/*
* TODO (AS): other HFI values are missing corresponding
* V4l2 values. Add them once available.
*/
default:
*value = HFI_SEQ_HEADER_SEPERATE_FRAME;
goto set_default;
}
return 0;
default:
s_vpr_e(inst->sid,
"%s: invalid ctrl with cap_id %d\n", __func__, cap_id);
"%s: mapping not specified for ctrl_id: %#x\n",
__func__, capability->cap[cap_id].v4l2_id);
return -EINVAL;
}
set_default:
s_vpr_e(inst->sid,
"%s: invalid value %d for ctrl id: %#x. Set default: %u\n",
__func__, capability->cap[cap_id].value,
capability->cap[cap_id].v4l2_id, *value);
return 0;
}

View File

@@ -6,11 +6,11 @@
#include "msm_vidc_vb2.h"
#include "msm_vidc_core.h"
#include "msm_vidc_inst.h"
#include "msm_vidc_internal.h"
#include "msm_vidc_driver.h"
#include "msm_vdec.h"
#include "msm_venc.h"
#include "msm_vidc_debug.h"
#include "msm_vidc_control.h"
void *msm_vb2_get_userptr(struct device *dev, unsigned long vaddr,
unsigned long size, enum dma_data_direction dma_dir)
@@ -185,6 +185,19 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
}
/*
if ((inst->state == MSM_VIDC_OPEN && q->type == OUTPUT_MPLANE) ||
inst->state == MSM_VIDC_START_INPUT) {
s_vpr_h(inst->sid, "$s: msm_vidc_adjust_properties\n");
rc = msm_vidc_adjust_properties(inst);
if (rc)
return -EINVAL;
s_vpr_h(inst->sid, "$s: msm_vidc_set_fw_list\n");
rc = msm_vidc_set_fw_list(inst);
if (rc)
return -EINVAL;
}
if (inst->state == MSM_VIDC_START_INPUT ||
inst->state == MSM_VIDC_START_OUTPUT) {
rc = msm_vidc_adjust_properties(inst);
@@ -192,8 +205,8 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
return -EINVAL;
}
if ((inst->state == MSM_VIDC_START_INPUT) ||
(inst->state == MSM_VIDC_START &&
if ((inst->state == MSM_VIDC_START_OUTPUT) ||
(inst->state == MSM_VIDC_OPEN &&
q->type == INPUT_MPLANE)) {
rc = msm_vidc_set_fw_list(inst);
if (rc)
@@ -201,6 +214,17 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
}
*/
if (inst->state == MSM_VIDC_START_INPUT ||
inst->state == MSM_VIDC_START_OUTPUT) {
rc = msm_vidc_adjust_properties(inst);
if (rc)
return -EINVAL;
rc = msm_vidc_set_fw_list(inst);
if (rc)
return -EINVAL;
}
if (q->type == INPUT_MPLANE) {
if (is_decode_session(inst))
rc = msm_vdec_start_input(inst);