diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index bfb73ccdf0..503a81fb70 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -39,15 +39,15 @@ #define H264 MSM_VIDC_H264 #define HEVC MSM_VIDC_HEVC #define VP9 MSM_VIDC_VP9 -#define MPEG2 MSM_VIDC_MPEG2 #define CODECS_ALL (MSM_VIDC_H264 | MSM_VIDC_HEVC | \ - MSM_VIDC_VP9 | MSM_VIDC_MPEG2) + MSM_VIDC_VP9) static struct msm_platform_core_capability core_data_waipio[] = { /* {type, value} */ {ENC_CODECS, H264|HEVC}, - {DEC_CODECS, H264|HEVC|VP9|MPEG2}, - {MAX_SESSION_COUNT, 16}, + {DEC_CODECS, H264|HEVC|VP9}, + // TODO: MAX_SESSION_COUNT needs to be changed to 16 + {MAX_SESSION_COUNT, 3}, {MAX_SECURE_SESSION_COUNT, 3}, {MAX_MBPF, 173056}, /* (8192x4320)/256 + (4096x2176)/256*/ {MAX_MBPS, 7833600}, /* max_load @@ -66,6 +66,7 @@ static struct msm_platform_core_capability core_data_waipio[] = { {FW_UNLOAD_DELAY, 1000}, /* 1000 ms */ {HW_RESPONSE_TIMEOUT, 15000}, /* 1000 ms */ {DEBUG_TIMEOUT, 0}, + // TODO: review below entries, and if required rename as PREFETCH {PREFIX_BUF_COUNT_PIX, 18}, {PREFIX_BUF_SIZE_PIX, 13434880}, /* Calculated by VENUS_BUFFER_SIZE for 4096x2160 UBWC */ {PREFIX_BUF_COUNT_NON_PIX, 1}, @@ -74,7 +75,7 @@ static struct msm_platform_core_capability core_data_waipio[] = { * of resolution 4k (4096x2160) * Internal buf size = calculate_scratch_size() + * calculate_scratch1_size() + calculate_persist1_size() - * Take maximum between VP9 10bit, HEVC 10bit, AVC, MPEG2 secure + * Take maximum between VP9 10bit, HEVC 10bit, AVC secure * decoder sessions */ {PAGEFAULT_NON_FATAL, 1}, @@ -95,20 +96,49 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { * children, * adjust, set} */ - {FRAME_WIDTH, ENC|DEC, CODECS_ALL, 128, 8192, 1, 1920}, - {FRAME_HEIGHT, ENC|DEC, CODECS_ALL, 128, 8192, 1, 1080}, - {PIX_FMTS, ENC, CODECS_ALL, + + {FRAME_WIDTH, DEC, CODECS_ALL, 96, 8192, 1, 1920}, + {FRAME_WIDTH, ENC, CODECS_ALL, 128, 8192, 1, 1920}, + {LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920}, + /* Secure usecase specific */ + {SECURE_FRAME_WIDTH, ENC|DEC, CODECS_ALL, 128, 4096, 1, 1920}, + {HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, + {HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 1, 16384}, + {FRAME_HEIGHT, DEC, CODECS_ALL, 96, 8192, 1, 1080}, + {FRAME_HEIGHT, ENC, CODECS_ALL, 128, 8192, 1, 1080}, + {LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080}, + {SECURE_FRAME_HEIGHT, ENC|DEC, CODECS_ALL, 128, 4096, 1, 1080}, + {HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, + {HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 1, 16384}, + {PIX_FMTS, ENC, H264, MSM_VIDC_FMT_NV12, - MSM_VIDC_FMT_NV12_TP10_UBWC, - MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12_UBWC | - MSM_VIDC_FMT_NV12_P010 | MSM_VIDC_FMT_NV12_TP10_UBWC, - MSM_VIDC_FMT_NV12_UBWC}, - {PIX_FMTS, DEC, CODECS_ALL, + MSM_VIDC_FMT_NV12C, + MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C, + MSM_VIDC_FMT_NV12C}, + {PIX_FMTS, ENC|DEC, HEVC, MSM_VIDC_FMT_NV12, - MSM_VIDC_FMT_NV12_TP10_UBWC, - MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12_UBWC | - MSM_VIDC_FMT_NV12_P010 | MSM_VIDC_FMT_NV12_TP10_UBWC, - MSM_VIDC_FMT_NV12_UBWC}, + MSM_VIDC_FMT_TP10C, + MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C | + MSM_VIDC_FMT_P010 | MSM_VIDC_FMT_TP10C, + MSM_VIDC_FMT_NV12C, + 0, 0, + CAP_FLAG_ROOT, + {0}, + {PROFILE}}, + + {PIX_FMTS, DEC, H264, + MSM_VIDC_FMT_NV12, + MSM_VIDC_FMT_NV12C, + MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C, + MSM_VIDC_FMT_NV12C}, + + {PIX_FMTS, DEC, VP9, + MSM_VIDC_FMT_NV12, + MSM_VIDC_FMT_TP10C, + MSM_VIDC_FMT_NV12 | MSM_VIDC_FMT_NV21 | MSM_VIDC_FMT_NV12C | + MSM_VIDC_FMT_P010 | MSM_VIDC_FMT_TP10C, + MSM_VIDC_FMT_NV12C}, + {MIN_BUFFERS_INPUT, ENC|DEC, CODECS_ALL, 0, 64, 1, 4, V4L2_CID_MIN_BUFFERS_FOR_OUTPUT}, {MIN_BUFFERS_OUTPUT, ENC|DEC, CODECS_ALL, @@ -118,10 +148,22 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, /* (8192 * 4320) / 256 */ - {MBPF, ENC|DEC, CODECS_ALL, 64, 138240, 1, 138240}, + {MBPF, ENC, CODECS_ALL, 64, 138240, 1, 138240}, + {MBPF, DEC, CODECS_ALL, 36, 138240, 1, 138240}, + /* (4096 * 2304) / 256 */ + {LOSSLESS_MBPF, ENC, H264|HEVC, 64, 36864, 1, 36864}, + /* Batch Mode Decode */ + {BATCH_MBPF, DEC, CODECS_ALL, 64, 34816, 1, 34816}, + /* (4096 * 2304) / 256 */ + {SECURE_MBPF, ENC|DEC, CODECS_ALL, 64, 36864, 1, 36864}, + /* ((1920 * 1088) / 256) * 480 fps */ + {MBPS, ENC, CODECS_ALL, 64, 3916800, 1, 3916800}, /* ((1920 * 1088) / 256) * 960 fps */ - {MBPS, ENC|DEC, CODECS_ALL, 64, 7833600, 1, 7833600}, + {MBPS, DEC, CODECS_ALL, 64, 7833600, 1, 7833600}, + /* ((4096 * 2304) / 256) * 60 fps */ + {POWER_SAVE_MBPS, ENC, CODECS_ALL, 0, 2211840, 1, 2211840}, + // TODO: Decide to store q16 or just int {FRAME_RATE, ENC, CODECS_ALL, (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), 1, (DEFAULT_FPS << 16), @@ -131,9 +173,15 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {0}, {0}, NULL, msm_vidc_set_q16}, + // Implement: Operating rate will accept any int value. + {OPERATING_RATE, ENC|DEC, CODECS_ALL, + 1, INT_MAX, 1, (DEFAULT_FPS << 16), + 0, + HFI_PROP_FRAME_RATE}, + {SCALE_X, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, - {SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {SCALE_X, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, + {SCALE_Y, ENC, CODECS_ALL, 8192, 65536, 1, 8192}, {SCALE_Y, DEC, CODECS_ALL, 65536, 65536, 1, 65536}, {B_FRAME, ENC, H264|HEVC, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, @@ -142,52 +190,25 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_MAX_B_FRAMES, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - /* ((4096 * 2304) / 256) * 60 fps */ - {POWER_SAVE_MBPS, ENC, CODECS_ALL, - 0, 2211840, 1, 2211840}, - - /* Batch Mode Decode */ - {BATCH_MBPF, DEC, CODECS_ALL, 64, 34816, 1, 34816}, - /* (4096 * 2176) / 256 */ - {BATCH_FRAME_RATE, DEC, CODECS_ALL, 1, 120, 1, 120}, - - /* Lossless encoding usecase specific */ - {LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920}, - {LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080}, - /* (4096 * 2304) / 256 */ - {LOSSLESS_MBPF, ENC, H264|HEVC, 64, 36864, 1, 36864}, - - /* All intra encoding usecase specific */ - {ALL_INTRA_FRAME_RATE, ENC, H264|HEVC, 1, 240, 1, 30}, - - /* Image specific */ - {HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512}, - {HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512}, - {HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 16384, 1, 16384}, - {HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 16384, 1, 16384}, - {MB_CYCLES_VSP, ENC, CODECS_ALL, 25, 25, 1, 25}, - {MB_CYCLES_VPP, ENC, CODECS_ALL, 675, 675, 1, 675}, - {MB_CYCLES_LP, ENC, CODECS_ALL, 320, 320, 1, 320}, {MB_CYCLES_VSP, DEC, CODECS_ALL, 25, 25, 1, 25}, {MB_CYCLES_VSP, DEC, VP9, 60, 60, 1, 60}, + {MB_CYCLES_VPP, ENC, CODECS_ALL, 675, 675, 1, 675}, {MB_CYCLES_VPP, DEC, CODECS_ALL, 200, 200, 1, 200}, + {MB_CYCLES_LP, ENC, CODECS_ALL, 320, 320, 1, 320}, {MB_CYCLES_LP, DEC, CODECS_ALL, 200, 200, 1, 200}, {MB_CYCLES_FW, ENC|DEC, CODECS_ALL, 326389, 326389, 1, 326389}, {MB_CYCLES_FW_VPP, ENC|DEC, CODECS_ALL, 44156, 44156, 1, 44156}, - // confirm codec - {B_FRAME_MIN_QP, ENC, HEVC|H264, - 0, 51, 1, 20, - V4L2_CID_MPEG_VIDC_B_FRAME_MIN_QP, - HFI_PROP_MIN_QP_PACKED, - 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_OUTPUT_PORT}, + {SECURE_MODE, ENC|DEC, CODECS_ALL, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_CID_MPEG_VIDC_SECURE, + HFI_PROP_SECURE, + CAP_FLAG_ROOT, + {0}, + {0}, + NULL, msm_vidc_set_u32}, {HFLIP, ENC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, @@ -205,18 +226,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_FLIP, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - {PREPEND_SPSPPS_TO_IDR, ENC, CODECS_ALL, - V4L2_MPEG_MSM_VIDC_DISABLE, - V4L2_MPEG_MSM_VIDC_ENABLE, - 1, V4L2_MPEG_MSM_VIDC_DISABLE, - V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR, - HFI_PROP_SEQ_HEADER_MODE, - 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, + {ROTATION, ENC, CODECS_ALL, + 0, 270, 90, 0, + V4L2_CID_ROTATE, + HFI_PROP_ROTATION, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, {SLICE_INTERFACE, DEC, CODECS_ALL, @@ -224,25 +237,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE, 0}, - {FRAME_RC, ENC, CODECS_ALL, - V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, - 1, V4L2_MPEG_MSM_VIDC_ENABLE, - V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, - 0}, - - {BITRATE_MODE, ENC, CODECS_ALL, - V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, - V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, - /* TODO: MBR, CBR_VFR, MBR_VFR, CQ */ - BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) | - BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR), - V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, - V4L2_CID_MPEG_VIDEO_BITRATE_MODE, - HFI_PROP_RATE_CONTROL, - 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, V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME, @@ -253,9 +247,72 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_SEQ_HEADER_MODE, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, {0}, + NULL, msm_vidc_set_header_mode}, + + {PREPEND_SPSPPS_TO_IDR, ENC, CODECS_ALL, + V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR}, + + {META_SEQ_HDR_NAL, ENC, CODECS_ALL, + V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL}, + + /* TODO: Firmware introduced enumeration type for this + * with and without seq header. + */ + {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_OUTPUT_PORT}, + + /* Enc: Keeping CABAC and CAVLC as same bitrate. + * Dec: there's no use of Bitrate cap + */ + {BIT_RATE, ENC, CODECS_ALL, + 1, 220000000, 1, 20000000, + V4L2_CID_MPEG_VIDEO_BITRATE, + HFI_PROP_TOTAL_BITRATE, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, NULL, msm_vidc_set_u32}, - // confirm codec + {BITRATE_MODE, ENC, CODECS_ALL, + V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, + V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, + /* TODO: CQ. For more info: go/videogki */ + BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) | + BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR), + V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, + V4L2_CID_MPEG_VIDEO_BITRATE_MODE, + HFI_PROP_RATE_CONTROL, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, {0}, + NULL, msm_vidc_set_bitrate_mode}, + + {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}, + + {FRAME_SKIP_MODE, ENC, CODECS_ALL, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_DISABLE}, + /* TODO(AS): uncomment once below v4l2 id is + * available (post 5.4 kernel) + */ + //V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE}, + + {FRAME_RC_ENABLE, ENC, CODECS_ALL, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_ENABLE, + V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE}, + + // TODO: GOP dependencies {GOP_SIZE, ENC, CODECS_ALL, 0, MAX_GOP, 1, 2 * DEFAULT_FPS - 1, V4L2_CID_MPEG_VIDEO_GOP_SIZE, @@ -270,42 +327,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { V4L2_CID_MPEG_VIDEO_GOP_CLOSURE, 0}, - {BIT_RATE, ENC, CODECS_ALL, - 1, 220000000, 1, 20000000, - V4L2_CID_MPEG_VIDEO_BITRATE, - HFI_PROP_TOTAL_BITRATE, - 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_u32}, - - {BIT_RATE, DEC, CODECS_ALL, 1, 220000000, 1, 220000000}, - - /* Secure usecase specific */ - {SECURE_FRAME_WIDTH, ENC|DEC, CODECS_ALL, 128, 4096, 1, 1920}, - - {SECURE_FRAME_HEIGHT, ENC|DEC, CODECS_ALL, 128, 4096, 1, 1080}, - - /* (4096 * 2304) / 256 */ - {SECURE_MBPF, ENC|DEC, CODECS_ALL, 64, 36864, 1, 36864}, - - {SECURE_MODE, ENC|DEC, CODECS_ALL, - V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, - 1, V4L2_MPEG_MSM_VIDC_DISABLE, - V4L2_CID_MPEG_VIDC_SECURE, - HFI_PROP_SECURE, - CAP_FLAG_ROOT, - {0}, - {0}, - NULL, msm_vidc_set_u32}, - {BLUR_TYPES, ENC, CODECS_ALL, 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_OUTPUT_PORT, {0}, {0}, - NULL, msm_vidc_set_u32}, + NULL, msm_vidc_set_u32_enum}, {BLUR_RESOLUTION, ENC, CODECS_ALL, 0, S32_MAX, 1, 0, @@ -376,7 +404,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_AUD, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - // confirm codec {TIME_DELTA_BASED_RC, ENC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_ENABLE, @@ -384,7 +411,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_TIME_DELTA_BASED_RATE_CONTROL, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - // confirm codec {CONTENT_ADAPTIVE_CODING, ENC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_ENABLE, @@ -398,29 +424,73 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_BITRATE_BOOST, 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_OUTPUT_PORT}, - {VBV_DELAY, ENC, CODECS_ALL, 0, 1000, 500, 0, V4L2_CID_MPEG_VIDEO_VBV_DELAY}, - /* HEVC specific */ + // TODO: QP for 10 bits and review QP caps + {MIN_FRAME_QP, ENC, HEVC, 0, 51, 1, 20, V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP, HFI_PROP_MIN_QP_PACKED, 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_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_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_OUTPUT_PORT}, + + // confirm codec + {B_FRAME_MIN_QP, ENC, HEVC|H264, + 0, 51, 1, 20, + V4L2_CID_MPEG_VIDC_B_FRAME_MIN_QP, + HFI_PROP_MIN_QP_PACKED, + 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_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_OUTPUT_PORT}, + {I_FRAME_MAX_QP, ENC, H264, + 0, 51, 1, 20, + V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP, + HFI_PROP_MAX_QP_PACKED, + 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_MAX_QP_PACKED, + 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_OUTPUT_PORT}, + {HEVC_HIER_QP, ENC, HEVC, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE, @@ -437,36 +507,42 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_QP_PACKED, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + {I_FRAME_QP, ENC, H264, + 0, 51, 1, 10, + V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, + HFI_PROP_QP_PACKED, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + + {I_FRAME_QP, ENC, VP9, 0, 127, 1, 20}, + {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_OUTPUT_PORT}, + {P_FRAME_QP, ENC, H264, + 0, 51, 1, 20, + V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, + HFI_PROP_QP_PACKED, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + + {P_FRAME_QP, ENC, VP9, 0, 127, 1, 40}, + {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_OUTPUT_PORT}, - {HIER_CODING_TYPE, ENC, HEVC, - V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B, - V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P, - BIT(V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B) | - BIT(V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P), - 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_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, + {B_FRAME_QP, ENC, H264, + 0, 51, 1, 20, + V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, + HFI_PROP_QP_PACKED, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + {B_FRAME_QP, ENC, VP9, 0, 127, 1, 40}, + {L0_QP, ENC, HEVC, 0, 51, 1, 20, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP, @@ -503,85 +579,55 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_QP_PACKED, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - {PROFILE, ENC|DEC, HEVC, - V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, - V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, - BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) | - BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE) | - BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10), - V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, - V4L2_CID_MPEG_VIDEO_HEVC_PROFILE, - HFI_PROP_PROFILE, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, - {0}, - {ENTROPY_MODE}, - NULL, msm_vidc_set_u32}, + {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_OUTPUT_PORT}, - {LEVEL, ENC|DEC, HEVC, - V4L2_MPEG_VIDEO_HEVC_LEVEL_1, - V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2, - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1) | - BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2), - V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2, - V4L2_CID_MPEG_VIDEO_HEVC_LEVEL, - HFI_PROP_LEVEL, + {HIER_CODING_TYPE, ENC, HEVC, + V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B, + V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P, + BIT(V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B) | + BIT(V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P), + 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_OUTPUT_PORT | CAP_FLAG_MENU, - {0}, - {0}, - NULL, msm_vidc_set_u32}, + {0}, {0}, + NULL, msm_vidc_set_u32_enum}, - {HEVC_TIER, ENC|DEC, HEVC, - V4L2_MPEG_VIDEO_HEVC_TIER_MAIN, - V4L2_MPEG_VIDEO_HEVC_TIER_HIGH, - BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) | - BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH), - V4L2_MPEG_VIDEO_HEVC_TIER_HIGH, - V4L2_CID_MPEG_VIDEO_HEVC_TIER, - HFI_PROP_TIER, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, - {0}, - {0}, - NULL, msm_vidc_set_u32}, - - {LF_MODE, ENC, HEVC, - V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED, - DB_HEVC_DISABLE_SLICE_BOUNDARY, - BIT(V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED) | - BIT(V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED) | - BIT(DB_HEVC_DISABLE_SLICE_BOUNDARY), - V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED, - V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE, - HFI_PROP_DEBLOCKING_MODE, + /* TODO(AS) - ctrl init failing. Need to fix + {HIER_CODING_TYPE, ENC, H264, + V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B, + V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, + BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B) | + BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P), + 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_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_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_OUTPUT_PORT}, - - {LOSSLESS, ENC, HEVC, + //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_HEVC_LOSSLESS_CU, - HFI_PROP_RATE_CONTROL, + V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING, + HFI_PROP_LAYER_ENCODING_TYPE, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + + // TODO: add relationship with GOP_SIZE in caps + {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_OUTPUT_PORT}, + + {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_OUTPUT_PORT}, {L0_BR, ENC, HEVC, @@ -620,138 +666,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_BITRATE_LAYER6, 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_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, - /* TODO parents */{0}, - {SLICE_MAX_BYTES}, - 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_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_OUTPUT_PORT}, - - {SLICE_MODE, ENC, H264|HEVC, - V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, - V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES, - BIT(V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) | - BIT(V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) | - BIT(V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES), - V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, - V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE, - 0, - 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_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, - {0}, {0}, - msm_vidc_adjust_bitrate, msm_vidc_set_u32}, - - {LEVEL, DEC, MPEG2, - V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW, - V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH, - BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW) | - BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN) | - BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440) | - BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH), - V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH, - V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL, - HFI_PROP_LEVEL, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU}, - - {PROFILE, DEC, MPEG2, - V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE, - V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN, - BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE) | - BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN), - V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN, - V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE, - HFI_PROP_PROFILE, - 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}, - /* (1920 * 1088) / 256 */ - {MBPF, DEC, MPEG2, 64, 8160, 1, 8160}, - /* ((1920 * 1088) / 256) * 30*/ - {MBPS, DEC, MPEG2, 64, 244800, 1, 244800}, - {FRAME_RATE, DEC, MPEG2, 1, 30, 1, 30}, - - /* H264 specific */ - {CABAC_BITRATE, ENC, H264, 1, 160000000, 1, 20000000}, - - {I_FRAME_QP, ENC, H264, - 0, 51, 1, 10, - V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, - HFI_PROP_QP_PACKED, - 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_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_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_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_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_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_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_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_OUTPUT_PORT}, - {ENTROPY_MODE, ENC, H264, V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC, V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, @@ -760,26 +674,63 @@ 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_OUTPUT_PORT | CAP_FLAG_MENU, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {PROFILE}, - {BIT_RATE}, + {0}, msm_vidc_adjust_entropy_mode, msm_vidc_set_u32}, + {ENTROPY_MODE, DEC, CODECS_ALL, + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC, + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, + BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) | + BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC), + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, + 0, + HFI_PROP_CABAC_SESSION}, + + /* H264 does not support 10 bit, PIX_FMTS would not be a Parent for this */ {PROFILE, ENC|DEC, H264, V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, - V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10, + V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH, BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH) | BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) | - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10), + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH), V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, V4L2_CID_MPEG_VIDEO_H264_PROFILE, HFI_PROP_PROFILE, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, {ENTROPY_MODE}, - NULL, msm_vidc_set_u32}, + NULL, msm_vidc_set_u32_enum}, + + {PROFILE, ENC|DEC, HEVC, + V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, + V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, + BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) | + BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE) | + BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10), + V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, + V4L2_CID_MPEG_VIDEO_HEVC_PROFILE, + HFI_PROP_PROFILE, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {PIX_FMTS}, + {0}, + msm_vidc_adjust_profile, msm_vidc_set_u32_enum}, + + {PROFILE, DEC, VP9, + V4L2_MPEG_VIDEO_VP9_PROFILE_0, + V4L2_MPEG_VIDEO_VP9_PROFILE_2, + BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) | + BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2), + V4L2_MPEG_VIDEO_VP9_PROFILE_0, + V4L2_CID_MPEG_VIDEO_VP9_PROFILE, + HFI_PROP_PROFILE, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, + {0}, + NULL, msm_vidc_set_u32_enum}, {LEVEL, ENC|DEC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, @@ -806,7 +757,59 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, {0}, - NULL, msm_vidc_set_u32}, + NULL, msm_vidc_set_u32_enum}, + + {LEVEL, ENC|DEC, HEVC, + V4L2_MPEG_VIDEO_HEVC_LEVEL_1, + V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2, + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2), + V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2, + V4L2_CID_MPEG_VIDEO_HEVC_LEVEL, + HFI_PROP_LEVEL, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, + {0}, + NULL, msm_vidc_set_u32_enum}, + + /* TODO: Bring the VP9 Level upstream GKI change, and level cap here: + * go/videogki + */ + + {HEVC_TIER, ENC|DEC, HEVC, + V4L2_MPEG_VIDEO_HEVC_TIER_MAIN, + V4L2_MPEG_VIDEO_HEVC_TIER_HIGH, + BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) | + BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH), + V4L2_MPEG_VIDEO_HEVC_TIER_HIGH, + V4L2_CID_MPEG_VIDEO_HEVC_TIER, + HFI_PROP_TIER, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, + {0}, + NULL, msm_vidc_set_u32_enum}, + + {LF_MODE, ENC, HEVC, + V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED, + DB_HEVC_DISABLE_SLICE_BOUNDARY, + BIT(V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED) | + BIT(V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED) | + BIT(DB_HEVC_DISABLE_SLICE_BOUNDARY), + 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_OUTPUT_PORT | CAP_FLAG_MENU}, {LF_MODE, ENC, H264, V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED, @@ -819,36 +822,68 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_DEBLOCKING_MODE, 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, + {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_OUTPUT_PORT}, - /* TODO(AS) - ctrl init failing. Need to fix - {HIER_CODING_TYPE, ENC, H264, - V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B, - V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, - BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B) | - BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P), - V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, - V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE, - HFI_PROP_LAYER_ENCODING_TYPE, + {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_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_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_OUTPUT_PORT}, + + {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_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_OUTPUT_PORT}, + + {SLICE_MODE, ENC, H264|HEVC, + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES, + BIT(V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) | + BIT(V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) | + BIT(V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES), + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, + V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE, + 0, 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, + // TODO: MB level RC - mapping + {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_OUTPUT_PORT}, - {HIER_LAYER_QP, ENC, H264, - 0, 0x0060033, 1, 20, - V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP, - HFI_PROP_QP_PACKED, + {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_OUTPUT_PORT}, /* TODO: CHROMA_QP_INDEX_OFFSET is applicable to HEVC as well */ @@ -859,28 +894,11 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_CHROMA_QP_OFFSET, 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_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_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_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, + {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_OUTPUT_PORT}, {DISPLAY_DELAY, DEC, CODECS_ALL, @@ -889,58 +907,24 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_DECODE_ORDER_OUTPUT, 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_OUTPUT_PORT}, - - /* VP9 specific */ - {I_FRAME_QP, ENC, VP9, 0, 127, 1, 20}, - - {P_FRAME_QP, ENC, VP9, 0, 127, 1, 40}, - - {B_FRAME_QP, ENC, VP9, 0, 127, 1, 40}, - - {PROFILE, DEC, VP9, - V4L2_MPEG_VIDEO_VP9_PROFILE_0, - V4L2_MPEG_VIDEO_VP9_PROFILE_2, - BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) | - BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2), - V4L2_MPEG_VIDEO_VP9_PROFILE_0, - V4L2_CID_MPEG_VIDEO_VP9_PROFILE, - HFI_PROP_PROFILE, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, - {0}, - {ENTROPY_MODE}, - NULL, msm_vidc_set_u32}, - /* conceal color */ {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, 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, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + // TODO {STAGE, DEC|ENC, CODECS_ALL, 1, 2, 1, 2}, {PIPE, DEC|ENC, CODECS_ALL, 1, 4, 1, 4}, {POC, DEC, H264, 0, 1, 1, 0}, - {ENTROPY_MODE, DEC, CODECS_ALL, - V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC, - V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, - BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) | - BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC), - V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, - 0, - HFI_PROP_CABAC_SESSION}, - {CODED_FRAMES, DEC, CODECS_ALL, 0, 1, 1, 0, 0, HFI_PROP_CODED_FRAMES}, diff --git a/driver/variant/iris2/src/msm_vidc_buffer_iris2.c b/driver/variant/iris2/src/msm_vidc_buffer_iris2.c index 11599fad8f..940d94fa55 100644 --- a/driver/variant/iris2/src/msm_vidc_buffer_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_buffer_iris2.c @@ -139,7 +139,7 @@ static u32 msm_vidc_decoder_line_size_iris2(struct msm_vidc_inst *inst) pixelformat = inst->fmts[OUTPUT_PORT].fmt.pix_mp.pixelformat; if (pixelformat == MSM_VIDC_FMT_NV12 || - pixelformat == MSM_VIDC_FMT_NV12_P010) + pixelformat == MSM_VIDC_FMT_P010) is_opb = true; else is_opb = false; @@ -304,8 +304,8 @@ static u32 msm_vidc_encoder_line_size_iris2(struct msm_vidc_inst *inst) width = f->fmt.pix_mp.width; height = f->fmt.pix_mp.height; pixelformat = f->fmt.pix_mp.pixelformat; - if (pixelformat == MSM_VIDC_FMT_NV12_P010 || - pixelformat == MSM_VIDC_FMT_NV12_TP10_UBWC) + if (pixelformat == MSM_VIDC_FMT_P010 || + pixelformat == MSM_VIDC_FMT_TP10C) is_tenbit = true; else is_tenbit = false; @@ -335,8 +335,8 @@ static u32 msm_vidc_encoder_dpb_size_iris2(struct msm_vidc_inst *inst) width = f->fmt.pix_mp.width; height = f->fmt.pix_mp.height; pixelformat = f->fmt.pix_mp.pixelformat; - if (pixelformat == MSM_VIDC_FMT_NV12_P010 || - pixelformat == MSM_VIDC_FMT_NV12_TP10_UBWC) + if (pixelformat == MSM_VIDC_FMT_P010 || + pixelformat == MSM_VIDC_FMT_TP10C) is_tenbit = true; else is_tenbit = false; @@ -384,8 +384,8 @@ static u32 msm_vidc_encoder_vpss_size_iris2(struct msm_vidc_inst* inst) width = f->fmt.pix_mp.width; height = f->fmt.pix_mp.height; pixelformat = f->fmt.pix_mp.pixelformat; - if (pixelformat == MSM_VIDC_FMT_NV12_P010 || - pixelformat == MSM_VIDC_FMT_NV12_TP10_UBWC) + if (pixelformat == MSM_VIDC_FMT_P010 || + pixelformat == MSM_VIDC_FMT_TP10C) is_tenbit = true; else is_tenbit = false; diff --git a/driver/variant/iris2/src/msm_vidc_power_iris2.c b/driver/variant/iris2/src/msm_vidc_power_iris2.c index 449eb6bb78..e47829d733 100644 --- a/driver/variant/iris2/src/msm_vidc_power_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_power_iris2.c @@ -473,7 +473,7 @@ static u64 __calculate_encoder(struct vidc_bus_vote_data *d) b_frames_enabled = d->b_frames_enabled; original_color_format = d->num_formats >= 1 ? - d->color_formats[0] : MSM_VIDC_FMT_NV12_UBWC; + d->color_formats[0] : MSM_VIDC_FMT_NV12C; original_compression_enabled = __ubwc(original_color_format); diff --git a/driver/vidc/inc/msm_vidc_bus.h b/driver/vidc/inc/msm_vidc_bus.h index 91005e0464..d28de7ba94 100644 --- a/driver/vidc/inc/msm_vidc_bus.h +++ b/driver/vidc/inc/msm_vidc_bus.h @@ -220,8 +220,8 @@ void __dump(struct dump dump[], int len); static inline bool __ubwc(enum msm_vidc_colorformat_type f) { switch (f) { - case MSM_VIDC_FMT_NV12_UBWC: - case MSM_VIDC_FMT_NV12_TP10_UBWC: + case MSM_VIDC_FMT_NV12C: + case MSM_VIDC_FMT_TP10C: return true; default: return false; @@ -233,11 +233,11 @@ static inline int __bpp(enum msm_vidc_colorformat_type f) switch (f) { case MSM_VIDC_FMT_NV12: case MSM_VIDC_FMT_NV21: - case MSM_VIDC_FMT_NV12_UBWC: - case MSM_VIDC_FMT_RGBA8888_UBWC: + case MSM_VIDC_FMT_NV12C: + case MSM_VIDC_FMT_RGBA8888C: return 8; - case MSM_VIDC_FMT_NV12_P010: - case MSM_VIDC_FMT_NV12_TP10_UBWC: + case MSM_VIDC_FMT_P010: + case MSM_VIDC_FMT_TP10C: return 10; default: d_vpr_e("Unsupported colorformat (%x)", f); diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 3cfae1b268..38d8902faa 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -28,10 +28,17 @@ int msm_vidc_ctrl_deinit(struct msm_vidc_inst *inst); int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl); int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_entropy_mode(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_profile(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_ltr_count(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst); +int msm_vidc_set_header_mode(void *instance, + enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_bitrate_mode(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_u32(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_u32_enum(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_s32(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_array(void *instance, @@ -41,5 +48,7 @@ int msm_vidc_set_q16(void *instance, int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst); int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst, enum msm_vidc_inst_capability_type cap_id, u32 *value); +int msm_vidc_v4l2_to_hfi_enum(struct msm_vidc_inst *inst, + enum msm_vidc_inst_capability_type cap_id, u32 *value); #endif diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index ec9159732a..308a0b0067 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -114,13 +114,13 @@ static inline bool is_linear_colorformat(enum msm_vidc_colorformat_type colorfor { return colorformat == MSM_VIDC_FMT_NV12 || colorformat == MSM_VIDC_FMT_NV21 || - colorformat == MSM_VIDC_FMT_NV12_P010; + colorformat == MSM_VIDC_FMT_P010; } static inline bool is_10bit_colorformat(enum msm_vidc_colorformat_type colorformat) { - return colorformat == MSM_VIDC_FMT_NV12_P010 || - colorformat == MSM_VIDC_FMT_NV12_TP10_UBWC; + return colorformat == MSM_VIDC_FMT_P010 || + colorformat == MSM_VIDC_FMT_TP10C; } static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst) diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index a3aa5442c5..86f75c91e5 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -108,18 +108,17 @@ enum msm_vidc_codec_type { MSM_VIDC_H264 = BIT(0), MSM_VIDC_HEVC = BIT(1), MSM_VIDC_VP9 = BIT(2), - MSM_VIDC_MPEG2 = BIT(3), }; enum msm_vidc_colorformat_type { MSM_VIDC_FMT_NONE = 0, MSM_VIDC_FMT_NV12, MSM_VIDC_FMT_NV21, - MSM_VIDC_FMT_NV12_UBWC, - MSM_VIDC_FMT_NV12_P010, - MSM_VIDC_FMT_NV12_TP10_UBWC, + MSM_VIDC_FMT_NV12C, + MSM_VIDC_FMT_P010, + MSM_VIDC_FMT_TP10C, MSM_VIDC_FMT_RGBA8888, - MSM_VIDC_FMT_RGBA8888_UBWC, + MSM_VIDC_FMT_RGBA8888C, }; enum msm_vidc_buffer_type { @@ -229,47 +228,50 @@ enum msm_vidc_core_capability_type { enum msm_vidc_inst_capability_type { INST_CAP_NONE = 0, FRAME_WIDTH, + LOSSLESS_FRAME_WIDTH, + SECURE_FRAME_WIDTH, + HEVC_IMAGE_FRAME_WIDTH, + HEIC_IMAGE_FRAME_WIDTH, FRAME_HEIGHT, + LOSSLESS_FRAME_HEIGHT, + SECURE_FRAME_HEIGHT, + HEVC_IMAGE_FRAME_HEIGHT, + HEIC_IMAGE_FRAME_HEIGHT, PIX_FMTS, MIN_BUFFERS_INPUT, MIN_BUFFERS_OUTPUT, MBPF, + LOSSLESS_MBPF, + BATCH_MBPF, + SECURE_MBPF, MBPS, + POWER_SAVE_MBPS, FRAME_RATE, + OPERATING_RATE, SCALE_X, SCALE_Y, B_FRAME, - POWER_SAVE_MBPS, - BATCH_MBPF, - BATCH_FRAME_RATE, - LOSSLESS_FRAME_WIDTH, - LOSSLESS_FRAME_HEIGHT, - LOSSLESS_MBPF, - ALL_INTRA_FRAME_RATE, - HEVC_IMAGE_FRAME_WIDTH, - HEVC_IMAGE_FRAME_HEIGHT, - HEIC_IMAGE_FRAME_WIDTH, - HEIC_IMAGE_FRAME_HEIGHT, MB_CYCLES_VSP, MB_CYCLES_VPP, MB_CYCLES_LP, MB_CYCLES_FW, MB_CYCLES_FW_VPP, + SECURE_MODE, HFLIP, VFLIP, - PREPEND_SPSPPS_TO_IDR, - REQUEST_I_FRAME, + ROTATION, SLICE_INTERFACE, - FRAME_RC, - BITRATE_MODE, HEADER_MODE, + PREPEND_SPSPPS_TO_IDR, + META_SEQ_HDR_NAL, + REQUEST_I_FRAME, + BIT_RATE, + BITRATE_MODE, + LOSSLESS, + FRAME_SKIP_MODE, + FRAME_RC_ENABLE, GOP_SIZE, GOP_CLOSURE, - BIT_RATE, - SECURE_FRAME_WIDTH, - SECURE_FRAME_HEIGHT, - SECURE_MBPF, - SECURE_MODE, BLUR_TYPES, BLUR_RESOLUTION, CSC_CUSTOM_MATRIX, @@ -284,28 +286,36 @@ enum msm_vidc_inst_capability_type { TIME_DELTA_BASED_RC, CONTENT_ADAPTIVE_CODING, BITRATE_BOOST, - ROTATION, VBV_DELAY, MIN_FRAME_QP, + I_FRAME_MIN_QP, + P_FRAME_MIN_QP, + B_FRAME_MIN_QP, MAX_FRAME_QP, + I_FRAME_MAX_QP, + P_FRAME_MAX_QP, + B_FRAME_MAX_QP, HEVC_HIER_QP, I_FRAME_QP, P_FRAME_QP, - I_FRAME_MIN_QP, - I_FRAME_MAX_QP, - P_FRAME_MIN_QP, - P_FRAME_MAX_QP, B_FRAME_QP, - B_FRAME_MIN_QP, - B_FRAME_MAX_QP, - HIER_CODING_TYPE, - HIER_CODING_LAYER, L0_QP, L1_QP, L2_QP, L3_QP, L4_QP, L5_QP, + HIER_LAYER_QP, + HIER_CODING_TYPE, + HIER_CODING, + HIER_CODING_LAYER, + L0_BR, + L1_BR, + L2_BR, + L3_BR, + L4_BR, + L5_BR, + ENTROPY_MODE, PROFILE, LEVEL, HEVC_TIER, @@ -313,22 +323,11 @@ enum msm_vidc_inst_capability_type { LF_ALPHA, LF_BETA, LF_TC, - LOSSLESS, - L0_BR, - L1_BR, - L2_BR, - L3_BR, - L4_BR, - L5_BR, SLICE_MAX_BYTES, SLICE_MAX_MB, SLICE_MODE, - CABAC_BITRATE, MB_RC, TRANSFORM_8X8, - ENTROPY_MODE, - HIER_CODING, - HIER_LAYER_QP, CHROMA_QP_INDEX_OFFSET, DISPLAY_DELAY_ENABLE, DISPLAY_DELAY, @@ -341,7 +340,6 @@ enum msm_vidc_inst_capability_type { BIT_DEPTH, CODEC_CONFIG, META_LTR_MARK_USE, - META_SEQ_HDR_NAL, META_DPB_MISR, META_OPB_MISR, META_INTERLACE, diff --git a/driver/vidc/inc/msm_vidc_power.h b/driver/vidc/inc/msm_vidc_power.h index efb25ef1fb..009ff8f1dc 100644 --- a/driver/vidc/inc/msm_vidc_power.h +++ b/driver/vidc/inc/msm_vidc_power.h @@ -221,8 +221,8 @@ void __dump(struct dump dump[], int len); static inline bool __ubwc(enum msm_vidc_colorformat_type f) { switch (f) { - case MSM_VIDC_FMT_NV12_UBWC: - case MSM_VIDC_FMT_NV12_TP10_UBWC: + case MSM_VIDC_FMT_NV12C: + case MSM_VIDC_FMT_TP10C: return true; default: return false; @@ -234,11 +234,11 @@ static inline int __bpp(enum msm_vidc_colorformat_type f) switch (f) { case MSM_VIDC_FMT_NV12: case MSM_VIDC_FMT_NV21: - case MSM_VIDC_FMT_NV12_UBWC: - case MSM_VIDC_FMT_RGBA8888_UBWC: + case MSM_VIDC_FMT_NV12C: + case MSM_VIDC_FMT_RGBA8888C: return 8; - case MSM_VIDC_FMT_NV12_P010: - case MSM_VIDC_FMT_NV12_TP10_UBWC: + case MSM_VIDC_FMT_P010: + case MSM_VIDC_FMT_TP10C: return 10; default: d_vpr_e("Unsupported colorformat (%x)", f); diff --git a/driver/vidc/src/hfi_packet.c b/driver/vidc/src/hfi_packet.c index 5874b352e4..bd08ee4f14 100644 --- a/driver/vidc/src/hfi_packet.c +++ b/driver/vidc/src/hfi_packet.c @@ -166,8 +166,6 @@ u32 get_hfi_codec(struct msm_vidc_inst *inst) return HFI_CODEC_DECODE_HEVC; case MSM_VIDC_VP9: return HFI_CODEC_DECODE_VP9; - case MSM_VIDC_MPEG2: - return HFI_CODEC_DECODE_MPEG2; default: d_vpr_e("invalid codec %d, domain %d\n", inst->codec, inst->domain); @@ -184,19 +182,19 @@ u32 get_hfi_colorformat(struct msm_vidc_inst *inst, case MSM_VIDC_FMT_NV12: hfi_colorformat = HFI_COLOR_FMT_NV12; break; - case MSM_VIDC_FMT_NV12_UBWC: + case MSM_VIDC_FMT_NV12C: hfi_colorformat = HFI_COLOR_FMT_NV12_UBWC; break; - case MSM_VIDC_FMT_NV12_P010: + case MSM_VIDC_FMT_P010: hfi_colorformat = HFI_COLOR_FMT_P010; break; - case MSM_VIDC_FMT_NV12_TP10_UBWC: + case MSM_VIDC_FMT_TP10C: hfi_colorformat = HFI_COLOR_FMT_TP10_UBWC; break; case MSM_VIDC_FMT_RGBA8888: hfi_colorformat = HFI_COLOR_FMT_RGBA8888; break; - case MSM_VIDC_FMT_RGBA8888_UBWC: + case MSM_VIDC_FMT_RGBA8888C: hfi_colorformat = HFI_COLOR_FMT_RGBA8888_UBWC; break; case MSM_VIDC_FMT_NV21: diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index 94db5ab018..4651a7747e 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -896,6 +896,7 @@ error: return rc; } +// TODO: use PIX_FMTS caps to check supported color format int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { int rc = 0; diff --git a/driver/vidc/src/msm_vidc_buffer.c b/driver/vidc/src/msm_vidc_buffer.c index 33e12af791..1e7d427bde 100644 --- a/driver/vidc/src/msm_vidc_buffer.c +++ b/driver/vidc/src/msm_vidc_buffer.c @@ -70,9 +70,6 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst) case MSM_VIDC_VP9: output_min_count = 9; break; - case MSM_VIDC_MPEG2: - output_min_count = 6; - break; default: output_min_count = 4; } diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 73f77f9b5c..cfd955ec4d 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -172,6 +172,32 @@ static const char *msm_vidc_get_priv_ctrl_name(u32 sid, u32 control_id) } } +static int msm_vidc_packetize_control(struct msm_vidc_inst *inst, + enum msm_vidc_inst_capability_type cap_id, u32 payload_type, + void *hfi_val, u32 payload_size, const char *func) +{ + int rc = 0; + + s_vpr_l(inst->sid, + "%s: hfi_id: %#x, value: %#x\n", func, + inst->capabilities->cap[cap_id].hfi_id, + *(s64 *)hfi_val); + + rc = venus_hfi_session_property(inst, + inst->capabilities->cap[cap_id].hfi_id, + HFI_HOST_FLAGS_NONE, + msm_vidc_get_port_info(inst, cap_id), + payload_type, + hfi_val, + sizeof(payload_size)); + if (rc) + s_vpr_e(inst->sid, + "%s: failed to set cap_id: %d to fw\n", + __func__, cap_id); + + return rc; +} + static enum msm_vidc_inst_capability_type msm_vidc_get_cap_id( struct msm_vidc_inst *inst, u32 id) { @@ -589,10 +615,8 @@ exit: int msm_vidc_adjust_entropy_mode(void *instance, struct v4l2_ctrl *ctrl) { int rc = 0; - int i = 0; struct msm_vidc_inst_capability *capability; s32 adjusted_value; - enum msm_vidc_inst_capability_type parent_id; struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; s32 profile = -1; @@ -609,12 +633,60 @@ int msm_vidc_adjust_entropy_mode(void *instance, struct v4l2_ctrl *ctrl) else adjusted_value = capability->cap[ENTROPY_MODE].value; - /* check parents and adjust cabac session value */ + if (inst->codec != MSM_VIDC_H264) { + s_vpr_e(inst->sid, + "%s: incorrect entry in database. fix the database\n", + __func__); + return 0; + } + + profile = capability->cap[PROFILE].value; + + if (profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE || + profile == V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) + adjusted_value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC; + + if (capability->cap[ENTROPY_MODE].value != adjusted_value) { + s_vpr_h(inst->sid, "%s: updated from %#x to adjusted %#x\n", __func__, + capability->cap[ENTROPY_MODE].value, adjusted_value); + capability->cap[ENTROPY_MODE].value = adjusted_value; + } + + return rc; +} + +int msm_vidc_adjust_profile(void *instance, struct v4l2_ctrl *ctrl) +{ + int rc = 0; + int i = 0; + struct msm_vidc_inst_capability *capability; + s32 adjusted_value; + enum msm_vidc_inst_capability_type parent_id; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + s32 pix_fmt = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + capability = inst->capabilities; + + /* ctrl is always NULL in streamon case */ + if (ctrl) + adjusted_value = ctrl->val; + else + adjusted_value = capability->cap[PROFILE].value; + + /* TODO(AS): Create a utility for this while loop and add + * detailed comments within for utility functionality + */ while (i < MAX_CAP_PARENTS && - capability->cap[ENTROPY_MODE].parents[i]) { - parent_id = capability->cap[ENTROPY_MODE].parents[i]; - if (parent_id == PROFILE) - profile = capability->cap[PROFILE].value; + capability->cap[PROFILE].parents[i]) { + parent_id = capability->cap[PROFILE].parents[i]; + if (parent_id == PIX_FMTS) { + pix_fmt = capability->cap[PIX_FMTS].value; + } else s_vpr_e(inst->sid, "%s: invalid parent %d\n", @@ -622,22 +694,32 @@ int msm_vidc_adjust_entropy_mode(void *instance, struct v4l2_ctrl *ctrl) i++; } - if (profile == -1) { + /* PIX_FMTS dependency is common across all chipsets. + * Hence, PIX_FMTS must be specified as Parent for HEVC profile. + * Otherwise it would be a database error that should be fixed. + */ + if (pix_fmt == -1) { s_vpr_e(inst->sid, - "%s: missing parents %d %d\n", - __func__, profile); - return 0; + "%s: missing parent: %d, please correct database\n", + __func__, PIX_FMTS); + return -EINVAL; } - if ((profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE || - profile == V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) && - adjusted_value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC) - adjusted_value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC; + /* 10 bit profile for 10 bit color format */ + if (pix_fmt == MSM_VIDC_FMT_TP10C || + pix_fmt == MSM_VIDC_FMT_P010) { + adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10; + } else { + /* 8 bit profile for 8 bit color format */ + if (adjusted_value == V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10) + adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN; + } - if (capability->cap[ENTROPY_MODE].value != adjusted_value) { - s_vpr_h(inst->sid, "%s: updated from %#x to adjusted %#x\n", __func__, - capability->cap[ENTROPY_MODE].value, adjusted_value); - capability->cap[ENTROPY_MODE].value = adjusted_value; + if (capability->cap[PROFILE].value != adjusted_value) { + s_vpr_h(inst->sid, + "%s: updated from %#x to adjusted %#x\n", __func__, + capability->cap[PROFILE].value, adjusted_value); + capability->cap[PROFILE].value = adjusted_value; } return rc; @@ -687,30 +769,6 @@ int msm_vidc_adjust_ltr_count(void *instance, struct v4l2_ctrl *ctrl) return rc; } -int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl) -{ - int rc = 0; - // u32 cabac_max_bitrate; - struct msm_vidc_inst_capability *capability; - struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; - s32 new_value; - - if (!inst || !inst->capabilities) { - d_vpr_e("%s: invalid params\n", __func__); - return -EINVAL; - } - - capability = inst->capabilities; - - if (ctrl) - new_value = ctrl->val; - else - new_value = capability->cap[BIT_RATE].value; - - /* TO DO */ - return rc; -} - /* * Loop over instance capabilities with CAP_FLAG_ROOT * and call adjust function, where @@ -766,6 +824,93 @@ exit: return rc; } +int msm_vidc_set_bitrate_mode(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + int lossless, frame_rc, bitrate_mode, frame_skip; + u32 hfi_value; + struct msm_vidc_inst_capability *capability; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + bitrate_mode = capability->cap[cap_id].value; + lossless = capability->cap[LOSSLESS].value; + frame_rc = capability->cap[FRAME_RC_ENABLE].value; + frame_skip = capability->cap[FRAME_SKIP_MODE].value; + + if (lossless) { + hfi_value = HFI_RC_LOSSLESS; + return rc; + } + + if (!frame_rc) { + hfi_value = HFI_RC_OFF; + return rc; + } + + if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) { + hfi_value = HFI_RC_VBR_CFR; + } else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) { + if (frame_skip) + hfi_value = HFI_RC_CBR_VFR; + else + hfi_value = HFI_RC_CBR_CFR; + }/* TODO: CQ mode + else if (bitrate_mode == CQ) { + hfi_value = HFI_RC_CQ; + } + */ + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + +int msm_vidc_set_header_mode(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + int header_mode, prepend_sps_pps, hdr_metadata; + u32 hfi_value = 0; + struct msm_vidc_inst_capability *capability; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + header_mode = capability->cap[cap_id].value; + prepend_sps_pps = capability->cap[PREPEND_SPSPPS_TO_IDR].value; + hdr_metadata = capability->cap[META_SEQ_HDR_NAL].value; + + if (header_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) + hfi_value |= HFI_SEQ_HEADER_SEPERATE_FRAME; + else if (header_mode == V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME) + hfi_value |= HFI_SEQ_HEADER_JOINED_WITH_1ST_FRAME; + + if (prepend_sps_pps) { + hfi_value |= HFI_SEQ_HEADER_PREFIX_WITH_SYNC_FRAME; + } + + if (hdr_metadata) { + hfi_value |= HFI_SEQ_HEADER_METADATA; + } + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + int msm_vidc_set_q16(void *instance, enum msm_vidc_inst_capability_type cap_id) { @@ -779,21 +924,9 @@ int msm_vidc_set_q16(void *instance, } hfi_value = inst->capabilities->cap[cap_id].value; - s_vpr_h(inst->sid, - "%s: hfi_id: %#x, value: %#x\n", __func__, - inst->capabilities->cap[cap_id].hfi_id, - hfi_value); - rc = venus_hfi_session_property(inst, - inst->capabilities->cap[cap_id].hfi_id, - HFI_HOST_FLAGS_NONE, - msm_vidc_get_port_info(inst, cap_id), - HFI_PAYLOAD_Q16, - &hfi_value, - sizeof(u32)); - if (rc) - s_vpr_e(inst->sid, - "%s: failed to set cap_id: %d to fw\n", - __func__, cap_id); + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_Q16, + &hfi_value, sizeof(u32), __func__); return rc; } @@ -803,7 +936,7 @@ int msm_vidc_set_u32(void *instance, { int rc = 0; struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; - u32 hfi_value, hfi_payload; + u32 hfi_value; if (!inst || !inst->capabilities) { d_vpr_e("%s: invalid params\n", __func__); @@ -814,27 +947,34 @@ int msm_vidc_set_u32(void *instance, 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; } - s_vpr_h(inst->sid, - "%s: hfi_id: %#x, value: %u\n", __func__, - inst->capabilities->cap[cap_id].hfi_id, - hfi_value); - rc = venus_hfi_session_property(inst, - inst->capabilities->cap[cap_id].hfi_id, - HFI_HOST_FLAGS_NONE, - msm_vidc_get_port_info(inst, cap_id), - hfi_payload, - &hfi_value, - sizeof(u32)); + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + +int msm_vidc_set_u32_enum(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; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + rc = msm_vidc_v4l2_to_hfi_enum(inst, cap_id, &hfi_value); if (rc) - s_vpr_e(inst->sid, - "%s: failed to set cap_id: %d to fw\n", - __func__, cap_id); + return -EINVAL; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM, + &hfi_value, sizeof(u32), __func__); return rc; } @@ -844,26 +984,16 @@ int msm_vidc_set_s32(void *instance, { int rc = 0; struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + s32 hfi_value = 0; if (!inst || !inst->capabilities) { d_vpr_e("%s: invalid params\n", __func__); return -EINVAL; } - s_vpr_h(inst->sid, - "%s: hfi_id: %#x, value: %d\n", __func__, - inst->capabilities->cap[cap_id].hfi_id, - inst->capabilities->cap[cap_id].value); - rc = venus_hfi_session_property(inst, - inst->capabilities->cap[cap_id].hfi_id, - HFI_HOST_FLAGS_NONE, HFI_PORT_NONE, - HFI_PAYLOAD_S32, - &inst->capabilities->cap[cap_id].value, - sizeof(s32)); - if (rc) - s_vpr_e(inst->sid, - "%s: failed to set cap_id: %d to fw\n", - __func__, cap_id); + hfi_value = inst->capabilities->cap[cap_id].value; + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_S32, + &hfi_value, sizeof(u32), __func__); return rc; } @@ -954,15 +1084,6 @@ 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: @@ -976,50 +1097,50 @@ int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst, goto set_default; } 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 = HFI_SEQ_HEADER_SEPERATE_FRAME; - break; - case V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME: - *value = 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: 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; +} + +int msm_vidc_v4l2_to_hfi_enum(struct msm_vidc_inst *inst, + enum msm_vidc_inst_capability_type cap_id, u32 *value) +{ + 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_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; default: s_vpr_e(inst->sid, "%s: mapping not specified for ctrl_id: %#x\n", diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index b2dd409537..b0baf455fa 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -129,9 +129,6 @@ enum msm_vidc_codec_type v4l2_codec_to_driver(u32 v4l2_codec, const char *func) case V4L2_PIX_FMT_VP9: codec = MSM_VIDC_VP9; break; - case V4L2_PIX_FMT_MPEG2: - codec = MSM_VIDC_MPEG2; - break; default: d_vpr_e("%s: invalid v4l2 codec %#x\n", func, v4l2_codec); break; @@ -153,9 +150,6 @@ u32 v4l2_codec_from_driver(enum msm_vidc_codec_type codec, const char *func) case MSM_VIDC_VP9: v4l2_codec = V4L2_PIX_FMT_VP9; break; - case MSM_VIDC_MPEG2: - v4l2_codec = V4L2_PIX_FMT_MPEG2; - break; default: d_vpr_e("%s: invalid driver codec %#x\n", func, codec); break; @@ -176,16 +170,16 @@ enum msm_vidc_colorformat_type v4l2_colorformat_to_driver(u32 v4l2_colorformat, colorformat = MSM_VIDC_FMT_NV21; break; case V4L2_PIX_FMT_VIDC_NV12C: - colorformat = MSM_VIDC_FMT_NV12_UBWC; + colorformat = MSM_VIDC_FMT_NV12C; break; case V4L2_PIX_FMT_VIDC_TP10C: - colorformat = MSM_VIDC_FMT_NV12_TP10_UBWC; + colorformat = MSM_VIDC_FMT_TP10C; break; case V4L2_PIX_FMT_VIDC_ARGB32C: - colorformat = MSM_VIDC_FMT_RGBA8888_UBWC; + colorformat = MSM_VIDC_FMT_RGBA8888C; break; case V4L2_PIX_FMT_VIDC_P010: - colorformat = MSM_VIDC_FMT_NV12_P010; + colorformat = MSM_VIDC_FMT_P010; break; default: d_vpr_e("%s: invalid v4l2 color format %#x\n", @@ -207,16 +201,16 @@ u32 v4l2_colorformat_from_driver(enum msm_vidc_colorformat_type colorformat, case MSM_VIDC_FMT_NV21: v4l2_colorformat = V4L2_PIX_FMT_NV21; break; - case MSM_VIDC_FMT_NV12_UBWC: + case MSM_VIDC_FMT_NV12C: v4l2_colorformat = V4L2_PIX_FMT_VIDC_NV12C; break; - case MSM_VIDC_FMT_NV12_TP10_UBWC: + case MSM_VIDC_FMT_TP10C: v4l2_colorformat = V4L2_PIX_FMT_VIDC_TP10C; break; - case MSM_VIDC_FMT_RGBA8888_UBWC: + case MSM_VIDC_FMT_RGBA8888C: v4l2_colorformat = V4L2_PIX_FMT_VIDC_ARGB32C; break; - case MSM_VIDC_FMT_NV12_P010: + case MSM_VIDC_FMT_P010: v4l2_colorformat = V4L2_PIX_FMT_VIDC_P010; break; default: diff --git a/driver/vidc/src/msm_vidc_power.c b/driver/vidc/src/msm_vidc_power.c index 351be4d020..4cfe5f8a3f 100644 --- a/driver/vidc/src/msm_vidc_power.c +++ b/driver/vidc/src/msm_vidc_power.c @@ -283,7 +283,7 @@ int msm_vidc_scale_buses(struct msm_vidc_inst *inst) * 1 index - opb colorformat */ if (is_10bit_colorformat(color_format)) { - vote_data->color_formats[0] = MSM_VIDC_FMT_NV12_TP10_UBWC; + vote_data->color_formats[0] = MSM_VIDC_FMT_TP10C; } else { vote_data->color_formats[0] = MSM_VIDC_FMT_NV12; }