From patchwork Fri Aug 30 02:17:16 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Osciak X-Patchwork-Id: 19984 X-Patchwork-Delegate: laurent.pinchart@ideasonboard.com Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1VFEHs-0006cf-1f; Fri, 30 Aug 2013 04:18:12 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.72/mailfrontend-6) with esmtp id 1VFEHp-0007f4-5f; Fri, 30 Aug 2013 04:18:11 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755450Ab3H3CR5 (ORCPT + 1 other); Thu, 29 Aug 2013 22:17:57 -0400 Received: from mail-pb0-f48.google.com ([209.85.160.48]:54142 "EHLO mail-pb0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755034Ab3H3CR4 (ORCPT ); Thu, 29 Aug 2013 22:17:56 -0400 Received: by mail-pb0-f48.google.com with SMTP id ma3so1234399pbc.35 for ; Thu, 29 Aug 2013 19:17:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=GvinfdI3ShX9XDqzuNhkvzDjH9+UYd9K9tjnu+nZ18Y=; b=Ti4o2T3RqhCoiVMu0my26FW0j34Q5ZEJKbcG+erwJlDf7ti6Z/YnHTmZbs/NOUnEtN QvDKhlOCrhjVWV3UG/GRc3i8RtsFasnKsDsKjkJOxz6nR2c9fG+lCYr3IB0htNDLLXrB JZsO5tkzRxW3wagBm4r6Ga6tqG8UwjIBec3R0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GvinfdI3ShX9XDqzuNhkvzDjH9+UYd9K9tjnu+nZ18Y=; b=NFo65uLAtUikFIGmM4utOzamzceyYtUVIeGpy2Hl+FHLMvwnnJJvCbiIlLdzA0bg83 Uu0ZUuKip+pPb2gx6v38LvihW3/2JipUz+sq3iaHDHxx43xeRPevy90c0Lqdcuf1AKM6 8geAJQfoRe2O2HfTWVMZAjnNlmoi1AAXGkhEIK9G/H0Z6Op7Jc/0U3HjmE/VcAlkrAbS BzFNFhwD+L78BVIaMW6Y3WwiiyKqrlA/IcixahBA+PJ4FPHKSc0wIKmN+fCFD/iCZGnM fidjzMZrMJbBiQ6IHwbK3uzAWKEXFrfNZStiaVmrfof1SYF5PTYObFOAQqiUAybltybt u2TA== X-Gm-Message-State: ALoCoQlHfa1PDHkwyjSdrOnkjwzbBhYus9S0FLvww/UOIMWfsMj4N73Os1x+WebnXPCemng9Y74c X-Received: by 10.68.129.201 with SMTP id ny9mr6852956pbb.165.1377829075990; Thu, 29 Aug 2013 19:17:55 -0700 (PDT) Received: from kawagoe.tok.corp.google.com (kawagoe.tok.corp.google.com [172.30.88.114]) by mx.google.com with ESMTPSA id ye1sm27935254pab.19.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 29 Aug 2013 19:17:55 -0700 (PDT) From: Pawel Osciak To: linux-media@vger.kernel.org Cc: laurent.pinchart@ideasonboard.com, Pawel Osciak Subject: [PATCH v1 17/19] uvcvideo: Add UVC 1.5 Encoding Unit controls. Date: Fri, 30 Aug 2013 11:17:16 +0900 Message-Id: <1377829038-4726-18-git-send-email-posciak@chromium.org> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1377829038-4726-1-git-send-email-posciak@chromium.org> References: <1377829038-4726-1-git-send-email-posciak@chromium.org> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2013.8.30.20624 X-PMX-Spam: Gauge=IIIIIIIII, Probability=9%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, LINES_OF_YELLING_3 0.05, BODY_SIZE_10000_PLUS 0, DKIM_SIGNATURE 0, __ANY_URI 0, __CP_MEDIA_BODY 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __IN_REP_TO 0, __LINES_OF_YELLING 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_PATH 0, __URI_NO_WWW 0, __URI_NS , __YOUTUBE_RCVD 0' These controls allow modifying encoding parameters. Signed-off-by: Pawel Osciak --- drivers/media/usb/uvc/uvc_ctrl.c | 445 +++++++++++++++++++++++++++++++++++++++ include/uapi/linux/usb/video.h | 23 ++ 2 files changed, 468 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index a0493d6..cd02c99 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -351,6 +351,167 @@ static struct uvc_control_info uvc_ctrls[] = { | UVC_CTRL_FLAG_RESTORE | UVC_CTRL_FLAG_AUTO_UPDATE, }, + /* + * All EU controls are marked as AUTO_UPDATE, because many are, and also + * we can't cache all of them as they are stream/layer dependent, which + * would be too slow/too much to cache. + */ + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_PROFILE_TOOLSET_CONTROL, + .index = 1, + .size = 6, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_MIN_FRAME_INTERVAL_CONTROL, + .index = 3, + .size = 4, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SLICE_MODE_CONTROL, + .index = 4, + .size = 4, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_RATE_CONTROL_MODE_CONTROL, + .index = 5, + .size = 1, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_AVERAGE_BITRATE_CONTROL, + .index = 6, + .size = 4, + .flags = UVC_CTRL_FLAG_SET_CUR + | UVC_CTRL_FLAG_GET_RANGE + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_CPB_SIZE_CONTROL, + .index = 7, + .size = 4, + .flags = UVC_CTRL_FLAG_SET_CUR + | UVC_CTRL_FLAG_GET_RANGE + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_PEAK_BIT_RATE_CONTROL, + .index = 8, + .size = 4, + .flags = UVC_CTRL_FLAG_SET_CUR + | UVC_CTRL_FLAG_GET_RANGE + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QUANTIZATION_PARAMS_CONTROL, + .index = 9, + .size = 6, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SYNC_REF_FRAME_CONTROL, + .index = 10, + .size = 4, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_BUFFER_CONTROL, + .index = 11, + .size = 2, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_PICTURE_CONTROL, + .index = 12, + .size = 2, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_VALIDATION_CONTROL, + .index = 13, + .size = 2, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LEVEL_IDC_LIMIT_CONTROL, + .index = 14, + .size = 1, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SEI_PAYLOADTYPE_CONTROL, + .index = 15, + .size = 8, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QP_RANGE_CONTROL, + .index = 16, + .size = 2, + .flags = UVC_CTRL_FLAG_SET_CUR + | UVC_CTRL_FLAG_GET_RANGE + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_PRIORITY_CONTROL, + .index = 17, + .size = 1, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, + { + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_ERROR_RESILIENCY_CONTROL, + .index = 19, + .size = 2, + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_GET_RES + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, }; static struct uvc_menu_info power_line_frequency_controls[] = { @@ -366,6 +527,32 @@ static struct uvc_menu_info exposure_auto_controls[] = { { 8, "Aperture Priority Mode" }, }; +static struct uvc_menu_info rate_control_mode_controls[] = { + { 1, "VBR" }, + { 2, "CBR" }, + { 3, "Constant QP" }, + { 4, "GVBR" }, + { 5, "VBRN" }, + { 6, "GVBRN" }, +}; + +static struct uvc_menu_info encoder_vp8_sync_frame_type_controls[] = { + { 0, "Reset" }, + { 1, "Generate Intra Frame" }, + { 2, "GDR" }, + { 3, "GDR and Update Golden" }, + { 4, "GDR and Update Alt" }, + { 5, "GDR and Update Golden + Alt" }, + { 6, "Update Golden" }, + { 7, "Update Alt" }, + { 8, "Update Golden + Alt" }, +}; + +static struct uvc_menu_info encoder_vp8_slice_mode_controls[] = { + { 0, "No Partitioning" }, + { 1, "DCT Partitions Per Frame" }, +}; + static __s32 uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping, __u8 query, const __u8 *data) { @@ -686,6 +873,264 @@ static struct uvc_control_mapping uvc_ctrl_mappings[] = { .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, }, + /* Encoder controls. */ + { + .id = V4L2_CID_ENCODER_H264_PROFILE_TOOLSET, + .name = "Encoder, H.264 profile/toolset", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_PROFILE_TOOLSET_CONTROL, + .size = 40, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_MIN_FRAME_INTERVAL, + .name = "Encoder, minimum frame interval", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_MIN_FRAME_INTERVAL_CONTROL, + .size = 32, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_VP8_SLICE_MODE, + .name = "Encoder, VP8 slice mode", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SLICE_MODE_CONTROL, + .size = 16, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_MENU, + .data_type = UVC_CTRL_DATA_TYPE_ENUM, + .menu_info = encoder_vp8_slice_mode_controls, + .menu_count = ARRAY_SIZE(encoder_vp8_slice_mode_controls), + }, + { + .id = V4L2_CID_ENCODER_VP8_DCT_PARTS_PER_FRAME, + .name = "Encoder, VP8 DCT partns/frame", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SLICE_MODE_CONTROL, + .size = 16, + .offset = 16, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_RATE_CONTROL_MODE, + .name = "Encoder, rate control mode", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_RATE_CONTROL_MODE_CONTROL, + .size = 4, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_MENU, + .data_type = UVC_CTRL_DATA_TYPE_ENUM, + .menu_info = rate_control_mode_controls, + .menu_count = ARRAY_SIZE(rate_control_mode_controls), + }, + { + .id = V4L2_CID_ENCODER_AVERAGE_BITRATE, + .name = "Encoder, average bitrate", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_AVERAGE_BITRATE_CONTROL, + .size = 32, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_CPB_SIZE, + .name = "Encoder, CPB size", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_CPB_SIZE_CONTROL, + .size = 32, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_PEAK_BIT_RATE, + .name = "Encoder, peak bit rate", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_PEAK_BIT_RATE_CONTROL, + .size = 32, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_QP_PARAM_I, + .name = "Encoder, QP param, I frames", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QUANTIZATION_PARAMS_CONTROL, + .size = 16, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_QP_PARAM_P, + .name = "Encoder, QP param, P frames", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QUANTIZATION_PARAMS_CONTROL, + .size = 16, + .offset = 16, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_QP_PARAM_BG, + .name = "Encoder, QP param, B/G frames", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QUANTIZATION_PARAMS_CONTROL, + .size = 16, + .offset = 32, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_VP8_SYNC_FRAME_TYPE, + .name = "Encoder, VP8 sync frame type", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SYNC_REF_FRAME_CONTROL, + .size = 8, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_MENU, + .data_type = UVC_CTRL_DATA_TYPE_ENUM, + .menu_info = encoder_vp8_sync_frame_type_controls, + .menu_count = + ARRAY_SIZE(encoder_vp8_sync_frame_type_controls), + }, + { + .id = V4L2_CID_ENCODER_SYNC_FRAME_INTERVAL, + .name = "Encoder, sync frame interval", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SYNC_REF_FRAME_CONTROL, + .size = 16, + .offset = 8, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_NUM_GDR_FRAMES, + .name = "Encoder, number of GDR frames", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SYNC_REF_FRAME_CONTROL, + .size = 8, + .offset = 24, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_LTR_BUFFER_CONTROL, + .name = "Encoder, LTR buffer control", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_BUFFER_CONTROL, + .size = 8, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_LTR_BUFFER_TRUST_MODE, + .name = "Encoder, LTR buffer trust mode", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_BUFFER_CONTROL, + .size = 8, + .offset = 8, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_LTR_PICTURE_POSITION, + .name = "Encoder, LTR picture position", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_PICTURE_CONTROL, + .size = 8, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_LTR_PICTURE_MODE, + .name = "Encoder, LTR picture mode", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_PICTURE_CONTROL, + .size = 8, + .offset = 8, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_LTR_VALIDATION, + .name = "Encoder, LTR validation", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LTR_VALIDATION_CONTROL, + .size = 16, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_BITMASK, + .data_type = UVC_CTRL_DATA_TYPE_BITMASK, + }, + { + .id = V4L2_CID_ENCODER_H264_LEVEL_IDC_LIMIT, + .name = "Encoder, H.264 level IDC limit", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_LEVEL_IDC_LIMIT_CONTROL, + .size = 8, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_H264_SEI_PAYLOAD_TYPE, + .name = "Encoder, H.264 SEI payload type", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_SEI_PAYLOADTYPE_CONTROL, + .size = 64, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_BITMASK, + .data_type = UVC_CTRL_DATA_TYPE_BITMASK, + }, + { + .id = V4L2_CID_ENCODER_MIN_QP, + .name = "Encoder, minimum QP param", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QP_RANGE_CONTROL, + .size = 8, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_SIGNED, + }, + { + .id = V4L2_CID_ENCODER_MAX_QP, + .name = "Encoder, maximum QP param", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_QP_RANGE_CONTROL, + .size = 8, + .offset = 8, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_SIGNED, + }, + { + .id = V4L2_CID_ENCODER_H264_LAYER_PRIORITY, + .name = "Encoder, H.264 layer priority", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_PRIORITY_CONTROL, + .size = 8, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_INTEGER, + .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, + }, + { + .id = V4L2_CID_ENCODER_ERROR_RESILIENCY, + .name = "Encoder, error resiliency", + .entity = UVC_GUID_UVC_ENCODING, + .selector = UVC_EU_ERROR_RESILIENCY_CONTROL, + .size = 16, + .offset = 0, + .v4l2_type = V4L2_CTRL_TYPE_BITMASK, + .data_type = UVC_CTRL_DATA_TYPE_BITMASK, + }, }; /* ------------------------------------------------------------------------ diff --git a/include/uapi/linux/usb/video.h b/include/uapi/linux/usb/video.h index e09c50b..fd1d4b0 100644 --- a/include/uapi/linux/usb/video.h +++ b/include/uapi/linux/usb/video.h @@ -127,6 +127,29 @@ #define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 #define UVC_PU_ANALOG_LOCK_STATUS_CONTROL 0x12 +/* Encoding Unit Control Selectors */ +#define UVC_EU_CONTROL_UNDEFINED 0x00 +#define UVC_EU_SELECT_LAYER_CONTROL 0x01 +#define UVC_EU_PROFILE_TOOLSET_CONTROL 0x02 +#define UVC_EU_VIDEO_RESOLUTION_CONTROL 0x03 +#define UVC_EU_MIN_FRAME_INTERVAL_CONTROL 0x04 +#define UVC_EU_SLICE_MODE_CONTROL 0x05 +#define UVC_EU_RATE_CONTROL_MODE_CONTROL 0x06 +#define UVC_EU_AVERAGE_BITRATE_CONTROL 0x07 +#define UVC_EU_CPB_SIZE_CONTROL 0x08 +#define UVC_EU_PEAK_BIT_RATE_CONTROL 0x09 +#define UVC_EU_QUANTIZATION_PARAMS_CONTROL 0x0a +#define UVC_EU_SYNC_REF_FRAME_CONTROL 0x0b +#define UVC_EU_LTR_BUFFER_CONTROL 0x0c +#define UVC_EU_LTR_PICTURE_CONTROL 0x0d +#define UVC_EU_LTR_VALIDATION_CONTROL 0x0e +#define UVC_EU_LEVEL_IDC_LIMIT_CONTROL 0x0f +#define UVC_EU_SEI_PAYLOADTYPE_CONTROL 0x10 +#define UVC_EU_QP_RANGE_CONTROL 0x11 +#define UVC_EU_PRIORITY_CONTROL 0x12 +#define UVC_EU_START_OR_STOP_LAYER_CONTROL 0x13 +#define UVC_EU_ERROR_RESILIENCY_CONTROL 0x14 + /* A.9.7. VideoStreaming Interface Control Selectors */ #define UVC_VS_CONTROL_UNDEFINED 0x00 #define UVC_VS_PROBE_CONTROL 0x01