gstreamer/subprojects/gst-plugins-bad/sys/uvch264/uvc_h264.h

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_*/