mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
371 lines
10 KiB
C
371 lines
10 KiB
C
/*
|
|
* uvc_h264.h - Definitions of the UVC H.264 Payload specification Version 1.0
|
|
*
|
|
* Copyright (c) 2011 USB Implementers Forum, Inc.
|
|
*
|
|
* Modification into glib-like header by :
|
|
* Copyright (C) 2012 Cisco Systems, Inc.
|
|
* Author: Youness Alaoui <youness.alaoui@collabora.co.uk>
|
|
*
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef _UVC_H264_H_
|
|
#define _UVC_H264_H_
|
|
|
|
/* Header File for the little-endian platform */
|
|
|
|
#include <glib.h>
|
|
#include <glib-object.h>
|
|
|
|
#include <gst/video/video.h>
|
|
#include <linux/uvcvideo.h>
|
|
#include <linux/usb/video.h>
|
|
#include <sys/ioctl.h>
|
|
#include <string.h>
|
|
|
|
#include <gudev/gudev.h>
|
|
#include <libusb.h>
|
|
|
|
#include <gst/gst.h>
|
|
#include <libusb.h>
|
|
|
|
#define USB_VIDEO_CONTROL 1
|
|
#define USB_VIDEO_CONTROL_INTERFACE 0x24
|
|
#define USB_VIDEO_CONTROL_XU_TYPE 0x06
|
|
#ifndef LIBUSB_CLASS_VIDEO
|
|
#define LIBUSB_CLASS_VIDEO 0x0e
|
|
#endif
|
|
|
|
/* bmHints defines */
|
|
|
|
#define UVC_H264_BMHINTS_RESOLUTION (0x0001)
|
|
#define UVC_H264_BMHINTS_PROFILE (0x0002)
|
|
#define UVC_H264_BMHINTS_RATECONTROL (0x0004)
|
|
#define UVC_H264_BMHINTS_USAGE (0x0008)
|
|
#define UVC_H264_BMHINTS_SLICEMODE (0x0010)
|
|
#define UVC_H264_BMHINTS_SLICEUNITS (0x0020)
|
|
#define UVC_H264_BMHINTS_MVCVIEW (0x0040)
|
|
#define UVC_H264_BMHINTS_TEMPORAL (0x0080)
|
|
#define UVC_H264_BMHINTS_SNR (0x0100)
|
|
#define UVC_H264_BMHINTS_SPATIAL (0x0200)
|
|
#define UVC_H264_BMHINTS_SPATIAL_RATIO (0x0400)
|
|
#define UVC_H264_BMHINTS_FRAME_INTERVAL (0x0800)
|
|
#define UVC_H264_BMHINTS_LEAKY_BKT_SIZE (0x1000)
|
|
#define UVC_H264_BMHINTS_BITRATE (0x2000)
|
|
#define UVC_H264_BMHINTS_ENTROPY (0x4000)
|
|
#define UVC_H264_BMHINTS_IFRAMEPERIOD (0x8000)
|
|
|
|
|
|
#define UVC_H264_QP_STEPS_I_FRAME_TYPE (0x01)
|
|
#define UVC_H264_QP_STEPS_P_FRAME_TYPE (0x02)
|
|
#define UVC_H264_QP_STEPS_B_FRAME_TYPE (0x04)
|
|
#define UVC_H264_QP_STEPS_ALL_FRAME_TYPES (UVC_H264_QP_STEPS_I_FRAME_TYPE | \
|
|
UVC_H264_QP_STEPS_P_FRAME_TYPE | UVC_H264_QP_STEPS_B_FRAME_TYPE)
|
|
|
|
/* wSliceMode defines */
|
|
|
|
typedef enum
|
|
{
|
|
UVC_H264_SLICEMODE_IGNORED = 0x0000,
|
|
UVC_H264_SLICEMODE_BITSPERSLICE = 0x0001,
|
|
UVC_H264_SLICEMODE_MBSPERSLICE = 0x0002,
|
|
UVC_H264_SLICEMODE_SLICEPERFRAME = 0x0003
|
|
} UvcH264SliceMode;
|
|
|
|
#define UVC_H264_SLICEMODE_TYPE (uvc_h264_slicemode_get_type())
|
|
|
|
GType uvc_h264_slicemode_get_type (void);
|
|
|
|
/* bUsageType defines */
|
|
|
|
typedef enum {
|
|
UVC_H264_USAGETYPE_REALTIME = 0x01,
|
|
UVC_H264_USAGETYPE_BROADCAST = 0x02,
|
|
UVC_H264_USAGETYPE_STORAGE = 0x03,
|
|
UVC_H264_USAGETYPE_UCCONFIG_0 = 0x04,
|
|
UVC_H264_USAGETYPE_UCCONFIG_1 = 0x05,
|
|
UVC_H264_USAGETYPE_UCCONFIG_2Q = 0x06,
|
|
UVC_H264_USAGETYPE_UCCONFIG_2S = 0x07,
|
|
UVC_H264_USAGETYPE_UCCONFIG_3 = 0x08,
|
|
} UvcH264UsageType;
|
|
|
|
#define UVC_H264_USAGETYPE_TYPE (uvc_h264_usagetype_get_type())
|
|
|
|
GType uvc_h264_usagetype_get_type (void);
|
|
|
|
/* bRateControlMode defines */
|
|
|
|
typedef enum {
|
|
UVC_H264_RATECONTROL_CBR = 0x01,
|
|
UVC_H264_RATECONTROL_VBR = 0x02,
|
|
UVC_H264_RATECONTROL_CONST_QP = 0x03,
|
|
} UvcH264RateControl;
|
|
|
|
#define UVC_H264_RATECONTROL_FIXED_FRM_FLG (0x10)
|
|
|
|
#define UVC_H264_RATECONTROL_TYPE (uvc_h264_ratecontrol_get_type())
|
|
|
|
GType uvc_h264_ratecontrol_get_type (void);
|
|
|
|
/* bStreamFormat defines */
|
|
|
|
typedef enum {
|
|
UVC_H264_STREAMFORMAT_ANNEXB = 0x00,
|
|
UVC_H264_STREAMFORMAT_NAL = 0x01,
|
|
} UvcH264StreamFormat;
|
|
|
|
#define UVC_H264_STREAMFORMAT_TYPE (uvc_h264_streamformat_get_type())
|
|
|
|
GType uvc_h264_streamformat_get_type (void);
|
|
|
|
/* bEntropyCABAC defines */
|
|
|
|
typedef enum {
|
|
UVC_H264_ENTROPY_CAVLC = 0x00,
|
|
UVC_H264_ENTROPY_CABAC = 0x01,
|
|
} UvcH264Entropy;
|
|
|
|
#define UVC_H264_ENTROPY_TYPE (uvc_h264_entropy_get_type())
|
|
|
|
GType uvc_h264_entropy_get_type (void);
|
|
|
|
/* bProfile defines */
|
|
#define UVC_H264_PROFILE_CONSTRAINED_BASELINE 0x4240
|
|
#define UVC_H264_PROFILE_BASELINE 0x4200
|
|
#define UVC_H264_PROFILE_MAIN 0x4D00
|
|
#define UVC_H264_PROFILE_HIGH 0x6400
|
|
|
|
/* bTimingstamp defines */
|
|
|
|
#define UVC_H264_TIMESTAMP_SEI_DISABLE (0x00)
|
|
#define UVC_H264_TIMESTAMP_SEI_ENABLE (0x01)
|
|
|
|
/* bPreviewFlipped defines */
|
|
|
|
#define UVC_H264_PREFLIPPED_DISABLE (0x00)
|
|
#define UVC_H264_PREFLIPPED_HORIZONTAL (0x01)
|
|
|
|
/* wPicType defines */
|
|
#define UVC_H264_PICTYPE_I_FRAME (0x00)
|
|
#define UVC_H264_PICTYPE_IDR (0x01)
|
|
#define UVC_H264_PICTYPE_IDR_WITH_PPS_SPS (0x02)
|
|
|
|
|
|
/* wLayerID Macro */
|
|
|
|
/* wLayerID
|
|
|------------+------------+------------+----------------+------------|
|
|
| Reserved | StreamID | QualityID | DependencyID | TemporalID |
|
|
| (3 bits) | (3 bits) | (3 bits) | (4 bits) | (3 bits) |
|
|
|------------+------------+------------+----------------+------------|
|
|
|15 13|12 10|9 7|6 3|2 0|
|
|
|------------+------------+------------+----------------+------------|
|
|
*/
|
|
|
|
#define xLayerID(stream_id, quality_id, dependency_id, temporal_id) \
|
|
((((stream_id) & 7) << 10) | \
|
|
(((quality_id) & 7) << 7) | \
|
|
(((dependency_id) & 15) << 3) | \
|
|
((temporal_id) & 7))
|
|
|
|
/* id extraction from wLayerID */
|
|
|
|
#define xStream_id(layer_id) (((layer_id) >> 10) & 7)
|
|
#define xQuality_id(layer_id) (((layer_id) >> 7) & 7)
|
|
#define xDependency_id(layer_id) (((layer_id) >> 3) & 15)
|
|
#define xTemporal_id(layer_id) ((layer_id)&7)
|
|
|
|
/* UVC H.264 control selectors */
|
|
|
|
typedef enum _uvcx_control_selector_t
|
|
{
|
|
UVCX_VIDEO_CONFIG_PROBE = 0x01,
|
|
UVCX_VIDEO_CONFIG_COMMIT = 0x02,
|
|
UVCX_RATE_CONTROL_MODE = 0x03,
|
|
UVCX_TEMPORAL_SCALE_MODE = 0x04,
|
|
UVCX_SPATIAL_SCALE_MODE = 0x05,
|
|
UVCX_SNR_SCALE_MODE = 0x06,
|
|
UVCX_LTR_BUFFER_SIZE_CONTROL = 0x07,
|
|
UVCX_LTR_PICTURE_CONTROL = 0x08,
|
|
UVCX_PICTURE_TYPE_CONTROL = 0x09,
|
|
UVCX_VERSION = 0x0A,
|
|
UVCX_ENCODER_RESET = 0x0B,
|
|
UVCX_FRAMERATE_CONFIG = 0x0C,
|
|
UVCX_VIDEO_ADVANCE_CONFIG = 0x0D,
|
|
UVCX_BITRATE_LAYERS = 0x0E,
|
|
UVCX_QP_STEPS_LAYERS = 0x0F,
|
|
} uvcx_control_selector_t;
|
|
|
|
|
|
typedef struct _uvcx_video_config_probe_commit_t
|
|
{
|
|
guint32 dwFrameInterval;
|
|
guint32 dwBitRate;
|
|
guint16 bmHints;
|
|
guint16 wConfigurationIndex;
|
|
guint16 wWidth;
|
|
guint16 wHeight;
|
|
guint16 wSliceUnits;
|
|
guint16 wSliceMode;
|
|
guint16 wProfile;
|
|
guint16 wIFramePeriod;
|
|
guint16 wEstimatedVideoDelay;
|
|
guint16 wEstimatedMaxConfigDelay;
|
|
guint8 bUsageType;
|
|
guint8 bRateControlMode;
|
|
guint8 bTemporalScaleMode;
|
|
guint8 bSpatialScaleMode;
|
|
guint8 bSNRScaleMode;
|
|
guint8 bStreamMuxOption;
|
|
guint8 bStreamFormat;
|
|
guint8 bEntropyCABAC;
|
|
guint8 bTimestamp;
|
|
guint8 bNumOfReorderFrames;
|
|
guint8 bPreviewFlipped;
|
|
guint8 bView;
|
|
guint8 bReserved1;
|
|
guint8 bReserved2;
|
|
guint8 bStreamID;
|
|
guint8 bSpatialLayerRatio;
|
|
guint16 wLeakyBucketSize;
|
|
} __attribute__((packed)) uvcx_video_config_probe_commit_t;
|
|
|
|
|
|
typedef struct _uvcx_rate_control_mode_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bRateControlMode;
|
|
} __attribute__((packed)) uvcx_rate_control_mode_t;
|
|
|
|
|
|
typedef struct _uvcx_temporal_scale_mode_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bTemporalScaleMode;
|
|
} __attribute__((packed)) uvcx_temporal_scale_mode_t;
|
|
|
|
|
|
typedef struct _uvcx_spatial_scale_mode_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bSpatialScaleMode;
|
|
} __attribute__((packed)) uvcx_spatial_scale_mode_t;
|
|
|
|
|
|
typedef struct _uvcx_snr_scale_mode_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bSNRScaleMode;
|
|
guint8 bMGSSublayerMode;
|
|
} __attribute__((packed)) uvcx_snr_scale_mode_t;
|
|
|
|
|
|
typedef struct _uvcx_ltr_buffer_size_control_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bLTRBufferSize;
|
|
guint8 bLTREncoderControl;
|
|
} __attribute__((packed)) uvcx_ltr_buffer_size_control_t;
|
|
|
|
typedef struct _uvcx_ltr_picture_control
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bPutAtPositionInLTRBuffer;
|
|
guint8 bEncodeUsingLTR;
|
|
} __attribute__((packed)) uvcx_ltr_picture_control;
|
|
|
|
|
|
typedef struct _uvcx_picture_type_control_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint16 wPicType;
|
|
} __attribute__((packed)) uvcx_picture_type_control_t;
|
|
|
|
|
|
typedef struct _uvcx_version_t
|
|
{
|
|
guint16 wVersion;
|
|
} __attribute__((packed)) uvcx_version_t;
|
|
|
|
|
|
typedef struct _uvcx_encoder_reset
|
|
{
|
|
guint16 wLayerID;
|
|
} __attribute__((packed)) uvcx_encoder_reset;
|
|
|
|
|
|
typedef struct _uvcx_framerate_config_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint32 dwFrameInterval;
|
|
} __attribute__((packed)) uvcx_framerate_config_t;
|
|
|
|
|
|
typedef struct _uvcx_video_advance_config_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint32 dwMb_max;
|
|
guint8 blevel_idc;
|
|
guint8 bReserved;
|
|
} __attribute__((packed)) uvcx_video_advance_config_t;
|
|
|
|
|
|
typedef struct _uvcx_bitrate_layers_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint32 dwPeakBitrate;
|
|
guint32 dwAverageBitrate;
|
|
} __attribute__((packed)) uvcx_bitrate_layers_t;
|
|
|
|
|
|
typedef struct _uvcx_qp_steps_layers_t
|
|
{
|
|
guint16 wLayerID;
|
|
guint8 bFrameType;
|
|
guint8 bMinQp;
|
|
guint8 bMaxQp;
|
|
} __attribute__((packed)) uvcx_qp_steps_layers_t;
|
|
|
|
typedef struct
|
|
{
|
|
int8_t bLength;
|
|
int8_t bDescriptorType;
|
|
int8_t bDescriptorSubType;
|
|
int8_t bUnitID;
|
|
uint8_t guidExtensionCode[16];
|
|
} __attribute__ ((__packed__)) xu_descriptor;
|
|
|
|
#define GUID_FORMAT "02X%02X%02X%02X-%02X%02X%02X%02X-"\
|
|
"%02X%02X%02X%02X-%02X%02X%02X%02X"
|
|
#define GUID_ARGS(guid) guid[0], guid[1], guid[2], guid[3], \
|
|
guid[4], guid[5], guid[6], guid[7], \
|
|
guid[8], guid[9], guid[10], guid[11], \
|
|
guid[12], guid[13], guid[14], guid[15]
|
|
|
|
guint8 xu_get_id (GstObject *self, const gchar *devname, libusb_context **usb_ctx);
|
|
|
|
#ifdef _WIN32
|
|
// GUID of the UVC H.264 extension unit: {A29E7641-DE04-47E3-8B2B-F4341AFF003B}
|
|
DEFINE_GUID(GUID_UVCX_H264_XU, 0xA29E7641, 0xDE04, 0x47E3, 0x8B, 0x2B, 0xF4, 0x34, 0x1A, 0xFF, 0x00, 0x3B);
|
|
#else
|
|
#define GUID_UVCX_H264_XU \
|
|
{0x41, 0x76, 0x9e, 0xa2, 0x04, 0xde, 0xe3, 0x47, 0x8b, 0x2b, 0xF4, 0x34, 0x1A, 0xFF, 0x00, 0x3B}
|
|
#endif
|
|
|
|
#endif /*_UVC_H264_H_*/
|