// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/videointelligence/v1p3beta1/video_intelligence.proto

package videointelligence

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	longrunning "google.golang.org/genproto/googleapis/longrunning"
	status "google.golang.org/genproto/googleapis/rpc/status"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status1 "google.golang.org/grpc/status"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Video annotation feature.
type Feature int32

const (
	// Unspecified.
	Feature_FEATURE_UNSPECIFIED Feature = 0
	// Label detection. Detect objects, such as dog or flower.
	Feature_LABEL_DETECTION Feature = 1
	// Shot change detection.
	Feature_SHOT_CHANGE_DETECTION Feature = 2
	// Explicit content detection.
	Feature_EXPLICIT_CONTENT_DETECTION Feature = 3
	// Human face detection.
	Feature_FACE_DETECTION Feature = 4
	// Speech transcription.
	Feature_SPEECH_TRANSCRIPTION Feature = 6
	// OCR text detection and tracking.
	Feature_TEXT_DETECTION Feature = 7
	// Object detection and tracking.
	Feature_OBJECT_TRACKING Feature = 9
	// Logo detection, tracking, and recognition.
	Feature_LOGO_RECOGNITION Feature = 12
	// Celebrity recognition.
	Feature_CELEBRITY_RECOGNITION Feature = 13
	// Person detection.
	Feature_PERSON_DETECTION Feature = 14
)

var Feature_name = map[int32]string{
	0:  "FEATURE_UNSPECIFIED",
	1:  "LABEL_DETECTION",
	2:  "SHOT_CHANGE_DETECTION",
	3:  "EXPLICIT_CONTENT_DETECTION",
	4:  "FACE_DETECTION",
	6:  "SPEECH_TRANSCRIPTION",
	7:  "TEXT_DETECTION",
	9:  "OBJECT_TRACKING",
	12: "LOGO_RECOGNITION",
	13: "CELEBRITY_RECOGNITION",
	14: "PERSON_DETECTION",
}

var Feature_value = map[string]int32{
	"FEATURE_UNSPECIFIED":        0,
	"LABEL_DETECTION":            1,
	"SHOT_CHANGE_DETECTION":      2,
	"EXPLICIT_CONTENT_DETECTION": 3,
	"FACE_DETECTION":             4,
	"SPEECH_TRANSCRIPTION":       6,
	"TEXT_DETECTION":             7,
	"OBJECT_TRACKING":            9,
	"LOGO_RECOGNITION":           12,
	"CELEBRITY_RECOGNITION":      13,
	"PERSON_DETECTION":           14,
}

func (x Feature) String() string {
	return proto.EnumName(Feature_name, int32(x))
}

func (Feature) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{0}
}

// Label detection mode.
type LabelDetectionMode int32

const (
	// Unspecified.
	LabelDetectionMode_LABEL_DETECTION_MODE_UNSPECIFIED LabelDetectionMode = 0
	// Detect shot-level labels.
	LabelDetectionMode_SHOT_MODE LabelDetectionMode = 1
	// Detect frame-level labels.
	LabelDetectionMode_FRAME_MODE LabelDetectionMode = 2
	// Detect both shot-level and frame-level labels.
	LabelDetectionMode_SHOT_AND_FRAME_MODE LabelDetectionMode = 3
)

var LabelDetectionMode_name = map[int32]string{
	0: "LABEL_DETECTION_MODE_UNSPECIFIED",
	1: "SHOT_MODE",
	2: "FRAME_MODE",
	3: "SHOT_AND_FRAME_MODE",
}

var LabelDetectionMode_value = map[string]int32{
	"LABEL_DETECTION_MODE_UNSPECIFIED": 0,
	"SHOT_MODE":                        1,
	"FRAME_MODE":                       2,
	"SHOT_AND_FRAME_MODE":              3,
}

func (x LabelDetectionMode) String() string {
	return proto.EnumName(LabelDetectionMode_name, int32(x))
}

func (LabelDetectionMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{1}
}

// Bucketized representation of likelihood.
type Likelihood int32

const (
	// Unspecified likelihood.
	Likelihood_LIKELIHOOD_UNSPECIFIED Likelihood = 0
	// Very unlikely.
	Likelihood_VERY_UNLIKELY Likelihood = 1
	// Unlikely.
	Likelihood_UNLIKELY Likelihood = 2
	// Possible.
	Likelihood_POSSIBLE Likelihood = 3
	// Likely.
	Likelihood_LIKELY Likelihood = 4
	// Very likely.
	Likelihood_VERY_LIKELY Likelihood = 5
)

var Likelihood_name = map[int32]string{
	0: "LIKELIHOOD_UNSPECIFIED",
	1: "VERY_UNLIKELY",
	2: "UNLIKELY",
	3: "POSSIBLE",
	4: "LIKELY",
	5: "VERY_LIKELY",
}

var Likelihood_value = map[string]int32{
	"LIKELIHOOD_UNSPECIFIED": 0,
	"VERY_UNLIKELY":          1,
	"UNLIKELY":               2,
	"POSSIBLE":               3,
	"LIKELY":                 4,
	"VERY_LIKELY":            5,
}

func (x Likelihood) String() string {
	return proto.EnumName(Likelihood_name, int32(x))
}

func (Likelihood) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{2}
}

// Streaming video annotation feature.
type StreamingFeature int32

const (
	// Unspecified.
	StreamingFeature_STREAMING_FEATURE_UNSPECIFIED StreamingFeature = 0
	// Label detection. Detect objects, such as dog or flower.
	StreamingFeature_STREAMING_LABEL_DETECTION StreamingFeature = 1
	// Shot change detection.
	StreamingFeature_STREAMING_SHOT_CHANGE_DETECTION StreamingFeature = 2
	// Explicit content detection.
	StreamingFeature_STREAMING_EXPLICIT_CONTENT_DETECTION StreamingFeature = 3
	// Object detection and tracking.
	StreamingFeature_STREAMING_OBJECT_TRACKING StreamingFeature = 4
	// Video classification based on AutoML model.
	StreamingFeature_STREAMING_AUTOML_CLASSIFICATION StreamingFeature = 21
	// Object detection and tracking based on AutoML model.
	StreamingFeature_STREAMING_AUTOML_OBJECT_TRACKING StreamingFeature = 22
)

var StreamingFeature_name = map[int32]string{
	0:  "STREAMING_FEATURE_UNSPECIFIED",
	1:  "STREAMING_LABEL_DETECTION",
	2:  "STREAMING_SHOT_CHANGE_DETECTION",
	3:  "STREAMING_EXPLICIT_CONTENT_DETECTION",
	4:  "STREAMING_OBJECT_TRACKING",
	21: "STREAMING_AUTOML_CLASSIFICATION",
	22: "STREAMING_AUTOML_OBJECT_TRACKING",
}

var StreamingFeature_value = map[string]int32{
	"STREAMING_FEATURE_UNSPECIFIED":        0,
	"STREAMING_LABEL_DETECTION":            1,
	"STREAMING_SHOT_CHANGE_DETECTION":      2,
	"STREAMING_EXPLICIT_CONTENT_DETECTION": 3,
	"STREAMING_OBJECT_TRACKING":            4,
	"STREAMING_AUTOML_CLASSIFICATION":      21,
	"STREAMING_AUTOML_OBJECT_TRACKING":     22,
}

func (x StreamingFeature) String() string {
	return proto.EnumName(StreamingFeature_name, int32(x))
}

func (StreamingFeature) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{3}
}

// Video annotation request.
type AnnotateVideoRequest struct {
	// Input video location. Currently, only
	// [Google Cloud Storage](https://cloud.google.com/storage/) URIs are
	// supported, which must be specified in the following format:
	// `gs://bucket-id/object-id` (other URI formats return
	// [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]). For
	// more information, see [Request URIs](/storage/docs/reference-uris). A video
	// URI may include wildcards in `object-id`, and thus identify multiple
	// videos. Supported wildcards: '*' to match 0 or more characters;
	// '?' to match 1 character. If unset, the input video should be embedded
	// in the request as `input_content`. If set, `input_content` should be unset.
	InputUri string `protobuf:"bytes,1,opt,name=input_uri,json=inputUri,proto3" json:"input_uri,omitempty"`
	// The video data bytes.
	// If unset, the input video(s) should be specified via `input_uri`.
	// If set, `input_uri` should be unset.
	InputContent []byte `protobuf:"bytes,6,opt,name=input_content,json=inputContent,proto3" json:"input_content,omitempty"`
	// Required. Requested video annotation features.
	Features []Feature `protobuf:"varint,2,rep,packed,name=features,proto3,enum=google.cloud.videointelligence.v1p3beta1.Feature" json:"features,omitempty"`
	// Additional video context and/or feature-specific parameters.
	VideoContext *VideoContext `protobuf:"bytes,3,opt,name=video_context,json=videoContext,proto3" json:"video_context,omitempty"`
	// Optional. Location where the output (in JSON format) should be stored.
	// Currently, only [Google Cloud Storage](https://cloud.google.com/storage/)
	// URIs are supported, which must be specified in the following format:
	// `gs://bucket-id/object-id` (other URI formats return
	// [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]). For
	// more information, see [Request URIs](/storage/docs/reference-uris).
	OutputUri string `protobuf:"bytes,4,opt,name=output_uri,json=outputUri,proto3" json:"output_uri,omitempty"`
	// Optional. Cloud region where annotation should take place. Supported cloud
	// regions: `us-east1`, `us-west1`, `europe-west1`, `asia-east1`. If no region
	// is specified, a region will be determined based on video file location.
	LocationId           string   `protobuf:"bytes,5,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnnotateVideoRequest) Reset()         { *m = AnnotateVideoRequest{} }
func (m *AnnotateVideoRequest) String() string { return proto.CompactTextString(m) }
func (*AnnotateVideoRequest) ProtoMessage()    {}
func (*AnnotateVideoRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{0}
}

func (m *AnnotateVideoRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AnnotateVideoRequest.Unmarshal(m, b)
}
func (m *AnnotateVideoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AnnotateVideoRequest.Marshal(b, m, deterministic)
}
func (m *AnnotateVideoRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AnnotateVideoRequest.Merge(m, src)
}
func (m *AnnotateVideoRequest) XXX_Size() int {
	return xxx_messageInfo_AnnotateVideoRequest.Size(m)
}
func (m *AnnotateVideoRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_AnnotateVideoRequest.DiscardUnknown(m)
}

var xxx_messageInfo_AnnotateVideoRequest proto.InternalMessageInfo

func (m *AnnotateVideoRequest) GetInputUri() string {
	if m != nil {
		return m.InputUri
	}
	return ""
}

func (m *AnnotateVideoRequest) GetInputContent() []byte {
	if m != nil {
		return m.InputContent
	}
	return nil
}

func (m *AnnotateVideoRequest) GetFeatures() []Feature {
	if m != nil {
		return m.Features
	}
	return nil
}

func (m *AnnotateVideoRequest) GetVideoContext() *VideoContext {
	if m != nil {
		return m.VideoContext
	}
	return nil
}

func (m *AnnotateVideoRequest) GetOutputUri() string {
	if m != nil {
		return m.OutputUri
	}
	return ""
}

func (m *AnnotateVideoRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Video context and/or feature-specific parameters.
type VideoContext struct {
	// Video segments to annotate. The segments may overlap and are not required
	// to be contiguous or span the whole video. If unspecified, each video is
	// treated as a single segment.
	Segments []*VideoSegment `protobuf:"bytes,1,rep,name=segments,proto3" json:"segments,omitempty"`
	// Config for LABEL_DETECTION.
	LabelDetectionConfig *LabelDetectionConfig `protobuf:"bytes,2,opt,name=label_detection_config,json=labelDetectionConfig,proto3" json:"label_detection_config,omitempty"`
	// Config for SHOT_CHANGE_DETECTION.
	ShotChangeDetectionConfig *ShotChangeDetectionConfig `protobuf:"bytes,3,opt,name=shot_change_detection_config,json=shotChangeDetectionConfig,proto3" json:"shot_change_detection_config,omitempty"`
	// Config for EXPLICIT_CONTENT_DETECTION.
	ExplicitContentDetectionConfig *ExplicitContentDetectionConfig `protobuf:"bytes,4,opt,name=explicit_content_detection_config,json=explicitContentDetectionConfig,proto3" json:"explicit_content_detection_config,omitempty"`
	// Config for FACE_DETECTION.
	FaceDetectionConfig *FaceDetectionConfig `protobuf:"bytes,5,opt,name=face_detection_config,json=faceDetectionConfig,proto3" json:"face_detection_config,omitempty"`
	// Config for SPEECH_TRANSCRIPTION.
	SpeechTranscriptionConfig *SpeechTranscriptionConfig `protobuf:"bytes,6,opt,name=speech_transcription_config,json=speechTranscriptionConfig,proto3" json:"speech_transcription_config,omitempty"`
	// Config for TEXT_DETECTION.
	TextDetectionConfig *TextDetectionConfig `protobuf:"bytes,8,opt,name=text_detection_config,json=textDetectionConfig,proto3" json:"text_detection_config,omitempty"`
	// Config for PERSON_DETECTION.
	PersonDetectionConfig *PersonDetectionConfig `protobuf:"bytes,11,opt,name=person_detection_config,json=personDetectionConfig,proto3" json:"person_detection_config,omitempty"`
	// Config for OBJECT_TRACKING.
	ObjectTrackingConfig *ObjectTrackingConfig `protobuf:"bytes,13,opt,name=object_tracking_config,json=objectTrackingConfig,proto3" json:"object_tracking_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *VideoContext) Reset()         { *m = VideoContext{} }
func (m *VideoContext) String() string { return proto.CompactTextString(m) }
func (*VideoContext) ProtoMessage()    {}
func (*VideoContext) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{1}
}

func (m *VideoContext) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VideoContext.Unmarshal(m, b)
}
func (m *VideoContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VideoContext.Marshal(b, m, deterministic)
}
func (m *VideoContext) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VideoContext.Merge(m, src)
}
func (m *VideoContext) XXX_Size() int {
	return xxx_messageInfo_VideoContext.Size(m)
}
func (m *VideoContext) XXX_DiscardUnknown() {
	xxx_messageInfo_VideoContext.DiscardUnknown(m)
}

var xxx_messageInfo_VideoContext proto.InternalMessageInfo

func (m *VideoContext) GetSegments() []*VideoSegment {
	if m != nil {
		return m.Segments
	}
	return nil
}

func (m *VideoContext) GetLabelDetectionConfig() *LabelDetectionConfig {
	if m != nil {
		return m.LabelDetectionConfig
	}
	return nil
}

func (m *VideoContext) GetShotChangeDetectionConfig() *ShotChangeDetectionConfig {
	if m != nil {
		return m.ShotChangeDetectionConfig
	}
	return nil
}

func (m *VideoContext) GetExplicitContentDetectionConfig() *ExplicitContentDetectionConfig {
	if m != nil {
		return m.ExplicitContentDetectionConfig
	}
	return nil
}

func (m *VideoContext) GetFaceDetectionConfig() *FaceDetectionConfig {
	if m != nil {
		return m.FaceDetectionConfig
	}
	return nil
}

func (m *VideoContext) GetSpeechTranscriptionConfig() *SpeechTranscriptionConfig {
	if m != nil {
		return m.SpeechTranscriptionConfig
	}
	return nil
}

func (m *VideoContext) GetTextDetectionConfig() *TextDetectionConfig {
	if m != nil {
		return m.TextDetectionConfig
	}
	return nil
}

func (m *VideoContext) GetPersonDetectionConfig() *PersonDetectionConfig {
	if m != nil {
		return m.PersonDetectionConfig
	}
	return nil
}

func (m *VideoContext) GetObjectTrackingConfig() *ObjectTrackingConfig {
	if m != nil {
		return m.ObjectTrackingConfig
	}
	return nil
}

// Config for LABEL_DETECTION.
type LabelDetectionConfig struct {
	// What labels should be detected with LABEL_DETECTION, in addition to
	// video-level labels or segment-level labels.
	// If unspecified, defaults to `SHOT_MODE`.
	LabelDetectionMode LabelDetectionMode `protobuf:"varint,1,opt,name=label_detection_mode,json=labelDetectionMode,proto3,enum=google.cloud.videointelligence.v1p3beta1.LabelDetectionMode" json:"label_detection_mode,omitempty"`
	// Whether the video has been shot from a stationary (i.e. non-moving) camera.
	// When set to true, might improve detection accuracy for moving objects.
	// Should be used with `SHOT_AND_FRAME_MODE` enabled.
	StationaryCamera bool `protobuf:"varint,2,opt,name=stationary_camera,json=stationaryCamera,proto3" json:"stationary_camera,omitempty"`
	// Model to use for label detection.
	// Supported values: "builtin/stable" (the default if unset) and
	// "builtin/latest".
	Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"`
	// The confidence threshold we perform filtering on the labels from
	// frame-level detection. If not set, it is set to 0.4 by default. The valid
	// range for this threshold is [0.1, 0.9]. Any value set outside of this
	// range will be clipped.
	// Note: for best results please follow the default threshold. We will update
	// the default threshold everytime when we release a new model.
	FrameConfidenceThreshold float32 `protobuf:"fixed32,4,opt,name=frame_confidence_threshold,json=frameConfidenceThreshold,proto3" json:"frame_confidence_threshold,omitempty"`
	// The confidence threshold we perform filtering on the labels from
	// video-level and shot-level detections. If not set, it is set to 0.3 by
	// default. The valid range for this threshold is [0.1, 0.9]. Any value set
	// outside of this range will be clipped.
	// Note: for best results please follow the default threshold. We will update
	// the default threshold everytime when we release a new model.
	VideoConfidenceThreshold float32  `protobuf:"fixed32,5,opt,name=video_confidence_threshold,json=videoConfidenceThreshold,proto3" json:"video_confidence_threshold,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

func (m *LabelDetectionConfig) Reset()         { *m = LabelDetectionConfig{} }
func (m *LabelDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*LabelDetectionConfig) ProtoMessage()    {}
func (*LabelDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{2}
}

func (m *LabelDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LabelDetectionConfig.Unmarshal(m, b)
}
func (m *LabelDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LabelDetectionConfig.Marshal(b, m, deterministic)
}
func (m *LabelDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LabelDetectionConfig.Merge(m, src)
}
func (m *LabelDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_LabelDetectionConfig.Size(m)
}
func (m *LabelDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_LabelDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_LabelDetectionConfig proto.InternalMessageInfo

func (m *LabelDetectionConfig) GetLabelDetectionMode() LabelDetectionMode {
	if m != nil {
		return m.LabelDetectionMode
	}
	return LabelDetectionMode_LABEL_DETECTION_MODE_UNSPECIFIED
}

func (m *LabelDetectionConfig) GetStationaryCamera() bool {
	if m != nil {
		return m.StationaryCamera
	}
	return false
}

func (m *LabelDetectionConfig) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

func (m *LabelDetectionConfig) GetFrameConfidenceThreshold() float32 {
	if m != nil {
		return m.FrameConfidenceThreshold
	}
	return 0
}

func (m *LabelDetectionConfig) GetVideoConfidenceThreshold() float32 {
	if m != nil {
		return m.VideoConfidenceThreshold
	}
	return 0
}

// Config for SHOT_CHANGE_DETECTION.
type ShotChangeDetectionConfig struct {
	// Model to use for shot change detection.
	// Supported values: "builtin/stable" (the default if unset) and
	// "builtin/latest".
	Model                string   `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ShotChangeDetectionConfig) Reset()         { *m = ShotChangeDetectionConfig{} }
func (m *ShotChangeDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*ShotChangeDetectionConfig) ProtoMessage()    {}
func (*ShotChangeDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{3}
}

func (m *ShotChangeDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ShotChangeDetectionConfig.Unmarshal(m, b)
}
func (m *ShotChangeDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ShotChangeDetectionConfig.Marshal(b, m, deterministic)
}
func (m *ShotChangeDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ShotChangeDetectionConfig.Merge(m, src)
}
func (m *ShotChangeDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_ShotChangeDetectionConfig.Size(m)
}
func (m *ShotChangeDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_ShotChangeDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_ShotChangeDetectionConfig proto.InternalMessageInfo

func (m *ShotChangeDetectionConfig) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// Config for OBJECT_TRACKING.
type ObjectTrackingConfig struct {
	// Model to use for object tracking.
	// Supported values: "builtin/stable" (the default if unset) and
	// "builtin/latest".
	Model                string   `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ObjectTrackingConfig) Reset()         { *m = ObjectTrackingConfig{} }
func (m *ObjectTrackingConfig) String() string { return proto.CompactTextString(m) }
func (*ObjectTrackingConfig) ProtoMessage()    {}
func (*ObjectTrackingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{4}
}

func (m *ObjectTrackingConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ObjectTrackingConfig.Unmarshal(m, b)
}
func (m *ObjectTrackingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ObjectTrackingConfig.Marshal(b, m, deterministic)
}
func (m *ObjectTrackingConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ObjectTrackingConfig.Merge(m, src)
}
func (m *ObjectTrackingConfig) XXX_Size() int {
	return xxx_messageInfo_ObjectTrackingConfig.Size(m)
}
func (m *ObjectTrackingConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_ObjectTrackingConfig.DiscardUnknown(m)
}

var xxx_messageInfo_ObjectTrackingConfig proto.InternalMessageInfo

func (m *ObjectTrackingConfig) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// Config for EXPLICIT_CONTENT_DETECTION.
type ExplicitContentDetectionConfig struct {
	// Model to use for explicit content detection.
	// Supported values: "builtin/stable" (the default if unset) and
	// "builtin/latest".
	Model                string   `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ExplicitContentDetectionConfig) Reset()         { *m = ExplicitContentDetectionConfig{} }
func (m *ExplicitContentDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*ExplicitContentDetectionConfig) ProtoMessage()    {}
func (*ExplicitContentDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{5}
}

func (m *ExplicitContentDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExplicitContentDetectionConfig.Unmarshal(m, b)
}
func (m *ExplicitContentDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExplicitContentDetectionConfig.Marshal(b, m, deterministic)
}
func (m *ExplicitContentDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExplicitContentDetectionConfig.Merge(m, src)
}
func (m *ExplicitContentDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_ExplicitContentDetectionConfig.Size(m)
}
func (m *ExplicitContentDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_ExplicitContentDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_ExplicitContentDetectionConfig proto.InternalMessageInfo

func (m *ExplicitContentDetectionConfig) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// Config for FACE_DETECTION.
type FaceDetectionConfig struct {
	// Model to use for face detection.
	// Supported values: "builtin/stable" (the default if unset) and
	// "builtin/latest".
	Model string `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	// Whether bounding boxes be included in the face annotation output.
	IncludeBoundingBoxes bool `protobuf:"varint,2,opt,name=include_bounding_boxes,json=includeBoundingBoxes,proto3" json:"include_bounding_boxes,omitempty"`
	// Whether to enable face attributes detection, such as glasses, dark_glasses,
	// mouth_open etc. Ignored if 'include_bounding_boxes' is false.
	IncludeAttributes    bool     `protobuf:"varint,5,opt,name=include_attributes,json=includeAttributes,proto3" json:"include_attributes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FaceDetectionConfig) Reset()         { *m = FaceDetectionConfig{} }
func (m *FaceDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*FaceDetectionConfig) ProtoMessage()    {}
func (*FaceDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{6}
}

func (m *FaceDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FaceDetectionConfig.Unmarshal(m, b)
}
func (m *FaceDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FaceDetectionConfig.Marshal(b, m, deterministic)
}
func (m *FaceDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FaceDetectionConfig.Merge(m, src)
}
func (m *FaceDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_FaceDetectionConfig.Size(m)
}
func (m *FaceDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_FaceDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_FaceDetectionConfig proto.InternalMessageInfo

func (m *FaceDetectionConfig) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

func (m *FaceDetectionConfig) GetIncludeBoundingBoxes() bool {
	if m != nil {
		return m.IncludeBoundingBoxes
	}
	return false
}

func (m *FaceDetectionConfig) GetIncludeAttributes() bool {
	if m != nil {
		return m.IncludeAttributes
	}
	return false
}

// Config for PERSON_DETECTION.
type PersonDetectionConfig struct {
	// Whether bounding boxes be included in the person detection annotation
	// output.
	IncludeBoundingBoxes bool `protobuf:"varint,1,opt,name=include_bounding_boxes,json=includeBoundingBoxes,proto3" json:"include_bounding_boxes,omitempty"`
	// Whether to enable pose landmarks detection. Ignored if
	// 'include_bounding_boxes' is false.
	IncludePoseLandmarks bool `protobuf:"varint,2,opt,name=include_pose_landmarks,json=includePoseLandmarks,proto3" json:"include_pose_landmarks,omitempty"`
	// Whether to enable person attributes detection, such as cloth color (black,
	// blue, etc), type (coat, dress, etc), pattern (plain, floral, etc), hair
	// color (black, blonde, etc), hair length (long, short, bald), etc.
	// Ignored if 'include_bounding_boxes' is false.
	IncludeAttributes    bool     `protobuf:"varint,3,opt,name=include_attributes,json=includeAttributes,proto3" json:"include_attributes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PersonDetectionConfig) Reset()         { *m = PersonDetectionConfig{} }
func (m *PersonDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*PersonDetectionConfig) ProtoMessage()    {}
func (*PersonDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{7}
}

func (m *PersonDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PersonDetectionConfig.Unmarshal(m, b)
}
func (m *PersonDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PersonDetectionConfig.Marshal(b, m, deterministic)
}
func (m *PersonDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PersonDetectionConfig.Merge(m, src)
}
func (m *PersonDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_PersonDetectionConfig.Size(m)
}
func (m *PersonDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_PersonDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_PersonDetectionConfig proto.InternalMessageInfo

func (m *PersonDetectionConfig) GetIncludeBoundingBoxes() bool {
	if m != nil {
		return m.IncludeBoundingBoxes
	}
	return false
}

func (m *PersonDetectionConfig) GetIncludePoseLandmarks() bool {
	if m != nil {
		return m.IncludePoseLandmarks
	}
	return false
}

func (m *PersonDetectionConfig) GetIncludeAttributes() bool {
	if m != nil {
		return m.IncludeAttributes
	}
	return false
}

// Config for TEXT_DETECTION.
type TextDetectionConfig struct {
	// Language hint can be specified if the language to be detected is known a
	// priori. It can increase the accuracy of the detection. Language hint must
	// be language code in BCP-47 format.
	//
	// Automatic language detection is performed if no hint is provided.
	LanguageHints []string `protobuf:"bytes,1,rep,name=language_hints,json=languageHints,proto3" json:"language_hints,omitempty"`
	// Model to use for text detection.
	// Supported values: "builtin/stable" (the default if unset) and
	// "builtin/latest".
	Model                string   `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TextDetectionConfig) Reset()         { *m = TextDetectionConfig{} }
func (m *TextDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*TextDetectionConfig) ProtoMessage()    {}
func (*TextDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{8}
}

func (m *TextDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TextDetectionConfig.Unmarshal(m, b)
}
func (m *TextDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TextDetectionConfig.Marshal(b, m, deterministic)
}
func (m *TextDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TextDetectionConfig.Merge(m, src)
}
func (m *TextDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_TextDetectionConfig.Size(m)
}
func (m *TextDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_TextDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_TextDetectionConfig proto.InternalMessageInfo

func (m *TextDetectionConfig) GetLanguageHints() []string {
	if m != nil {
		return m.LanguageHints
	}
	return nil
}

func (m *TextDetectionConfig) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// Video segment.
type VideoSegment struct {
	// Time-offset, relative to the beginning of the video,
	// corresponding to the start of the segment (inclusive).
	StartTimeOffset *duration.Duration `protobuf:"bytes,1,opt,name=start_time_offset,json=startTimeOffset,proto3" json:"start_time_offset,omitempty"`
	// Time-offset, relative to the beginning of the video,
	// corresponding to the end of the segment (inclusive).
	EndTimeOffset        *duration.Duration `protobuf:"bytes,2,opt,name=end_time_offset,json=endTimeOffset,proto3" json:"end_time_offset,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *VideoSegment) Reset()         { *m = VideoSegment{} }
func (m *VideoSegment) String() string { return proto.CompactTextString(m) }
func (*VideoSegment) ProtoMessage()    {}
func (*VideoSegment) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{9}
}

func (m *VideoSegment) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VideoSegment.Unmarshal(m, b)
}
func (m *VideoSegment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VideoSegment.Marshal(b, m, deterministic)
}
func (m *VideoSegment) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VideoSegment.Merge(m, src)
}
func (m *VideoSegment) XXX_Size() int {
	return xxx_messageInfo_VideoSegment.Size(m)
}
func (m *VideoSegment) XXX_DiscardUnknown() {
	xxx_messageInfo_VideoSegment.DiscardUnknown(m)
}

var xxx_messageInfo_VideoSegment proto.InternalMessageInfo

func (m *VideoSegment) GetStartTimeOffset() *duration.Duration {
	if m != nil {
		return m.StartTimeOffset
	}
	return nil
}

func (m *VideoSegment) GetEndTimeOffset() *duration.Duration {
	if m != nil {
		return m.EndTimeOffset
	}
	return nil
}

// Video segment level annotation results for label detection.
type LabelSegment struct {
	// Video segment where a label was detected.
	Segment *VideoSegment `protobuf:"bytes,1,opt,name=segment,proto3" json:"segment,omitempty"`
	// Confidence that the label is accurate. Range: [0, 1].
	Confidence           float32  `protobuf:"fixed32,2,opt,name=confidence,proto3" json:"confidence,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LabelSegment) Reset()         { *m = LabelSegment{} }
func (m *LabelSegment) String() string { return proto.CompactTextString(m) }
func (*LabelSegment) ProtoMessage()    {}
func (*LabelSegment) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{10}
}

func (m *LabelSegment) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LabelSegment.Unmarshal(m, b)
}
func (m *LabelSegment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LabelSegment.Marshal(b, m, deterministic)
}
func (m *LabelSegment) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LabelSegment.Merge(m, src)
}
func (m *LabelSegment) XXX_Size() int {
	return xxx_messageInfo_LabelSegment.Size(m)
}
func (m *LabelSegment) XXX_DiscardUnknown() {
	xxx_messageInfo_LabelSegment.DiscardUnknown(m)
}

var xxx_messageInfo_LabelSegment proto.InternalMessageInfo

func (m *LabelSegment) GetSegment() *VideoSegment {
	if m != nil {
		return m.Segment
	}
	return nil
}

func (m *LabelSegment) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

// Video frame level annotation results for label detection.
type LabelFrame struct {
	// Time-offset, relative to the beginning of the video, corresponding to the
	// video frame for this location.
	TimeOffset *duration.Duration `protobuf:"bytes,1,opt,name=time_offset,json=timeOffset,proto3" json:"time_offset,omitempty"`
	// Confidence that the label is accurate. Range: [0, 1].
	Confidence           float32  `protobuf:"fixed32,2,opt,name=confidence,proto3" json:"confidence,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LabelFrame) Reset()         { *m = LabelFrame{} }
func (m *LabelFrame) String() string { return proto.CompactTextString(m) }
func (*LabelFrame) ProtoMessage()    {}
func (*LabelFrame) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{11}
}

func (m *LabelFrame) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LabelFrame.Unmarshal(m, b)
}
func (m *LabelFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LabelFrame.Marshal(b, m, deterministic)
}
func (m *LabelFrame) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LabelFrame.Merge(m, src)
}
func (m *LabelFrame) XXX_Size() int {
	return xxx_messageInfo_LabelFrame.Size(m)
}
func (m *LabelFrame) XXX_DiscardUnknown() {
	xxx_messageInfo_LabelFrame.DiscardUnknown(m)
}

var xxx_messageInfo_LabelFrame proto.InternalMessageInfo

func (m *LabelFrame) GetTimeOffset() *duration.Duration {
	if m != nil {
		return m.TimeOffset
	}
	return nil
}

func (m *LabelFrame) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

// Detected entity from video analysis.
type Entity struct {
	// Opaque entity ID. Some IDs may be available in
	// [Google Knowledge Graph Search
	// API](https://developers.google.com/knowledge-graph/).
	EntityId string `protobuf:"bytes,1,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
	// Textual description, e.g. `Fixed-gear bicycle`.
	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Language code for `description` in BCP-47 format.
	LanguageCode         string   `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Entity) Reset()         { *m = Entity{} }
func (m *Entity) String() string { return proto.CompactTextString(m) }
func (*Entity) ProtoMessage()    {}
func (*Entity) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{12}
}

func (m *Entity) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Entity.Unmarshal(m, b)
}
func (m *Entity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Entity.Marshal(b, m, deterministic)
}
func (m *Entity) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Entity.Merge(m, src)
}
func (m *Entity) XXX_Size() int {
	return xxx_messageInfo_Entity.Size(m)
}
func (m *Entity) XXX_DiscardUnknown() {
	xxx_messageInfo_Entity.DiscardUnknown(m)
}

var xxx_messageInfo_Entity proto.InternalMessageInfo

func (m *Entity) GetEntityId() string {
	if m != nil {
		return m.EntityId
	}
	return ""
}

func (m *Entity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Entity) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

// Label annotation.
type LabelAnnotation struct {
	// Detected entity.
	Entity *Entity `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"`
	// Common categories for the detected entity.
	// E.g. when the label is `Terrier` the category is likely `dog`. And in some
	// cases there might be more than one categories e.g. `Terrier` could also be
	// a `pet`.
	CategoryEntities []*Entity `protobuf:"bytes,2,rep,name=category_entities,json=categoryEntities,proto3" json:"category_entities,omitempty"`
	// All video segments where a label was detected.
	Segments []*LabelSegment `protobuf:"bytes,3,rep,name=segments,proto3" json:"segments,omitempty"`
	// All video frames where a label was detected.
	Frames               []*LabelFrame `protobuf:"bytes,4,rep,name=frames,proto3" json:"frames,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LabelAnnotation) Reset()         { *m = LabelAnnotation{} }
func (m *LabelAnnotation) String() string { return proto.CompactTextString(m) }
func (*LabelAnnotation) ProtoMessage()    {}
func (*LabelAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{13}
}

func (m *LabelAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LabelAnnotation.Unmarshal(m, b)
}
func (m *LabelAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LabelAnnotation.Marshal(b, m, deterministic)
}
func (m *LabelAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LabelAnnotation.Merge(m, src)
}
func (m *LabelAnnotation) XXX_Size() int {
	return xxx_messageInfo_LabelAnnotation.Size(m)
}
func (m *LabelAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_LabelAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_LabelAnnotation proto.InternalMessageInfo

func (m *LabelAnnotation) GetEntity() *Entity {
	if m != nil {
		return m.Entity
	}
	return nil
}

func (m *LabelAnnotation) GetCategoryEntities() []*Entity {
	if m != nil {
		return m.CategoryEntities
	}
	return nil
}

func (m *LabelAnnotation) GetSegments() []*LabelSegment {
	if m != nil {
		return m.Segments
	}
	return nil
}

func (m *LabelAnnotation) GetFrames() []*LabelFrame {
	if m != nil {
		return m.Frames
	}
	return nil
}

// Video frame level annotation results for explicit content.
type ExplicitContentFrame struct {
	// Time-offset, relative to the beginning of the video, corresponding to the
	// video frame for this location.
	TimeOffset *duration.Duration `protobuf:"bytes,1,opt,name=time_offset,json=timeOffset,proto3" json:"time_offset,omitempty"`
	// Likelihood of the pornography content..
	PornographyLikelihood Likelihood `protobuf:"varint,2,opt,name=pornography_likelihood,json=pornographyLikelihood,proto3,enum=google.cloud.videointelligence.v1p3beta1.Likelihood" json:"pornography_likelihood,omitempty"`
	XXX_NoUnkeyedLiteral  struct{}   `json:"-"`
	XXX_unrecognized      []byte     `json:"-"`
	XXX_sizecache         int32      `json:"-"`
}

func (m *ExplicitContentFrame) Reset()         { *m = ExplicitContentFrame{} }
func (m *ExplicitContentFrame) String() string { return proto.CompactTextString(m) }
func (*ExplicitContentFrame) ProtoMessage()    {}
func (*ExplicitContentFrame) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{14}
}

func (m *ExplicitContentFrame) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExplicitContentFrame.Unmarshal(m, b)
}
func (m *ExplicitContentFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExplicitContentFrame.Marshal(b, m, deterministic)
}
func (m *ExplicitContentFrame) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExplicitContentFrame.Merge(m, src)
}
func (m *ExplicitContentFrame) XXX_Size() int {
	return xxx_messageInfo_ExplicitContentFrame.Size(m)
}
func (m *ExplicitContentFrame) XXX_DiscardUnknown() {
	xxx_messageInfo_ExplicitContentFrame.DiscardUnknown(m)
}

var xxx_messageInfo_ExplicitContentFrame proto.InternalMessageInfo

func (m *ExplicitContentFrame) GetTimeOffset() *duration.Duration {
	if m != nil {
		return m.TimeOffset
	}
	return nil
}

func (m *ExplicitContentFrame) GetPornographyLikelihood() Likelihood {
	if m != nil {
		return m.PornographyLikelihood
	}
	return Likelihood_LIKELIHOOD_UNSPECIFIED
}

// Explicit content annotation (based on per-frame visual signals only).
// If no explicit content has been detected in a frame, no annotations are
// present for that frame.
type ExplicitContentAnnotation struct {
	// All video frames where explicit content was detected.
	Frames               []*ExplicitContentFrame `protobuf:"bytes,1,rep,name=frames,proto3" json:"frames,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *ExplicitContentAnnotation) Reset()         { *m = ExplicitContentAnnotation{} }
func (m *ExplicitContentAnnotation) String() string { return proto.CompactTextString(m) }
func (*ExplicitContentAnnotation) ProtoMessage()    {}
func (*ExplicitContentAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{15}
}

func (m *ExplicitContentAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExplicitContentAnnotation.Unmarshal(m, b)
}
func (m *ExplicitContentAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExplicitContentAnnotation.Marshal(b, m, deterministic)
}
func (m *ExplicitContentAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExplicitContentAnnotation.Merge(m, src)
}
func (m *ExplicitContentAnnotation) XXX_Size() int {
	return xxx_messageInfo_ExplicitContentAnnotation.Size(m)
}
func (m *ExplicitContentAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_ExplicitContentAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_ExplicitContentAnnotation proto.InternalMessageInfo

func (m *ExplicitContentAnnotation) GetFrames() []*ExplicitContentFrame {
	if m != nil {
		return m.Frames
	}
	return nil
}

// Normalized bounding box.
// The normalized vertex coordinates are relative to the original image.
// Range: [0, 1].
type NormalizedBoundingBox struct {
	// Left X coordinate.
	Left float32 `protobuf:"fixed32,1,opt,name=left,proto3" json:"left,omitempty"`
	// Top Y coordinate.
	Top float32 `protobuf:"fixed32,2,opt,name=top,proto3" json:"top,omitempty"`
	// Right X coordinate.
	Right float32 `protobuf:"fixed32,3,opt,name=right,proto3" json:"right,omitempty"`
	// Bottom Y coordinate.
	Bottom               float32  `protobuf:"fixed32,4,opt,name=bottom,proto3" json:"bottom,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NormalizedBoundingBox) Reset()         { *m = NormalizedBoundingBox{} }
func (m *NormalizedBoundingBox) String() string { return proto.CompactTextString(m) }
func (*NormalizedBoundingBox) ProtoMessage()    {}
func (*NormalizedBoundingBox) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{16}
}

func (m *NormalizedBoundingBox) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NormalizedBoundingBox.Unmarshal(m, b)
}
func (m *NormalizedBoundingBox) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NormalizedBoundingBox.Marshal(b, m, deterministic)
}
func (m *NormalizedBoundingBox) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NormalizedBoundingBox.Merge(m, src)
}
func (m *NormalizedBoundingBox) XXX_Size() int {
	return xxx_messageInfo_NormalizedBoundingBox.Size(m)
}
func (m *NormalizedBoundingBox) XXX_DiscardUnknown() {
	xxx_messageInfo_NormalizedBoundingBox.DiscardUnknown(m)
}

var xxx_messageInfo_NormalizedBoundingBox proto.InternalMessageInfo

func (m *NormalizedBoundingBox) GetLeft() float32 {
	if m != nil {
		return m.Left
	}
	return 0
}

func (m *NormalizedBoundingBox) GetTop() float32 {
	if m != nil {
		return m.Top
	}
	return 0
}

func (m *NormalizedBoundingBox) GetRight() float32 {
	if m != nil {
		return m.Right
	}
	return 0
}

func (m *NormalizedBoundingBox) GetBottom() float32 {
	if m != nil {
		return m.Bottom
	}
	return 0
}

// For tracking related features.
// An object at time_offset with attributes, and located with
// normalized_bounding_box.
type TimestampedObject struct {
	// Normalized Bounding box in a frame, where the object is located.
	NormalizedBoundingBox *NormalizedBoundingBox `protobuf:"bytes,1,opt,name=normalized_bounding_box,json=normalizedBoundingBox,proto3" json:"normalized_bounding_box,omitempty"`
	// Time-offset, relative to the beginning of the video,
	// corresponding to the video frame for this object.
	TimeOffset *duration.Duration `protobuf:"bytes,2,opt,name=time_offset,json=timeOffset,proto3" json:"time_offset,omitempty"`
	// Optional. The attributes of the object in the bounding box.
	Attributes []*DetectedAttribute `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty"`
	// Optional. The detected landmarks.
	Landmarks            []*DetectedLandmark `protobuf:"bytes,4,rep,name=landmarks,proto3" json:"landmarks,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *TimestampedObject) Reset()         { *m = TimestampedObject{} }
func (m *TimestampedObject) String() string { return proto.CompactTextString(m) }
func (*TimestampedObject) ProtoMessage()    {}
func (*TimestampedObject) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{17}
}

func (m *TimestampedObject) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TimestampedObject.Unmarshal(m, b)
}
func (m *TimestampedObject) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TimestampedObject.Marshal(b, m, deterministic)
}
func (m *TimestampedObject) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TimestampedObject.Merge(m, src)
}
func (m *TimestampedObject) XXX_Size() int {
	return xxx_messageInfo_TimestampedObject.Size(m)
}
func (m *TimestampedObject) XXX_DiscardUnknown() {
	xxx_messageInfo_TimestampedObject.DiscardUnknown(m)
}

var xxx_messageInfo_TimestampedObject proto.InternalMessageInfo

func (m *TimestampedObject) GetNormalizedBoundingBox() *NormalizedBoundingBox {
	if m != nil {
		return m.NormalizedBoundingBox
	}
	return nil
}

func (m *TimestampedObject) GetTimeOffset() *duration.Duration {
	if m != nil {
		return m.TimeOffset
	}
	return nil
}

func (m *TimestampedObject) GetAttributes() []*DetectedAttribute {
	if m != nil {
		return m.Attributes
	}
	return nil
}

func (m *TimestampedObject) GetLandmarks() []*DetectedLandmark {
	if m != nil {
		return m.Landmarks
	}
	return nil
}

// A track of an object instance.
type Track struct {
	// Video segment of a track.
	Segment *VideoSegment `protobuf:"bytes,1,opt,name=segment,proto3" json:"segment,omitempty"`
	// The object with timestamp and attributes per frame in the track.
	TimestampedObjects []*TimestampedObject `protobuf:"bytes,2,rep,name=timestamped_objects,json=timestampedObjects,proto3" json:"timestamped_objects,omitempty"`
	// Optional. Attributes in the track level.
	Attributes []*DetectedAttribute `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty"`
	// Optional. The confidence score of the tracked object.
	Confidence           float32  `protobuf:"fixed32,4,opt,name=confidence,proto3" json:"confidence,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Track) Reset()         { *m = Track{} }
func (m *Track) String() string { return proto.CompactTextString(m) }
func (*Track) ProtoMessage()    {}
func (*Track) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{18}
}

func (m *Track) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Track.Unmarshal(m, b)
}
func (m *Track) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Track.Marshal(b, m, deterministic)
}
func (m *Track) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Track.Merge(m, src)
}
func (m *Track) XXX_Size() int {
	return xxx_messageInfo_Track.Size(m)
}
func (m *Track) XXX_DiscardUnknown() {
	xxx_messageInfo_Track.DiscardUnknown(m)
}

var xxx_messageInfo_Track proto.InternalMessageInfo

func (m *Track) GetSegment() *VideoSegment {
	if m != nil {
		return m.Segment
	}
	return nil
}

func (m *Track) GetTimestampedObjects() []*TimestampedObject {
	if m != nil {
		return m.TimestampedObjects
	}
	return nil
}

func (m *Track) GetAttributes() []*DetectedAttribute {
	if m != nil {
		return m.Attributes
	}
	return nil
}

func (m *Track) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

// A generic detected attribute represented by name in string format.
type DetectedAttribute struct {
	// The name of the attribute, i.e. glasses, dark_glasses, mouth_open etc.
	// A full list of supported type names will be provided in the document.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Detected attribute confidence. Range [0, 1].
	Confidence float32 `protobuf:"fixed32,2,opt,name=confidence,proto3" json:"confidence,omitempty"`
	// Text value of the detection result. For example, the value for "HairColor"
	// can be "black", "blonde", etc.
	Value                string   `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DetectedAttribute) Reset()         { *m = DetectedAttribute{} }
func (m *DetectedAttribute) String() string { return proto.CompactTextString(m) }
func (*DetectedAttribute) ProtoMessage()    {}
func (*DetectedAttribute) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{19}
}

func (m *DetectedAttribute) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DetectedAttribute.Unmarshal(m, b)
}
func (m *DetectedAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DetectedAttribute.Marshal(b, m, deterministic)
}
func (m *DetectedAttribute) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DetectedAttribute.Merge(m, src)
}
func (m *DetectedAttribute) XXX_Size() int {
	return xxx_messageInfo_DetectedAttribute.Size(m)
}
func (m *DetectedAttribute) XXX_DiscardUnknown() {
	xxx_messageInfo_DetectedAttribute.DiscardUnknown(m)
}

var xxx_messageInfo_DetectedAttribute proto.InternalMessageInfo

func (m *DetectedAttribute) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *DetectedAttribute) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

func (m *DetectedAttribute) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

// Celebrity definition.
type Celebrity struct {
	// The resource name of the celebrity. Have the format
	// `video-intelligence/kg-mid` indicates a celebrity from preloaded gallery.
	// kg-mid is the id in Google knowledge graph, which is unique for the
	// celebrity.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The celebrity name.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Textual description of additional information about the celebrity, if
	// applicable.
	Description          string   `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Celebrity) Reset()         { *m = Celebrity{} }
func (m *Celebrity) String() string { return proto.CompactTextString(m) }
func (*Celebrity) ProtoMessage()    {}
func (*Celebrity) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{20}
}

func (m *Celebrity) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Celebrity.Unmarshal(m, b)
}
func (m *Celebrity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Celebrity.Marshal(b, m, deterministic)
}
func (m *Celebrity) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Celebrity.Merge(m, src)
}
func (m *Celebrity) XXX_Size() int {
	return xxx_messageInfo_Celebrity.Size(m)
}
func (m *Celebrity) XXX_DiscardUnknown() {
	xxx_messageInfo_Celebrity.DiscardUnknown(m)
}

var xxx_messageInfo_Celebrity proto.InternalMessageInfo

func (m *Celebrity) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Celebrity) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *Celebrity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

// The annotation result of a celebrity face track. RecognizedCelebrity field
// could be empty if the face track does not have any matched celebrities.
type CelebrityTrack struct {
	// Top N match of the celebrities for the face in this track.
	Celebrities []*CelebrityTrack_RecognizedCelebrity `protobuf:"bytes,1,rep,name=celebrities,proto3" json:"celebrities,omitempty"`
	// A track of a person's face.
	FaceTrack            *Track   `protobuf:"bytes,3,opt,name=face_track,json=faceTrack,proto3" json:"face_track,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CelebrityTrack) Reset()         { *m = CelebrityTrack{} }
func (m *CelebrityTrack) String() string { return proto.CompactTextString(m) }
func (*CelebrityTrack) ProtoMessage()    {}
func (*CelebrityTrack) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{21}
}

func (m *CelebrityTrack) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CelebrityTrack.Unmarshal(m, b)
}
func (m *CelebrityTrack) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CelebrityTrack.Marshal(b, m, deterministic)
}
func (m *CelebrityTrack) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CelebrityTrack.Merge(m, src)
}
func (m *CelebrityTrack) XXX_Size() int {
	return xxx_messageInfo_CelebrityTrack.Size(m)
}
func (m *CelebrityTrack) XXX_DiscardUnknown() {
	xxx_messageInfo_CelebrityTrack.DiscardUnknown(m)
}

var xxx_messageInfo_CelebrityTrack proto.InternalMessageInfo

func (m *CelebrityTrack) GetCelebrities() []*CelebrityTrack_RecognizedCelebrity {
	if m != nil {
		return m.Celebrities
	}
	return nil
}

func (m *CelebrityTrack) GetFaceTrack() *Track {
	if m != nil {
		return m.FaceTrack
	}
	return nil
}

// The recognized celebrity with confidence score.
type CelebrityTrack_RecognizedCelebrity struct {
	// The recognized celebrity.
	Celebrity *Celebrity `protobuf:"bytes,1,opt,name=celebrity,proto3" json:"celebrity,omitempty"`
	// Recognition confidence. Range [0, 1].
	Confidence           float32  `protobuf:"fixed32,2,opt,name=confidence,proto3" json:"confidence,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CelebrityTrack_RecognizedCelebrity) Reset()         { *m = CelebrityTrack_RecognizedCelebrity{} }
func (m *CelebrityTrack_RecognizedCelebrity) String() string { return proto.CompactTextString(m) }
func (*CelebrityTrack_RecognizedCelebrity) ProtoMessage()    {}
func (*CelebrityTrack_RecognizedCelebrity) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{21, 0}
}

func (m *CelebrityTrack_RecognizedCelebrity) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CelebrityTrack_RecognizedCelebrity.Unmarshal(m, b)
}
func (m *CelebrityTrack_RecognizedCelebrity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CelebrityTrack_RecognizedCelebrity.Marshal(b, m, deterministic)
}
func (m *CelebrityTrack_RecognizedCelebrity) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CelebrityTrack_RecognizedCelebrity.Merge(m, src)
}
func (m *CelebrityTrack_RecognizedCelebrity) XXX_Size() int {
	return xxx_messageInfo_CelebrityTrack_RecognizedCelebrity.Size(m)
}
func (m *CelebrityTrack_RecognizedCelebrity) XXX_DiscardUnknown() {
	xxx_messageInfo_CelebrityTrack_RecognizedCelebrity.DiscardUnknown(m)
}

var xxx_messageInfo_CelebrityTrack_RecognizedCelebrity proto.InternalMessageInfo

func (m *CelebrityTrack_RecognizedCelebrity) GetCelebrity() *Celebrity {
	if m != nil {
		return m.Celebrity
	}
	return nil
}

func (m *CelebrityTrack_RecognizedCelebrity) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

// Celebrity recognition annotation per video.
type CelebrityRecognitionAnnotation struct {
	// The tracks detected from the input video, including recognized celebrities
	// and other detected faces in the video.
	CelebrityTracks      []*CelebrityTrack `protobuf:"bytes,1,rep,name=celebrity_tracks,json=celebrityTracks,proto3" json:"celebrity_tracks,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *CelebrityRecognitionAnnotation) Reset()         { *m = CelebrityRecognitionAnnotation{} }
func (m *CelebrityRecognitionAnnotation) String() string { return proto.CompactTextString(m) }
func (*CelebrityRecognitionAnnotation) ProtoMessage()    {}
func (*CelebrityRecognitionAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{22}
}

func (m *CelebrityRecognitionAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CelebrityRecognitionAnnotation.Unmarshal(m, b)
}
func (m *CelebrityRecognitionAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CelebrityRecognitionAnnotation.Marshal(b, m, deterministic)
}
func (m *CelebrityRecognitionAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CelebrityRecognitionAnnotation.Merge(m, src)
}
func (m *CelebrityRecognitionAnnotation) XXX_Size() int {
	return xxx_messageInfo_CelebrityRecognitionAnnotation.Size(m)
}
func (m *CelebrityRecognitionAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_CelebrityRecognitionAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_CelebrityRecognitionAnnotation proto.InternalMessageInfo

func (m *CelebrityRecognitionAnnotation) GetCelebrityTracks() []*CelebrityTrack {
	if m != nil {
		return m.CelebrityTracks
	}
	return nil
}

// A generic detected landmark represented by name in string format and a 2D
// location.
type DetectedLandmark struct {
	// The name of this landmark, i.e. left_hand, right_shoulder.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The 2D point of the detected landmark using the normalized image
	// coordindate system. The normalized coordinates have the range from 0 to 1.
	Point *NormalizedVertex `protobuf:"bytes,2,opt,name=point,proto3" json:"point,omitempty"`
	// The confidence score of the detected landmark. Range [0, 1].
	Confidence           float32  `protobuf:"fixed32,3,opt,name=confidence,proto3" json:"confidence,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DetectedLandmark) Reset()         { *m = DetectedLandmark{} }
func (m *DetectedLandmark) String() string { return proto.CompactTextString(m) }
func (*DetectedLandmark) ProtoMessage()    {}
func (*DetectedLandmark) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{23}
}

func (m *DetectedLandmark) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DetectedLandmark.Unmarshal(m, b)
}
func (m *DetectedLandmark) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DetectedLandmark.Marshal(b, m, deterministic)
}
func (m *DetectedLandmark) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DetectedLandmark.Merge(m, src)
}
func (m *DetectedLandmark) XXX_Size() int {
	return xxx_messageInfo_DetectedLandmark.Size(m)
}
func (m *DetectedLandmark) XXX_DiscardUnknown() {
	xxx_messageInfo_DetectedLandmark.DiscardUnknown(m)
}

var xxx_messageInfo_DetectedLandmark proto.InternalMessageInfo

func (m *DetectedLandmark) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *DetectedLandmark) GetPoint() *NormalizedVertex {
	if m != nil {
		return m.Point
	}
	return nil
}

func (m *DetectedLandmark) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

// Face detection annotation.
type FaceDetectionAnnotation struct {
	// The face tracks with attributes.
	Tracks []*Track `protobuf:"bytes,3,rep,name=tracks,proto3" json:"tracks,omitempty"`
	// The thumbnail of a person's face.
	Thumbnail            []byte   `protobuf:"bytes,4,opt,name=thumbnail,proto3" json:"thumbnail,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FaceDetectionAnnotation) Reset()         { *m = FaceDetectionAnnotation{} }
func (m *FaceDetectionAnnotation) String() string { return proto.CompactTextString(m) }
func (*FaceDetectionAnnotation) ProtoMessage()    {}
func (*FaceDetectionAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{24}
}

func (m *FaceDetectionAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FaceDetectionAnnotation.Unmarshal(m, b)
}
func (m *FaceDetectionAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FaceDetectionAnnotation.Marshal(b, m, deterministic)
}
func (m *FaceDetectionAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FaceDetectionAnnotation.Merge(m, src)
}
func (m *FaceDetectionAnnotation) XXX_Size() int {
	return xxx_messageInfo_FaceDetectionAnnotation.Size(m)
}
func (m *FaceDetectionAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_FaceDetectionAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_FaceDetectionAnnotation proto.InternalMessageInfo

func (m *FaceDetectionAnnotation) GetTracks() []*Track {
	if m != nil {
		return m.Tracks
	}
	return nil
}

func (m *FaceDetectionAnnotation) GetThumbnail() []byte {
	if m != nil {
		return m.Thumbnail
	}
	return nil
}

// Person detection annotation per video.
type PersonDetectionAnnotation struct {
	// The trackes that a person is detected.
	Tracks               []*Track `protobuf:"bytes,1,rep,name=tracks,proto3" json:"tracks,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PersonDetectionAnnotation) Reset()         { *m = PersonDetectionAnnotation{} }
func (m *PersonDetectionAnnotation) String() string { return proto.CompactTextString(m) }
func (*PersonDetectionAnnotation) ProtoMessage()    {}
func (*PersonDetectionAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{25}
}

func (m *PersonDetectionAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PersonDetectionAnnotation.Unmarshal(m, b)
}
func (m *PersonDetectionAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PersonDetectionAnnotation.Marshal(b, m, deterministic)
}
func (m *PersonDetectionAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PersonDetectionAnnotation.Merge(m, src)
}
func (m *PersonDetectionAnnotation) XXX_Size() int {
	return xxx_messageInfo_PersonDetectionAnnotation.Size(m)
}
func (m *PersonDetectionAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_PersonDetectionAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_PersonDetectionAnnotation proto.InternalMessageInfo

func (m *PersonDetectionAnnotation) GetTracks() []*Track {
	if m != nil {
		return m.Tracks
	}
	return nil
}

// Annotation results for a single video.
type VideoAnnotationResults struct {
	// Video file location in
	// [Google Cloud Storage](https://cloud.google.com/storage/).
	InputUri string `protobuf:"bytes,1,opt,name=input_uri,json=inputUri,proto3" json:"input_uri,omitempty"`
	// Video segment on which the annotation is run.
	Segment *VideoSegment `protobuf:"bytes,10,opt,name=segment,proto3" json:"segment,omitempty"`
	// Topical label annotations on video level or user specified segment level.
	// There is exactly one element for each unique label.
	SegmentLabelAnnotations []*LabelAnnotation `protobuf:"bytes,2,rep,name=segment_label_annotations,json=segmentLabelAnnotations,proto3" json:"segment_label_annotations,omitempty"`
	// Presence label annotations on video level or user specified segment level.
	// There is exactly one element for each unique label. Compared to the
	// existing topical `segment_label_annotations`, this field presents more
	// fine-grained, segment-level labels detected in video content and is made
	// available only when the client sets `LabelDetectionConfig.model` to
	// "builtin/latest" in the request.
	SegmentPresenceLabelAnnotations []*LabelAnnotation `protobuf:"bytes,23,rep,name=segment_presence_label_annotations,json=segmentPresenceLabelAnnotations,proto3" json:"segment_presence_label_annotations,omitempty"`
	// Topical label annotations on shot level.
	// There is exactly one element for each unique label.
	ShotLabelAnnotations []*LabelAnnotation `protobuf:"bytes,3,rep,name=shot_label_annotations,json=shotLabelAnnotations,proto3" json:"shot_label_annotations,omitempty"`
	// Presence label annotations on shot level. There is exactly one element for
	// each unique label. Compared to the existing topical
	// `shot_label_annotations`, this field presents more fine-grained, shot-level
	// labels detected in video content and is made available only when the client
	// sets `LabelDetectionConfig.model` to "builtin/latest" in the request.
	ShotPresenceLabelAnnotations []*LabelAnnotation `protobuf:"bytes,24,rep,name=shot_presence_label_annotations,json=shotPresenceLabelAnnotations,proto3" json:"shot_presence_label_annotations,omitempty"`
	// Label annotations on frame level.
	// There is exactly one element for each unique label.
	FrameLabelAnnotations []*LabelAnnotation `protobuf:"bytes,4,rep,name=frame_label_annotations,json=frameLabelAnnotations,proto3" json:"frame_label_annotations,omitempty"`
	// Face detection annotations.
	FaceDetectionAnnotations []*FaceDetectionAnnotation `protobuf:"bytes,13,rep,name=face_detection_annotations,json=faceDetectionAnnotations,proto3" json:"face_detection_annotations,omitempty"`
	// Shot annotations. Each shot is represented as a video segment.
	ShotAnnotations []*VideoSegment `protobuf:"bytes,6,rep,name=shot_annotations,json=shotAnnotations,proto3" json:"shot_annotations,omitempty"`
	// Explicit content annotation.
	ExplicitAnnotation *ExplicitContentAnnotation `protobuf:"bytes,7,opt,name=explicit_annotation,json=explicitAnnotation,proto3" json:"explicit_annotation,omitempty"`
	// Speech transcription.
	SpeechTranscriptions []*SpeechTranscription `protobuf:"bytes,11,rep,name=speech_transcriptions,json=speechTranscriptions,proto3" json:"speech_transcriptions,omitempty"`
	// OCR text detection and tracking.
	// Annotations for list of detected text snippets. Each will have list of
	// frame information associated with it.
	TextAnnotations []*TextAnnotation `protobuf:"bytes,12,rep,name=text_annotations,json=textAnnotations,proto3" json:"text_annotations,omitempty"`
	// Annotations for list of objects detected and tracked in video.
	ObjectAnnotations []*ObjectTrackingAnnotation `protobuf:"bytes,14,rep,name=object_annotations,json=objectAnnotations,proto3" json:"object_annotations,omitempty"`
	// Annotations for list of logos detected, tracked and recognized in video.
	LogoRecognitionAnnotations []*LogoRecognitionAnnotation `protobuf:"bytes,19,rep,name=logo_recognition_annotations,json=logoRecognitionAnnotations,proto3" json:"logo_recognition_annotations,omitempty"`
	// Person detection annotations.
	PersonDetectionAnnotations []*PersonDetectionAnnotation `protobuf:"bytes,20,rep,name=person_detection_annotations,json=personDetectionAnnotations,proto3" json:"person_detection_annotations,omitempty"`
	// Celebrity recognition annotations.
	CelebrityRecognitionAnnotations *CelebrityRecognitionAnnotation `protobuf:"bytes,21,opt,name=celebrity_recognition_annotations,json=celebrityRecognitionAnnotations,proto3" json:"celebrity_recognition_annotations,omitempty"`
	// If set, indicates an error. Note that for a single `AnnotateVideoRequest`
	// some videos may succeed and some may fail.
	Error                *status.Status `protobuf:"bytes,9,opt,name=error,proto3" json:"error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *VideoAnnotationResults) Reset()         { *m = VideoAnnotationResults{} }
func (m *VideoAnnotationResults) String() string { return proto.CompactTextString(m) }
func (*VideoAnnotationResults) ProtoMessage()    {}
func (*VideoAnnotationResults) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{26}
}

func (m *VideoAnnotationResults) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VideoAnnotationResults.Unmarshal(m, b)
}
func (m *VideoAnnotationResults) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VideoAnnotationResults.Marshal(b, m, deterministic)
}
func (m *VideoAnnotationResults) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VideoAnnotationResults.Merge(m, src)
}
func (m *VideoAnnotationResults) XXX_Size() int {
	return xxx_messageInfo_VideoAnnotationResults.Size(m)
}
func (m *VideoAnnotationResults) XXX_DiscardUnknown() {
	xxx_messageInfo_VideoAnnotationResults.DiscardUnknown(m)
}

var xxx_messageInfo_VideoAnnotationResults proto.InternalMessageInfo

func (m *VideoAnnotationResults) GetInputUri() string {
	if m != nil {
		return m.InputUri
	}
	return ""
}

func (m *VideoAnnotationResults) GetSegment() *VideoSegment {
	if m != nil {
		return m.Segment
	}
	return nil
}

func (m *VideoAnnotationResults) GetSegmentLabelAnnotations() []*LabelAnnotation {
	if m != nil {
		return m.SegmentLabelAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetSegmentPresenceLabelAnnotations() []*LabelAnnotation {
	if m != nil {
		return m.SegmentPresenceLabelAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetShotLabelAnnotations() []*LabelAnnotation {
	if m != nil {
		return m.ShotLabelAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetShotPresenceLabelAnnotations() []*LabelAnnotation {
	if m != nil {
		return m.ShotPresenceLabelAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetFrameLabelAnnotations() []*LabelAnnotation {
	if m != nil {
		return m.FrameLabelAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetFaceDetectionAnnotations() []*FaceDetectionAnnotation {
	if m != nil {
		return m.FaceDetectionAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetShotAnnotations() []*VideoSegment {
	if m != nil {
		return m.ShotAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetExplicitAnnotation() *ExplicitContentAnnotation {
	if m != nil {
		return m.ExplicitAnnotation
	}
	return nil
}

func (m *VideoAnnotationResults) GetSpeechTranscriptions() []*SpeechTranscription {
	if m != nil {
		return m.SpeechTranscriptions
	}
	return nil
}

func (m *VideoAnnotationResults) GetTextAnnotations() []*TextAnnotation {
	if m != nil {
		return m.TextAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetObjectAnnotations() []*ObjectTrackingAnnotation {
	if m != nil {
		return m.ObjectAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetLogoRecognitionAnnotations() []*LogoRecognitionAnnotation {
	if m != nil {
		return m.LogoRecognitionAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetPersonDetectionAnnotations() []*PersonDetectionAnnotation {
	if m != nil {
		return m.PersonDetectionAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetCelebrityRecognitionAnnotations() *CelebrityRecognitionAnnotation {
	if m != nil {
		return m.CelebrityRecognitionAnnotations
	}
	return nil
}

func (m *VideoAnnotationResults) GetError() *status.Status {
	if m != nil {
		return m.Error
	}
	return nil
}

// Video annotation response. Included in the `response`
// field of the `Operation` returned by the `GetOperation`
// call of the `google::longrunning::Operations` service.
type AnnotateVideoResponse struct {
	// Annotation results for all videos specified in `AnnotateVideoRequest`.
	AnnotationResults    []*VideoAnnotationResults `protobuf:"bytes,1,rep,name=annotation_results,json=annotationResults,proto3" json:"annotation_results,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *AnnotateVideoResponse) Reset()         { *m = AnnotateVideoResponse{} }
func (m *AnnotateVideoResponse) String() string { return proto.CompactTextString(m) }
func (*AnnotateVideoResponse) ProtoMessage()    {}
func (*AnnotateVideoResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{27}
}

func (m *AnnotateVideoResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AnnotateVideoResponse.Unmarshal(m, b)
}
func (m *AnnotateVideoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AnnotateVideoResponse.Marshal(b, m, deterministic)
}
func (m *AnnotateVideoResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AnnotateVideoResponse.Merge(m, src)
}
func (m *AnnotateVideoResponse) XXX_Size() int {
	return xxx_messageInfo_AnnotateVideoResponse.Size(m)
}
func (m *AnnotateVideoResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_AnnotateVideoResponse.DiscardUnknown(m)
}

var xxx_messageInfo_AnnotateVideoResponse proto.InternalMessageInfo

func (m *AnnotateVideoResponse) GetAnnotationResults() []*VideoAnnotationResults {
	if m != nil {
		return m.AnnotationResults
	}
	return nil
}

// Annotation progress for a single video.
type VideoAnnotationProgress struct {
	// Video file location in
	// [Google Cloud Storage](https://cloud.google.com/storage/).
	InputUri string `protobuf:"bytes,1,opt,name=input_uri,json=inputUri,proto3" json:"input_uri,omitempty"`
	// Approximate percentage processed thus far. Guaranteed to be
	// 100 when fully processed.
	ProgressPercent int32 `protobuf:"varint,2,opt,name=progress_percent,json=progressPercent,proto3" json:"progress_percent,omitempty"`
	// Time when the request was received.
	StartTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// Time of the most recent update.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// Specifies which feature is being tracked if the request contains more than
	// one features.
	Feature Feature `protobuf:"varint,5,opt,name=feature,proto3,enum=google.cloud.videointelligence.v1p3beta1.Feature" json:"feature,omitempty"`
	// Specifies which segment is being tracked if the request contains more than
	// one segments.
	Segment              *VideoSegment `protobuf:"bytes,6,opt,name=segment,proto3" json:"segment,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *VideoAnnotationProgress) Reset()         { *m = VideoAnnotationProgress{} }
func (m *VideoAnnotationProgress) String() string { return proto.CompactTextString(m) }
func (*VideoAnnotationProgress) ProtoMessage()    {}
func (*VideoAnnotationProgress) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{28}
}

func (m *VideoAnnotationProgress) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VideoAnnotationProgress.Unmarshal(m, b)
}
func (m *VideoAnnotationProgress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VideoAnnotationProgress.Marshal(b, m, deterministic)
}
func (m *VideoAnnotationProgress) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VideoAnnotationProgress.Merge(m, src)
}
func (m *VideoAnnotationProgress) XXX_Size() int {
	return xxx_messageInfo_VideoAnnotationProgress.Size(m)
}
func (m *VideoAnnotationProgress) XXX_DiscardUnknown() {
	xxx_messageInfo_VideoAnnotationProgress.DiscardUnknown(m)
}

var xxx_messageInfo_VideoAnnotationProgress proto.InternalMessageInfo

func (m *VideoAnnotationProgress) GetInputUri() string {
	if m != nil {
		return m.InputUri
	}
	return ""
}

func (m *VideoAnnotationProgress) GetProgressPercent() int32 {
	if m != nil {
		return m.ProgressPercent
	}
	return 0
}

func (m *VideoAnnotationProgress) GetStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *VideoAnnotationProgress) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *VideoAnnotationProgress) GetFeature() Feature {
	if m != nil {
		return m.Feature
	}
	return Feature_FEATURE_UNSPECIFIED
}

func (m *VideoAnnotationProgress) GetSegment() *VideoSegment {
	if m != nil {
		return m.Segment
	}
	return nil
}

// Video annotation progress. Included in the `metadata`
// field of the `Operation` returned by the `GetOperation`
// call of the `google::longrunning::Operations` service.
type AnnotateVideoProgress struct {
	// Progress metadata for all videos specified in `AnnotateVideoRequest`.
	AnnotationProgress   []*VideoAnnotationProgress `protobuf:"bytes,1,rep,name=annotation_progress,json=annotationProgress,proto3" json:"annotation_progress,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *AnnotateVideoProgress) Reset()         { *m = AnnotateVideoProgress{} }
func (m *AnnotateVideoProgress) String() string { return proto.CompactTextString(m) }
func (*AnnotateVideoProgress) ProtoMessage()    {}
func (*AnnotateVideoProgress) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{29}
}

func (m *AnnotateVideoProgress) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AnnotateVideoProgress.Unmarshal(m, b)
}
func (m *AnnotateVideoProgress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AnnotateVideoProgress.Marshal(b, m, deterministic)
}
func (m *AnnotateVideoProgress) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AnnotateVideoProgress.Merge(m, src)
}
func (m *AnnotateVideoProgress) XXX_Size() int {
	return xxx_messageInfo_AnnotateVideoProgress.Size(m)
}
func (m *AnnotateVideoProgress) XXX_DiscardUnknown() {
	xxx_messageInfo_AnnotateVideoProgress.DiscardUnknown(m)
}

var xxx_messageInfo_AnnotateVideoProgress proto.InternalMessageInfo

func (m *AnnotateVideoProgress) GetAnnotationProgress() []*VideoAnnotationProgress {
	if m != nil {
		return m.AnnotationProgress
	}
	return nil
}

// Config for SPEECH_TRANSCRIPTION.
type SpeechTranscriptionConfig struct {
	// Required. *Required* The language of the supplied audio as a
	// [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag.
	// Example: "en-US".
	// See [Language Support](https://cloud.google.com/speech/docs/languages)
	// for a list of the currently supported language codes.
	LanguageCode string `protobuf:"bytes,1,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. Maximum number of recognition hypotheses to be returned.
	// Specifically, the maximum number of `SpeechRecognitionAlternative` messages
	// within each `SpeechTranscription`. The server may return fewer than
	// `max_alternatives`. Valid values are `0`-`30`. A value of `0` or `1` will
	// return a maximum of one. If omitted, will return a maximum of one.
	MaxAlternatives int32 `protobuf:"varint,2,opt,name=max_alternatives,json=maxAlternatives,proto3" json:"max_alternatives,omitempty"`
	// Optional. If set to `true`, the server will attempt to filter out
	// profanities, replacing all but the initial character in each filtered word
	// with asterisks, e.g. "f***". If set to `false` or omitted, profanities
	// won't be filtered out.
	FilterProfanity bool `protobuf:"varint,3,opt,name=filter_profanity,json=filterProfanity,proto3" json:"filter_profanity,omitempty"`
	// Optional. A means to provide context to assist the speech recognition.
	SpeechContexts []*SpeechContext `protobuf:"bytes,4,rep,name=speech_contexts,json=speechContexts,proto3" json:"speech_contexts,omitempty"`
	// Optional. If 'true', adds punctuation to recognition result hypotheses.
	// This feature is only available in select languages. Setting this for
	// requests in other languages has no effect at all. The default 'false' value
	// does not add punctuation to result hypotheses. NOTE: "This is currently
	// offered as an experimental service, complimentary to all users. In the
	// future this may be exclusively available as a premium feature."
	EnableAutomaticPunctuation bool `protobuf:"varint,5,opt,name=enable_automatic_punctuation,json=enableAutomaticPunctuation,proto3" json:"enable_automatic_punctuation,omitempty"`
	// Optional. For file formats, such as MXF or MKV, supporting multiple audio
	// tracks, specify up to two tracks. Default: track 0.
	AudioTracks []int32 `protobuf:"varint,6,rep,packed,name=audio_tracks,json=audioTracks,proto3" json:"audio_tracks,omitempty"`
	// Optional. If 'true', enables speaker detection for each recognized word in
	// the top alternative of the recognition result using a speaker_tag provided
	// in the WordInfo.
	// Note: When this is true, we send all the words from the beginning of the
	// audio for the top alternative in every consecutive responses.
	// This is done in order to improve our speaker tags as our models learn to
	// identify the speakers in the conversation over time.
	EnableSpeakerDiarization bool `protobuf:"varint,7,opt,name=enable_speaker_diarization,json=enableSpeakerDiarization,proto3" json:"enable_speaker_diarization,omitempty"`
	// Optional. If set, specifies the estimated number of speakers in the
	// conversation. If not set, defaults to '2'. Ignored unless
	// enable_speaker_diarization is set to true.
	DiarizationSpeakerCount int32 `protobuf:"varint,8,opt,name=diarization_speaker_count,json=diarizationSpeakerCount,proto3" json:"diarization_speaker_count,omitempty"`
	// Optional. If `true`, the top result includes a list of words and the
	// confidence for those words. If `false`, no word-level confidence
	// information is returned. The default is `false`.
	EnableWordConfidence bool     `protobuf:"varint,9,opt,name=enable_word_confidence,json=enableWordConfidence,proto3" json:"enable_word_confidence,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SpeechTranscriptionConfig) Reset()         { *m = SpeechTranscriptionConfig{} }
func (m *SpeechTranscriptionConfig) String() string { return proto.CompactTextString(m) }
func (*SpeechTranscriptionConfig) ProtoMessage()    {}
func (*SpeechTranscriptionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{30}
}

func (m *SpeechTranscriptionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SpeechTranscriptionConfig.Unmarshal(m, b)
}
func (m *SpeechTranscriptionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SpeechTranscriptionConfig.Marshal(b, m, deterministic)
}
func (m *SpeechTranscriptionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SpeechTranscriptionConfig.Merge(m, src)
}
func (m *SpeechTranscriptionConfig) XXX_Size() int {
	return xxx_messageInfo_SpeechTranscriptionConfig.Size(m)
}
func (m *SpeechTranscriptionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_SpeechTranscriptionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_SpeechTranscriptionConfig proto.InternalMessageInfo

func (m *SpeechTranscriptionConfig) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *SpeechTranscriptionConfig) GetMaxAlternatives() int32 {
	if m != nil {
		return m.MaxAlternatives
	}
	return 0
}

func (m *SpeechTranscriptionConfig) GetFilterProfanity() bool {
	if m != nil {
		return m.FilterProfanity
	}
	return false
}

func (m *SpeechTranscriptionConfig) GetSpeechContexts() []*SpeechContext {
	if m != nil {
		return m.SpeechContexts
	}
	return nil
}

func (m *SpeechTranscriptionConfig) GetEnableAutomaticPunctuation() bool {
	if m != nil {
		return m.EnableAutomaticPunctuation
	}
	return false
}

func (m *SpeechTranscriptionConfig) GetAudioTracks() []int32 {
	if m != nil {
		return m.AudioTracks
	}
	return nil
}

func (m *SpeechTranscriptionConfig) GetEnableSpeakerDiarization() bool {
	if m != nil {
		return m.EnableSpeakerDiarization
	}
	return false
}

func (m *SpeechTranscriptionConfig) GetDiarizationSpeakerCount() int32 {
	if m != nil {
		return m.DiarizationSpeakerCount
	}
	return 0
}

func (m *SpeechTranscriptionConfig) GetEnableWordConfidence() bool {
	if m != nil {
		return m.EnableWordConfidence
	}
	return false
}

// Provides "hints" to the speech recognizer to favor specific words and phrases
// in the results.
type SpeechContext struct {
	// Optional. A list of strings containing words and phrases "hints" so that
	// the speech recognition is more likely to recognize them. This can be used
	// to improve the accuracy for specific words and phrases, for example, if
	// specific commands are typically spoken by the user. This can also be used
	// to add additional words to the vocabulary of the recognizer. See
	// [usage limits](https://cloud.google.com/speech/limits#content).
	Phrases              []string `protobuf:"bytes,1,rep,name=phrases,proto3" json:"phrases,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SpeechContext) Reset()         { *m = SpeechContext{} }
func (m *SpeechContext) String() string { return proto.CompactTextString(m) }
func (*SpeechContext) ProtoMessage()    {}
func (*SpeechContext) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{31}
}

func (m *SpeechContext) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SpeechContext.Unmarshal(m, b)
}
func (m *SpeechContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SpeechContext.Marshal(b, m, deterministic)
}
func (m *SpeechContext) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SpeechContext.Merge(m, src)
}
func (m *SpeechContext) XXX_Size() int {
	return xxx_messageInfo_SpeechContext.Size(m)
}
func (m *SpeechContext) XXX_DiscardUnknown() {
	xxx_messageInfo_SpeechContext.DiscardUnknown(m)
}

var xxx_messageInfo_SpeechContext proto.InternalMessageInfo

func (m *SpeechContext) GetPhrases() []string {
	if m != nil {
		return m.Phrases
	}
	return nil
}

// A speech recognition result corresponding to a portion of the audio.
type SpeechTranscription struct {
	// May contain one or more recognition hypotheses (up to the maximum specified
	// in `max_alternatives`).  These alternatives are ordered in terms of
	// accuracy, with the top (first) alternative being the most probable, as
	// ranked by the recognizer.
	Alternatives []*SpeechRecognitionAlternative `protobuf:"bytes,1,rep,name=alternatives,proto3" json:"alternatives,omitempty"`
	// Output only. The [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt)
	// language tag of the language in this result. This language code was
	// detected to have the most likelihood of being spoken in the audio.
	LanguageCode         string   `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SpeechTranscription) Reset()         { *m = SpeechTranscription{} }
func (m *SpeechTranscription) String() string { return proto.CompactTextString(m) }
func (*SpeechTranscription) ProtoMessage()    {}
func (*SpeechTranscription) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{32}
}

func (m *SpeechTranscription) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SpeechTranscription.Unmarshal(m, b)
}
func (m *SpeechTranscription) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SpeechTranscription.Marshal(b, m, deterministic)
}
func (m *SpeechTranscription) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SpeechTranscription.Merge(m, src)
}
func (m *SpeechTranscription) XXX_Size() int {
	return xxx_messageInfo_SpeechTranscription.Size(m)
}
func (m *SpeechTranscription) XXX_DiscardUnknown() {
	xxx_messageInfo_SpeechTranscription.DiscardUnknown(m)
}

var xxx_messageInfo_SpeechTranscription proto.InternalMessageInfo

func (m *SpeechTranscription) GetAlternatives() []*SpeechRecognitionAlternative {
	if m != nil {
		return m.Alternatives
	}
	return nil
}

func (m *SpeechTranscription) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

// Alternative hypotheses (a.k.a. n-best list).
type SpeechRecognitionAlternative struct {
	// Transcript text representing the words that the user spoke.
	Transcript string `protobuf:"bytes,1,opt,name=transcript,proto3" json:"transcript,omitempty"`
	// Output only. The confidence estimate between 0.0 and 1.0. A higher number
	// indicates an estimated greater likelihood that the recognized words are
	// correct. This field is set only for the top alternative.
	// This field is not guaranteed to be accurate and users should not rely on it
	// to be always provided.
	// The default of 0.0 is a sentinel value indicating `confidence` was not set.
	Confidence float32 `protobuf:"fixed32,2,opt,name=confidence,proto3" json:"confidence,omitempty"`
	// Output only. A list of word-specific information for each recognized word.
	// Note: When `enable_speaker_diarization` is true, you will see all the words
	// from the beginning of the audio.
	Words                []*WordInfo `protobuf:"bytes,3,rep,name=words,proto3" json:"words,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *SpeechRecognitionAlternative) Reset()         { *m = SpeechRecognitionAlternative{} }
func (m *SpeechRecognitionAlternative) String() string { return proto.CompactTextString(m) }
func (*SpeechRecognitionAlternative) ProtoMessage()    {}
func (*SpeechRecognitionAlternative) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{33}
}

func (m *SpeechRecognitionAlternative) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SpeechRecognitionAlternative.Unmarshal(m, b)
}
func (m *SpeechRecognitionAlternative) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SpeechRecognitionAlternative.Marshal(b, m, deterministic)
}
func (m *SpeechRecognitionAlternative) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SpeechRecognitionAlternative.Merge(m, src)
}
func (m *SpeechRecognitionAlternative) XXX_Size() int {
	return xxx_messageInfo_SpeechRecognitionAlternative.Size(m)
}
func (m *SpeechRecognitionAlternative) XXX_DiscardUnknown() {
	xxx_messageInfo_SpeechRecognitionAlternative.DiscardUnknown(m)
}

var xxx_messageInfo_SpeechRecognitionAlternative proto.InternalMessageInfo

func (m *SpeechRecognitionAlternative) GetTranscript() string {
	if m != nil {
		return m.Transcript
	}
	return ""
}

func (m *SpeechRecognitionAlternative) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

func (m *SpeechRecognitionAlternative) GetWords() []*WordInfo {
	if m != nil {
		return m.Words
	}
	return nil
}

// Word-specific information for recognized words. Word information is only
// included in the response when certain request parameters are set, such
// as `enable_word_time_offsets`.
type WordInfo struct {
	// Time offset relative to the beginning of the audio, and
	// corresponding to the start of the spoken word. This field is only set if
	// `enable_word_time_offsets=true` and only in the top hypothesis. This is an
	// experimental feature and the accuracy of the time offset can vary.
	StartTime *duration.Duration `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// Time offset relative to the beginning of the audio, and
	// corresponding to the end of the spoken word. This field is only set if
	// `enable_word_time_offsets=true` and only in the top hypothesis. This is an
	// experimental feature and the accuracy of the time offset can vary.
	EndTime *duration.Duration `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	// The word corresponding to this set of information.
	Word string `protobuf:"bytes,3,opt,name=word,proto3" json:"word,omitempty"`
	// Output only. The confidence estimate between 0.0 and 1.0. A higher number
	// indicates an estimated greater likelihood that the recognized words are
	// correct. This field is set only for the top alternative.
	// This field is not guaranteed to be accurate and users should not rely on it
	// to be always provided.
	// The default of 0.0 is a sentinel value indicating `confidence` was not set.
	Confidence float32 `protobuf:"fixed32,4,opt,name=confidence,proto3" json:"confidence,omitempty"`
	// Output only. A distinct integer value is assigned for every speaker within
	// the audio. This field specifies which one of those speakers was detected to
	// have spoken this word. Value ranges from 1 up to diarization_speaker_count,
	// and is only set if speaker diarization is enabled.
	SpeakerTag           int32    `protobuf:"varint,5,opt,name=speaker_tag,json=speakerTag,proto3" json:"speaker_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WordInfo) Reset()         { *m = WordInfo{} }
func (m *WordInfo) String() string { return proto.CompactTextString(m) }
func (*WordInfo) ProtoMessage()    {}
func (*WordInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{34}
}

func (m *WordInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WordInfo.Unmarshal(m, b)
}
func (m *WordInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WordInfo.Marshal(b, m, deterministic)
}
func (m *WordInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WordInfo.Merge(m, src)
}
func (m *WordInfo) XXX_Size() int {
	return xxx_messageInfo_WordInfo.Size(m)
}
func (m *WordInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_WordInfo.DiscardUnknown(m)
}

var xxx_messageInfo_WordInfo proto.InternalMessageInfo

func (m *WordInfo) GetStartTime() *duration.Duration {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *WordInfo) GetEndTime() *duration.Duration {
	if m != nil {
		return m.EndTime
	}
	return nil
}

func (m *WordInfo) GetWord() string {
	if m != nil {
		return m.Word
	}
	return ""
}

func (m *WordInfo) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

func (m *WordInfo) GetSpeakerTag() int32 {
	if m != nil {
		return m.SpeakerTag
	}
	return 0
}

// A vertex represents a 2D point in the image.
// NOTE: the normalized vertex coordinates are relative to the original image
// and range from 0 to 1.
type NormalizedVertex struct {
	// X coordinate.
	X float32 `protobuf:"fixed32,1,opt,name=x,proto3" json:"x,omitempty"`
	// Y coordinate.
	Y                    float32  `protobuf:"fixed32,2,opt,name=y,proto3" json:"y,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NormalizedVertex) Reset()         { *m = NormalizedVertex{} }
func (m *NormalizedVertex) String() string { return proto.CompactTextString(m) }
func (*NormalizedVertex) ProtoMessage()    {}
func (*NormalizedVertex) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{35}
}

func (m *NormalizedVertex) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NormalizedVertex.Unmarshal(m, b)
}
func (m *NormalizedVertex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NormalizedVertex.Marshal(b, m, deterministic)
}
func (m *NormalizedVertex) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NormalizedVertex.Merge(m, src)
}
func (m *NormalizedVertex) XXX_Size() int {
	return xxx_messageInfo_NormalizedVertex.Size(m)
}
func (m *NormalizedVertex) XXX_DiscardUnknown() {
	xxx_messageInfo_NormalizedVertex.DiscardUnknown(m)
}

var xxx_messageInfo_NormalizedVertex proto.InternalMessageInfo

func (m *NormalizedVertex) GetX() float32 {
	if m != nil {
		return m.X
	}
	return 0
}

func (m *NormalizedVertex) GetY() float32 {
	if m != nil {
		return m.Y
	}
	return 0
}

// Normalized bounding polygon for text (that might not be aligned with axis).
// Contains list of the corner points in clockwise order starting from
// top-left corner. For example, for a rectangular bounding box:
// When the text is horizontal it might look like:
//         0----1
//         |    |
//         3----2
//
// When it's clockwise rotated 180 degrees around the top-left corner it
// becomes:
//         2----3
//         |    |
//         1----0
//
// and the vertex order will still be (0, 1, 2, 3). Note that values can be less
// than 0, or greater than 1 due to trignometric calculations for location of
// the box.
type NormalizedBoundingPoly struct {
	// Normalized vertices of the bounding polygon.
	Vertices             []*NormalizedVertex `protobuf:"bytes,1,rep,name=vertices,proto3" json:"vertices,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *NormalizedBoundingPoly) Reset()         { *m = NormalizedBoundingPoly{} }
func (m *NormalizedBoundingPoly) String() string { return proto.CompactTextString(m) }
func (*NormalizedBoundingPoly) ProtoMessage()    {}
func (*NormalizedBoundingPoly) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{36}
}

func (m *NormalizedBoundingPoly) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NormalizedBoundingPoly.Unmarshal(m, b)
}
func (m *NormalizedBoundingPoly) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NormalizedBoundingPoly.Marshal(b, m, deterministic)
}
func (m *NormalizedBoundingPoly) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NormalizedBoundingPoly.Merge(m, src)
}
func (m *NormalizedBoundingPoly) XXX_Size() int {
	return xxx_messageInfo_NormalizedBoundingPoly.Size(m)
}
func (m *NormalizedBoundingPoly) XXX_DiscardUnknown() {
	xxx_messageInfo_NormalizedBoundingPoly.DiscardUnknown(m)
}

var xxx_messageInfo_NormalizedBoundingPoly proto.InternalMessageInfo

func (m *NormalizedBoundingPoly) GetVertices() []*NormalizedVertex {
	if m != nil {
		return m.Vertices
	}
	return nil
}

// Video segment level annotation results for text detection.
type TextSegment struct {
	// Video segment where a text snippet was detected.
	Segment *VideoSegment `protobuf:"bytes,1,opt,name=segment,proto3" json:"segment,omitempty"`
	// Confidence for the track of detected text. It is calculated as the highest
	// over all frames where OCR detected text appears.
	Confidence float32 `protobuf:"fixed32,2,opt,name=confidence,proto3" json:"confidence,omitempty"`
	// Information related to the frames where OCR detected text appears.
	Frames               []*TextFrame `protobuf:"bytes,3,rep,name=frames,proto3" json:"frames,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *TextSegment) Reset()         { *m = TextSegment{} }
func (m *TextSegment) String() string { return proto.CompactTextString(m) }
func (*TextSegment) ProtoMessage()    {}
func (*TextSegment) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{37}
}

func (m *TextSegment) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TextSegment.Unmarshal(m, b)
}
func (m *TextSegment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TextSegment.Marshal(b, m, deterministic)
}
func (m *TextSegment) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TextSegment.Merge(m, src)
}
func (m *TextSegment) XXX_Size() int {
	return xxx_messageInfo_TextSegment.Size(m)
}
func (m *TextSegment) XXX_DiscardUnknown() {
	xxx_messageInfo_TextSegment.DiscardUnknown(m)
}

var xxx_messageInfo_TextSegment proto.InternalMessageInfo

func (m *TextSegment) GetSegment() *VideoSegment {
	if m != nil {
		return m.Segment
	}
	return nil
}

func (m *TextSegment) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

func (m *TextSegment) GetFrames() []*TextFrame {
	if m != nil {
		return m.Frames
	}
	return nil
}

// Video frame level annotation results for text annotation (OCR).
// Contains information regarding timestamp and bounding box locations for the
// frames containing detected OCR text snippets.
type TextFrame struct {
	// Bounding polygon of the detected text for this frame.
	RotatedBoundingBox *NormalizedBoundingPoly `protobuf:"bytes,1,opt,name=rotated_bounding_box,json=rotatedBoundingBox,proto3" json:"rotated_bounding_box,omitempty"`
	// Timestamp of this frame.
	TimeOffset           *duration.Duration `protobuf:"bytes,2,opt,name=time_offset,json=timeOffset,proto3" json:"time_offset,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *TextFrame) Reset()         { *m = TextFrame{} }
func (m *TextFrame) String() string { return proto.CompactTextString(m) }
func (*TextFrame) ProtoMessage()    {}
func (*TextFrame) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{38}
}

func (m *TextFrame) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TextFrame.Unmarshal(m, b)
}
func (m *TextFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TextFrame.Marshal(b, m, deterministic)
}
func (m *TextFrame) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TextFrame.Merge(m, src)
}
func (m *TextFrame) XXX_Size() int {
	return xxx_messageInfo_TextFrame.Size(m)
}
func (m *TextFrame) XXX_DiscardUnknown() {
	xxx_messageInfo_TextFrame.DiscardUnknown(m)
}

var xxx_messageInfo_TextFrame proto.InternalMessageInfo

func (m *TextFrame) GetRotatedBoundingBox() *NormalizedBoundingPoly {
	if m != nil {
		return m.RotatedBoundingBox
	}
	return nil
}

func (m *TextFrame) GetTimeOffset() *duration.Duration {
	if m != nil {
		return m.TimeOffset
	}
	return nil
}

// Annotations related to one detected OCR text snippet. This will contain the
// corresponding text, confidence value, and frame level information for each
// detection.
type TextAnnotation struct {
	// The detected text.
	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// All video segments where OCR detected text appears.
	Segments             []*TextSegment `protobuf:"bytes,2,rep,name=segments,proto3" json:"segments,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *TextAnnotation) Reset()         { *m = TextAnnotation{} }
func (m *TextAnnotation) String() string { return proto.CompactTextString(m) }
func (*TextAnnotation) ProtoMessage()    {}
func (*TextAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{39}
}

func (m *TextAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TextAnnotation.Unmarshal(m, b)
}
func (m *TextAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TextAnnotation.Marshal(b, m, deterministic)
}
func (m *TextAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TextAnnotation.Merge(m, src)
}
func (m *TextAnnotation) XXX_Size() int {
	return xxx_messageInfo_TextAnnotation.Size(m)
}
func (m *TextAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_TextAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_TextAnnotation proto.InternalMessageInfo

func (m *TextAnnotation) GetText() string {
	if m != nil {
		return m.Text
	}
	return ""
}

func (m *TextAnnotation) GetSegments() []*TextSegment {
	if m != nil {
		return m.Segments
	}
	return nil
}

// Video frame level annotations for object detection and tracking. This field
// stores per frame location, time offset, and confidence.
type ObjectTrackingFrame struct {
	// The normalized bounding box location of this object track for the frame.
	NormalizedBoundingBox *NormalizedBoundingBox `protobuf:"bytes,1,opt,name=normalized_bounding_box,json=normalizedBoundingBox,proto3" json:"normalized_bounding_box,omitempty"`
	// The timestamp of the frame in microseconds.
	TimeOffset           *duration.Duration `protobuf:"bytes,2,opt,name=time_offset,json=timeOffset,proto3" json:"time_offset,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *ObjectTrackingFrame) Reset()         { *m = ObjectTrackingFrame{} }
func (m *ObjectTrackingFrame) String() string { return proto.CompactTextString(m) }
func (*ObjectTrackingFrame) ProtoMessage()    {}
func (*ObjectTrackingFrame) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{40}
}

func (m *ObjectTrackingFrame) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ObjectTrackingFrame.Unmarshal(m, b)
}
func (m *ObjectTrackingFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ObjectTrackingFrame.Marshal(b, m, deterministic)
}
func (m *ObjectTrackingFrame) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ObjectTrackingFrame.Merge(m, src)
}
func (m *ObjectTrackingFrame) XXX_Size() int {
	return xxx_messageInfo_ObjectTrackingFrame.Size(m)
}
func (m *ObjectTrackingFrame) XXX_DiscardUnknown() {
	xxx_messageInfo_ObjectTrackingFrame.DiscardUnknown(m)
}

var xxx_messageInfo_ObjectTrackingFrame proto.InternalMessageInfo

func (m *ObjectTrackingFrame) GetNormalizedBoundingBox() *NormalizedBoundingBox {
	if m != nil {
		return m.NormalizedBoundingBox
	}
	return nil
}

func (m *ObjectTrackingFrame) GetTimeOffset() *duration.Duration {
	if m != nil {
		return m.TimeOffset
	}
	return nil
}

// Annotations corresponding to one tracked object.
type ObjectTrackingAnnotation struct {
	// Entity to specify the object category that this track is labeled as.
	Entity *Entity `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"`
	// Object category's labeling confidence of this track.
	Confidence float32 `protobuf:"fixed32,4,opt,name=confidence,proto3" json:"confidence,omitempty"`
	// Information corresponding to all frames where this object track appears.
	// Non-streaming batch mode: it may be one or multiple ObjectTrackingFrame
	// messages in frames.
	// Streaming mode: it can only be one ObjectTrackingFrame message in frames.
	Frames []*ObjectTrackingFrame `protobuf:"bytes,2,rep,name=frames,proto3" json:"frames,omitempty"`
	// Different representation of tracking info in non-streaming batch
	// and streaming modes.
	//
	// Types that are valid to be assigned to TrackInfo:
	//	*ObjectTrackingAnnotation_Segment
	//	*ObjectTrackingAnnotation_TrackId
	TrackInfo            isObjectTrackingAnnotation_TrackInfo `protobuf_oneof:"track_info"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *ObjectTrackingAnnotation) Reset()         { *m = ObjectTrackingAnnotation{} }
func (m *ObjectTrackingAnnotation) String() string { return proto.CompactTextString(m) }
func (*ObjectTrackingAnnotation) ProtoMessage()    {}
func (*ObjectTrackingAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{41}
}

func (m *ObjectTrackingAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ObjectTrackingAnnotation.Unmarshal(m, b)
}
func (m *ObjectTrackingAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ObjectTrackingAnnotation.Marshal(b, m, deterministic)
}
func (m *ObjectTrackingAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ObjectTrackingAnnotation.Merge(m, src)
}
func (m *ObjectTrackingAnnotation) XXX_Size() int {
	return xxx_messageInfo_ObjectTrackingAnnotation.Size(m)
}
func (m *ObjectTrackingAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_ObjectTrackingAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_ObjectTrackingAnnotation proto.InternalMessageInfo

func (m *ObjectTrackingAnnotation) GetEntity() *Entity {
	if m != nil {
		return m.Entity
	}
	return nil
}

func (m *ObjectTrackingAnnotation) GetConfidence() float32 {
	if m != nil {
		return m.Confidence
	}
	return 0
}

func (m *ObjectTrackingAnnotation) GetFrames() []*ObjectTrackingFrame {
	if m != nil {
		return m.Frames
	}
	return nil
}

type isObjectTrackingAnnotation_TrackInfo interface {
	isObjectTrackingAnnotation_TrackInfo()
}

type ObjectTrackingAnnotation_Segment struct {
	Segment *VideoSegment `protobuf:"bytes,3,opt,name=segment,proto3,oneof"`
}

type ObjectTrackingAnnotation_TrackId struct {
	TrackId int64 `protobuf:"varint,5,opt,name=track_id,json=trackId,proto3,oneof"`
}

func (*ObjectTrackingAnnotation_Segment) isObjectTrackingAnnotation_TrackInfo() {}

func (*ObjectTrackingAnnotation_TrackId) isObjectTrackingAnnotation_TrackInfo() {}

func (m *ObjectTrackingAnnotation) GetTrackInfo() isObjectTrackingAnnotation_TrackInfo {
	if m != nil {
		return m.TrackInfo
	}
	return nil
}

func (m *ObjectTrackingAnnotation) GetSegment() *VideoSegment {
	if x, ok := m.GetTrackInfo().(*ObjectTrackingAnnotation_Segment); ok {
		return x.Segment
	}
	return nil
}

func (m *ObjectTrackingAnnotation) GetTrackId() int64 {
	if x, ok := m.GetTrackInfo().(*ObjectTrackingAnnotation_TrackId); ok {
		return x.TrackId
	}
	return 0
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ObjectTrackingAnnotation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ObjectTrackingAnnotation_Segment)(nil),
		(*ObjectTrackingAnnotation_TrackId)(nil),
	}
}

// Annotation corresponding to one detected, tracked and recognized logo class.
type LogoRecognitionAnnotation struct {
	// Entity category information to specify the logo class that all the logo
	// tracks within this LogoRecognitionAnnotation are recognized as.
	Entity *Entity `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"`
	// All logo tracks where the recognized logo appears. Each track corresponds
	// to one logo instance appearing in consecutive frames.
	Tracks []*Track `protobuf:"bytes,2,rep,name=tracks,proto3" json:"tracks,omitempty"`
	// All video segments where the recognized logo appears. There might be
	// multiple instances of the same logo class appearing in one VideoSegment.
	Segments             []*VideoSegment `protobuf:"bytes,3,rep,name=segments,proto3" json:"segments,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *LogoRecognitionAnnotation) Reset()         { *m = LogoRecognitionAnnotation{} }
func (m *LogoRecognitionAnnotation) String() string { return proto.CompactTextString(m) }
func (*LogoRecognitionAnnotation) ProtoMessage()    {}
func (*LogoRecognitionAnnotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{42}
}

func (m *LogoRecognitionAnnotation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogoRecognitionAnnotation.Unmarshal(m, b)
}
func (m *LogoRecognitionAnnotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogoRecognitionAnnotation.Marshal(b, m, deterministic)
}
func (m *LogoRecognitionAnnotation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogoRecognitionAnnotation.Merge(m, src)
}
func (m *LogoRecognitionAnnotation) XXX_Size() int {
	return xxx_messageInfo_LogoRecognitionAnnotation.Size(m)
}
func (m *LogoRecognitionAnnotation) XXX_DiscardUnknown() {
	xxx_messageInfo_LogoRecognitionAnnotation.DiscardUnknown(m)
}

var xxx_messageInfo_LogoRecognitionAnnotation proto.InternalMessageInfo

func (m *LogoRecognitionAnnotation) GetEntity() *Entity {
	if m != nil {
		return m.Entity
	}
	return nil
}

func (m *LogoRecognitionAnnotation) GetTracks() []*Track {
	if m != nil {
		return m.Tracks
	}
	return nil
}

func (m *LogoRecognitionAnnotation) GetSegments() []*VideoSegment {
	if m != nil {
		return m.Segments
	}
	return nil
}

// The top-level message sent by the client for the `StreamingAnnotateVideo`
// method. Multiple `StreamingAnnotateVideoRequest` messages are sent.
// The first message must only contain a `StreamingVideoConfig` message.
// All subsequent messages must only contain `input_content` data.
type StreamingAnnotateVideoRequest struct {
	// *Required* The streaming request, which is either a streaming config or
	// video content.
	//
	// Types that are valid to be assigned to StreamingRequest:
	//	*StreamingAnnotateVideoRequest_VideoConfig
	//	*StreamingAnnotateVideoRequest_InputContent
	StreamingRequest     isStreamingAnnotateVideoRequest_StreamingRequest `protobuf_oneof:"streaming_request"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

func (m *StreamingAnnotateVideoRequest) Reset()         { *m = StreamingAnnotateVideoRequest{} }
func (m *StreamingAnnotateVideoRequest) String() string { return proto.CompactTextString(m) }
func (*StreamingAnnotateVideoRequest) ProtoMessage()    {}
func (*StreamingAnnotateVideoRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{43}
}

func (m *StreamingAnnotateVideoRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingAnnotateVideoRequest.Unmarshal(m, b)
}
func (m *StreamingAnnotateVideoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingAnnotateVideoRequest.Marshal(b, m, deterministic)
}
func (m *StreamingAnnotateVideoRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingAnnotateVideoRequest.Merge(m, src)
}
func (m *StreamingAnnotateVideoRequest) XXX_Size() int {
	return xxx_messageInfo_StreamingAnnotateVideoRequest.Size(m)
}
func (m *StreamingAnnotateVideoRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingAnnotateVideoRequest.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingAnnotateVideoRequest proto.InternalMessageInfo

type isStreamingAnnotateVideoRequest_StreamingRequest interface {
	isStreamingAnnotateVideoRequest_StreamingRequest()
}

type StreamingAnnotateVideoRequest_VideoConfig struct {
	VideoConfig *StreamingVideoConfig `protobuf:"bytes,1,opt,name=video_config,json=videoConfig,proto3,oneof"`
}

type StreamingAnnotateVideoRequest_InputContent struct {
	InputContent []byte `protobuf:"bytes,2,opt,name=input_content,json=inputContent,proto3,oneof"`
}

func (*StreamingAnnotateVideoRequest_VideoConfig) isStreamingAnnotateVideoRequest_StreamingRequest() {}

func (*StreamingAnnotateVideoRequest_InputContent) isStreamingAnnotateVideoRequest_StreamingRequest() {
}

func (m *StreamingAnnotateVideoRequest) GetStreamingRequest() isStreamingAnnotateVideoRequest_StreamingRequest {
	if m != nil {
		return m.StreamingRequest
	}
	return nil
}

func (m *StreamingAnnotateVideoRequest) GetVideoConfig() *StreamingVideoConfig {
	if x, ok := m.GetStreamingRequest().(*StreamingAnnotateVideoRequest_VideoConfig); ok {
		return x.VideoConfig
	}
	return nil
}

func (m *StreamingAnnotateVideoRequest) GetInputContent() []byte {
	if x, ok := m.GetStreamingRequest().(*StreamingAnnotateVideoRequest_InputContent); ok {
		return x.InputContent
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*StreamingAnnotateVideoRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*StreamingAnnotateVideoRequest_VideoConfig)(nil),
		(*StreamingAnnotateVideoRequest_InputContent)(nil),
	}
}

// `StreamingAnnotateVideoResponse` is the only message returned to the client
// by `StreamingAnnotateVideo`. A series of zero or more
// `StreamingAnnotateVideoResponse` messages are streamed back to the client.
type StreamingAnnotateVideoResponse struct {
	// If set, returns a [google.rpc.Status][google.rpc.Status] message that
	// specifies the error for the operation.
	Error *status.Status `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"`
	// Streaming annotation results.
	AnnotationResults *StreamingVideoAnnotationResults `protobuf:"bytes,2,opt,name=annotation_results,json=annotationResults,proto3" json:"annotation_results,omitempty"`
	// GCS URI that stores annotation results of one streaming session.
	// It is a directory that can hold multiple files in JSON format.
	// Example uri format:
	// gs://bucket_id/object_id/cloud_project_name-session_id
	AnnotationResultsUri string   `protobuf:"bytes,3,opt,name=annotation_results_uri,json=annotationResultsUri,proto3" json:"annotation_results_uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingAnnotateVideoResponse) Reset()         { *m = StreamingAnnotateVideoResponse{} }
func (m *StreamingAnnotateVideoResponse) String() string { return proto.CompactTextString(m) }
func (*StreamingAnnotateVideoResponse) ProtoMessage()    {}
func (*StreamingAnnotateVideoResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{44}
}

func (m *StreamingAnnotateVideoResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingAnnotateVideoResponse.Unmarshal(m, b)
}
func (m *StreamingAnnotateVideoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingAnnotateVideoResponse.Marshal(b, m, deterministic)
}
func (m *StreamingAnnotateVideoResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingAnnotateVideoResponse.Merge(m, src)
}
func (m *StreamingAnnotateVideoResponse) XXX_Size() int {
	return xxx_messageInfo_StreamingAnnotateVideoResponse.Size(m)
}
func (m *StreamingAnnotateVideoResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingAnnotateVideoResponse.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingAnnotateVideoResponse proto.InternalMessageInfo

func (m *StreamingAnnotateVideoResponse) GetError() *status.Status {
	if m != nil {
		return m.Error
	}
	return nil
}

func (m *StreamingAnnotateVideoResponse) GetAnnotationResults() *StreamingVideoAnnotationResults {
	if m != nil {
		return m.AnnotationResults
	}
	return nil
}

func (m *StreamingAnnotateVideoResponse) GetAnnotationResultsUri() string {
	if m != nil {
		return m.AnnotationResultsUri
	}
	return ""
}

// Config for STREAMING_AUTOML_CLASSIFICATION.
type StreamingAutomlClassificationConfig struct {
	// Resource name of AutoML model.
	// Format: `projects/{project_id}/locations/{location_id}/models/{model_id}`
	ModelName            string   `protobuf:"bytes,1,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingAutomlClassificationConfig) Reset()         { *m = StreamingAutomlClassificationConfig{} }
func (m *StreamingAutomlClassificationConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingAutomlClassificationConfig) ProtoMessage()    {}
func (*StreamingAutomlClassificationConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{45}
}

func (m *StreamingAutomlClassificationConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingAutomlClassificationConfig.Unmarshal(m, b)
}
func (m *StreamingAutomlClassificationConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingAutomlClassificationConfig.Marshal(b, m, deterministic)
}
func (m *StreamingAutomlClassificationConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingAutomlClassificationConfig.Merge(m, src)
}
func (m *StreamingAutomlClassificationConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingAutomlClassificationConfig.Size(m)
}
func (m *StreamingAutomlClassificationConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingAutomlClassificationConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingAutomlClassificationConfig proto.InternalMessageInfo

func (m *StreamingAutomlClassificationConfig) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

// Config for STREAMING_AUTOML_OBJECT_TRACKING.
type StreamingAutomlObjectTrackingConfig struct {
	// Resource name of AutoML model.
	// Format: `projects/{project_id}/locations/{location_id}/models/{model_id}`
	ModelName            string   `protobuf:"bytes,1,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingAutomlObjectTrackingConfig) Reset()         { *m = StreamingAutomlObjectTrackingConfig{} }
func (m *StreamingAutomlObjectTrackingConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingAutomlObjectTrackingConfig) ProtoMessage()    {}
func (*StreamingAutomlObjectTrackingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{46}
}

func (m *StreamingAutomlObjectTrackingConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingAutomlObjectTrackingConfig.Unmarshal(m, b)
}
func (m *StreamingAutomlObjectTrackingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingAutomlObjectTrackingConfig.Marshal(b, m, deterministic)
}
func (m *StreamingAutomlObjectTrackingConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingAutomlObjectTrackingConfig.Merge(m, src)
}
func (m *StreamingAutomlObjectTrackingConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingAutomlObjectTrackingConfig.Size(m)
}
func (m *StreamingAutomlObjectTrackingConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingAutomlObjectTrackingConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingAutomlObjectTrackingConfig proto.InternalMessageInfo

func (m *StreamingAutomlObjectTrackingConfig) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

// Config for STREAMING_EXPLICIT_CONTENT_DETECTION.
type StreamingExplicitContentDetectionConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingExplicitContentDetectionConfig) Reset() {
	*m = StreamingExplicitContentDetectionConfig{}
}
func (m *StreamingExplicitContentDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingExplicitContentDetectionConfig) ProtoMessage()    {}
func (*StreamingExplicitContentDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{47}
}

func (m *StreamingExplicitContentDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingExplicitContentDetectionConfig.Unmarshal(m, b)
}
func (m *StreamingExplicitContentDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingExplicitContentDetectionConfig.Marshal(b, m, deterministic)
}
func (m *StreamingExplicitContentDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingExplicitContentDetectionConfig.Merge(m, src)
}
func (m *StreamingExplicitContentDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingExplicitContentDetectionConfig.Size(m)
}
func (m *StreamingExplicitContentDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingExplicitContentDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingExplicitContentDetectionConfig proto.InternalMessageInfo

// Config for STREAMING_LABEL_DETECTION.
type StreamingLabelDetectionConfig struct {
	// Whether the video has been captured from a stationary (i.e. non-moving)
	// camera. When set to true, might improve detection accuracy for moving
	// objects. Default: false.
	StationaryCamera     bool     `protobuf:"varint,1,opt,name=stationary_camera,json=stationaryCamera,proto3" json:"stationary_camera,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingLabelDetectionConfig) Reset()         { *m = StreamingLabelDetectionConfig{} }
func (m *StreamingLabelDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingLabelDetectionConfig) ProtoMessage()    {}
func (*StreamingLabelDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{48}
}

func (m *StreamingLabelDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingLabelDetectionConfig.Unmarshal(m, b)
}
func (m *StreamingLabelDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingLabelDetectionConfig.Marshal(b, m, deterministic)
}
func (m *StreamingLabelDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingLabelDetectionConfig.Merge(m, src)
}
func (m *StreamingLabelDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingLabelDetectionConfig.Size(m)
}
func (m *StreamingLabelDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingLabelDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingLabelDetectionConfig proto.InternalMessageInfo

func (m *StreamingLabelDetectionConfig) GetStationaryCamera() bool {
	if m != nil {
		return m.StationaryCamera
	}
	return false
}

// Config for STREAMING_OBJECT_TRACKING.
type StreamingObjectTrackingConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingObjectTrackingConfig) Reset()         { *m = StreamingObjectTrackingConfig{} }
func (m *StreamingObjectTrackingConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingObjectTrackingConfig) ProtoMessage()    {}
func (*StreamingObjectTrackingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{49}
}

func (m *StreamingObjectTrackingConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingObjectTrackingConfig.Unmarshal(m, b)
}
func (m *StreamingObjectTrackingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingObjectTrackingConfig.Marshal(b, m, deterministic)
}
func (m *StreamingObjectTrackingConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingObjectTrackingConfig.Merge(m, src)
}
func (m *StreamingObjectTrackingConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingObjectTrackingConfig.Size(m)
}
func (m *StreamingObjectTrackingConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingObjectTrackingConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingObjectTrackingConfig proto.InternalMessageInfo

// Config for STREAMING_SHOT_CHANGE_DETECTION.
type StreamingShotChangeDetectionConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StreamingShotChangeDetectionConfig) Reset()         { *m = StreamingShotChangeDetectionConfig{} }
func (m *StreamingShotChangeDetectionConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingShotChangeDetectionConfig) ProtoMessage()    {}
func (*StreamingShotChangeDetectionConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{50}
}

func (m *StreamingShotChangeDetectionConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingShotChangeDetectionConfig.Unmarshal(m, b)
}
func (m *StreamingShotChangeDetectionConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingShotChangeDetectionConfig.Marshal(b, m, deterministic)
}
func (m *StreamingShotChangeDetectionConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingShotChangeDetectionConfig.Merge(m, src)
}
func (m *StreamingShotChangeDetectionConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingShotChangeDetectionConfig.Size(m)
}
func (m *StreamingShotChangeDetectionConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingShotChangeDetectionConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingShotChangeDetectionConfig proto.InternalMessageInfo

// Config for streaming storage option.
type StreamingStorageConfig struct {
	// Enable streaming storage. Default: false.
	EnableStorageAnnotationResult bool `protobuf:"varint,1,opt,name=enable_storage_annotation_result,json=enableStorageAnnotationResult,proto3" json:"enable_storage_annotation_result,omitempty"`
	// GCS URI to store all annotation results for one client. Client should
	// specify this field as the top-level storage directory. Annotation results
	// of different sessions will be put into different sub-directories denoted
	// by project_name and session_id. All sub-directories will be auto generated
	// by program and will be made accessible to client in response proto.
	// URIs must be specified in the following format: `gs://bucket-id/object-id`
	// `bucket-id` should be a valid GCS bucket created by client and bucket
	// permission shall also be configured properly. `object-id` can be arbitrary
	// string that make sense to client. Other URI formats will return error and
	// cause GCS write failure.
	AnnotationResultStorageDirectory string   `protobuf:"bytes,3,opt,name=annotation_result_storage_directory,json=annotationResultStorageDirectory,proto3" json:"annotation_result_storage_directory,omitempty"`
	XXX_NoUnkeyedLiteral             struct{} `json:"-"`
	XXX_unrecognized                 []byte   `json:"-"`
	XXX_sizecache                    int32    `json:"-"`
}

func (m *StreamingStorageConfig) Reset()         { *m = StreamingStorageConfig{} }
func (m *StreamingStorageConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingStorageConfig) ProtoMessage()    {}
func (*StreamingStorageConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{51}
}

func (m *StreamingStorageConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingStorageConfig.Unmarshal(m, b)
}
func (m *StreamingStorageConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingStorageConfig.Marshal(b, m, deterministic)
}
func (m *StreamingStorageConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingStorageConfig.Merge(m, src)
}
func (m *StreamingStorageConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingStorageConfig.Size(m)
}
func (m *StreamingStorageConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingStorageConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingStorageConfig proto.InternalMessageInfo

func (m *StreamingStorageConfig) GetEnableStorageAnnotationResult() bool {
	if m != nil {
		return m.EnableStorageAnnotationResult
	}
	return false
}

func (m *StreamingStorageConfig) GetAnnotationResultStorageDirectory() string {
	if m != nil {
		return m.AnnotationResultStorageDirectory
	}
	return ""
}

// Streaming annotation results corresponding to a portion of the video
// that is currently being processed.
type StreamingVideoAnnotationResults struct {
	// Shot annotation results. Each shot is represented as a video segment.
	ShotAnnotations []*VideoSegment `protobuf:"bytes,1,rep,name=shot_annotations,json=shotAnnotations,proto3" json:"shot_annotations,omitempty"`
	// Label annotation results.
	LabelAnnotations []*LabelAnnotation `protobuf:"bytes,2,rep,name=label_annotations,json=labelAnnotations,proto3" json:"label_annotations,omitempty"`
	// Explicit content annotation results.
	ExplicitAnnotation *ExplicitContentAnnotation `protobuf:"bytes,3,opt,name=explicit_annotation,json=explicitAnnotation,proto3" json:"explicit_annotation,omitempty"`
	// Object tracking results.
	ObjectAnnotations    []*ObjectTrackingAnnotation `protobuf:"bytes,4,rep,name=object_annotations,json=objectAnnotations,proto3" json:"object_annotations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *StreamingVideoAnnotationResults) Reset()         { *m = StreamingVideoAnnotationResults{} }
func (m *StreamingVideoAnnotationResults) String() string { return proto.CompactTextString(m) }
func (*StreamingVideoAnnotationResults) ProtoMessage()    {}
func (*StreamingVideoAnnotationResults) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{52}
}

func (m *StreamingVideoAnnotationResults) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingVideoAnnotationResults.Unmarshal(m, b)
}
func (m *StreamingVideoAnnotationResults) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingVideoAnnotationResults.Marshal(b, m, deterministic)
}
func (m *StreamingVideoAnnotationResults) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingVideoAnnotationResults.Merge(m, src)
}
func (m *StreamingVideoAnnotationResults) XXX_Size() int {
	return xxx_messageInfo_StreamingVideoAnnotationResults.Size(m)
}
func (m *StreamingVideoAnnotationResults) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingVideoAnnotationResults.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingVideoAnnotationResults proto.InternalMessageInfo

func (m *StreamingVideoAnnotationResults) GetShotAnnotations() []*VideoSegment {
	if m != nil {
		return m.ShotAnnotations
	}
	return nil
}

func (m *StreamingVideoAnnotationResults) GetLabelAnnotations() []*LabelAnnotation {
	if m != nil {
		return m.LabelAnnotations
	}
	return nil
}

func (m *StreamingVideoAnnotationResults) GetExplicitAnnotation() *ExplicitContentAnnotation {
	if m != nil {
		return m.ExplicitAnnotation
	}
	return nil
}

func (m *StreamingVideoAnnotationResults) GetObjectAnnotations() []*ObjectTrackingAnnotation {
	if m != nil {
		return m.ObjectAnnotations
	}
	return nil
}

// Provides information to the annotator that specifies how to process the
// request.
type StreamingVideoConfig struct {
	// Requested annotation feature.
	Feature StreamingFeature `protobuf:"varint,1,opt,name=feature,proto3,enum=google.cloud.videointelligence.v1p3beta1.StreamingFeature" json:"feature,omitempty"`
	// Config for requested annotation feature.
	//
	// Types that are valid to be assigned to StreamingConfig:
	//	*StreamingVideoConfig_ShotChangeDetectionConfig
	//	*StreamingVideoConfig_LabelDetectionConfig
	//	*StreamingVideoConfig_ExplicitContentDetectionConfig
	//	*StreamingVideoConfig_ObjectTrackingConfig
	//	*StreamingVideoConfig_AutomlClassificationConfig
	//	*StreamingVideoConfig_AutomlObjectTrackingConfig
	StreamingConfig isStreamingVideoConfig_StreamingConfig `protobuf_oneof:"streaming_config"`
	// Streaming storage option. By default: storage is disabled.
	StorageConfig        *StreamingStorageConfig `protobuf:"bytes,30,opt,name=storage_config,json=storageConfig,proto3" json:"storage_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *StreamingVideoConfig) Reset()         { *m = StreamingVideoConfig{} }
func (m *StreamingVideoConfig) String() string { return proto.CompactTextString(m) }
func (*StreamingVideoConfig) ProtoMessage()    {}
func (*StreamingVideoConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_06234ac6e4dad78c, []int{53}
}

func (m *StreamingVideoConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StreamingVideoConfig.Unmarshal(m, b)
}
func (m *StreamingVideoConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StreamingVideoConfig.Marshal(b, m, deterministic)
}
func (m *StreamingVideoConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StreamingVideoConfig.Merge(m, src)
}
func (m *StreamingVideoConfig) XXX_Size() int {
	return xxx_messageInfo_StreamingVideoConfig.Size(m)
}
func (m *StreamingVideoConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_StreamingVideoConfig.DiscardUnknown(m)
}

var xxx_messageInfo_StreamingVideoConfig proto.InternalMessageInfo

func (m *StreamingVideoConfig) GetFeature() StreamingFeature {
	if m != nil {
		return m.Feature
	}
	return StreamingFeature_STREAMING_FEATURE_UNSPECIFIED
}

type isStreamingVideoConfig_StreamingConfig interface {
	isStreamingVideoConfig_StreamingConfig()
}

type StreamingVideoConfig_ShotChangeDetectionConfig struct {
	ShotChangeDetectionConfig *StreamingShotChangeDetectionConfig `protobuf:"bytes,2,opt,name=shot_change_detection_config,json=shotChangeDetectionConfig,proto3,oneof"`
}

type StreamingVideoConfig_LabelDetectionConfig struct {
	LabelDetectionConfig *StreamingLabelDetectionConfig `protobuf:"bytes,3,opt,name=label_detection_config,json=labelDetectionConfig,proto3,oneof"`
}

type StreamingVideoConfig_ExplicitContentDetectionConfig struct {
	ExplicitContentDetectionConfig *StreamingExplicitContentDetectionConfig `protobuf:"bytes,4,opt,name=explicit_content_detection_config,json=explicitContentDetectionConfig,proto3,oneof"`
}

type StreamingVideoConfig_ObjectTrackingConfig struct {
	ObjectTrackingConfig *StreamingObjectTrackingConfig `protobuf:"bytes,5,opt,name=object_tracking_config,json=objectTrackingConfig,proto3,oneof"`
}

type StreamingVideoConfig_AutomlClassificationConfig struct {
	AutomlClassificationConfig *StreamingAutomlClassificationConfig `protobuf:"bytes,21,opt,name=automl_classification_config,json=automlClassificationConfig,proto3,oneof"`
}

type StreamingVideoConfig_AutomlObjectTrackingConfig struct {
	AutomlObjectTrackingConfig *StreamingAutomlObjectTrackingConfig `protobuf:"bytes,22,opt,name=automl_object_tracking_config,json=automlObjectTrackingConfig,proto3,oneof"`
}

func (*StreamingVideoConfig_ShotChangeDetectionConfig) isStreamingVideoConfig_StreamingConfig() {}

func (*StreamingVideoConfig_LabelDetectionConfig) isStreamingVideoConfig_StreamingConfig() {}

func (*StreamingVideoConfig_ExplicitContentDetectionConfig) isStreamingVideoConfig_StreamingConfig() {}

func (*StreamingVideoConfig_ObjectTrackingConfig) isStreamingVideoConfig_StreamingConfig() {}

func (*StreamingVideoConfig_AutomlClassificationConfig) isStreamingVideoConfig_StreamingConfig() {}

func (*StreamingVideoConfig_AutomlObjectTrackingConfig) isStreamingVideoConfig_StreamingConfig() {}

func (m *StreamingVideoConfig) GetStreamingConfig() isStreamingVideoConfig_StreamingConfig {
	if m != nil {
		return m.StreamingConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetShotChangeDetectionConfig() *StreamingShotChangeDetectionConfig {
	if x, ok := m.GetStreamingConfig().(*StreamingVideoConfig_ShotChangeDetectionConfig); ok {
		return x.ShotChangeDetectionConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetLabelDetectionConfig() *StreamingLabelDetectionConfig {
	if x, ok := m.GetStreamingConfig().(*StreamingVideoConfig_LabelDetectionConfig); ok {
		return x.LabelDetectionConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetExplicitContentDetectionConfig() *StreamingExplicitContentDetectionConfig {
	if x, ok := m.GetStreamingConfig().(*StreamingVideoConfig_ExplicitContentDetectionConfig); ok {
		return x.ExplicitContentDetectionConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetObjectTrackingConfig() *StreamingObjectTrackingConfig {
	if x, ok := m.GetStreamingConfig().(*StreamingVideoConfig_ObjectTrackingConfig); ok {
		return x.ObjectTrackingConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetAutomlClassificationConfig() *StreamingAutomlClassificationConfig {
	if x, ok := m.GetStreamingConfig().(*StreamingVideoConfig_AutomlClassificationConfig); ok {
		return x.AutomlClassificationConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetAutomlObjectTrackingConfig() *StreamingAutomlObjectTrackingConfig {
	if x, ok := m.GetStreamingConfig().(*StreamingVideoConfig_AutomlObjectTrackingConfig); ok {
		return x.AutomlObjectTrackingConfig
	}
	return nil
}

func (m *StreamingVideoConfig) GetStorageConfig() *StreamingStorageConfig {
	if m != nil {
		return m.StorageConfig
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*StreamingVideoConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*StreamingVideoConfig_ShotChangeDetectionConfig)(nil),
		(*StreamingVideoConfig_LabelDetectionConfig)(nil),
		(*StreamingVideoConfig_ExplicitContentDetectionConfig)(nil),
		(*StreamingVideoConfig_ObjectTrackingConfig)(nil),
		(*StreamingVideoConfig_AutomlClassificationConfig)(nil),
		(*StreamingVideoConfig_AutomlObjectTrackingConfig)(nil),
	}
}

func init() {
	proto.RegisterEnum("google.cloud.videointelligence.v1p3beta1.Feature", Feature_name, Feature_value)
	proto.RegisterEnum("google.cloud.videointelligence.v1p3beta1.LabelDetectionMode", LabelDetectionMode_name, LabelDetectionMode_value)
	proto.RegisterEnum("google.cloud.videointelligence.v1p3beta1.Likelihood", Likelihood_name, Likelihood_value)
	proto.RegisterEnum("google.cloud.videointelligence.v1p3beta1.StreamingFeature", StreamingFeature_name, StreamingFeature_value)
	proto.RegisterType((*AnnotateVideoRequest)(nil), "google.cloud.videointelligence.v1p3beta1.AnnotateVideoRequest")
	proto.RegisterType((*VideoContext)(nil), "google.cloud.videointelligence.v1p3beta1.VideoContext")
	proto.RegisterType((*LabelDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.LabelDetectionConfig")
	proto.RegisterType((*ShotChangeDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.ShotChangeDetectionConfig")
	proto.RegisterType((*ObjectTrackingConfig)(nil), "google.cloud.videointelligence.v1p3beta1.ObjectTrackingConfig")
	proto.RegisterType((*ExplicitContentDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.ExplicitContentDetectionConfig")
	proto.RegisterType((*FaceDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.FaceDetectionConfig")
	proto.RegisterType((*PersonDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.PersonDetectionConfig")
	proto.RegisterType((*TextDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.TextDetectionConfig")
	proto.RegisterType((*VideoSegment)(nil), "google.cloud.videointelligence.v1p3beta1.VideoSegment")
	proto.RegisterType((*LabelSegment)(nil), "google.cloud.videointelligence.v1p3beta1.LabelSegment")
	proto.RegisterType((*LabelFrame)(nil), "google.cloud.videointelligence.v1p3beta1.LabelFrame")
	proto.RegisterType((*Entity)(nil), "google.cloud.videointelligence.v1p3beta1.Entity")
	proto.RegisterType((*LabelAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.LabelAnnotation")
	proto.RegisterType((*ExplicitContentFrame)(nil), "google.cloud.videointelligence.v1p3beta1.ExplicitContentFrame")
	proto.RegisterType((*ExplicitContentAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.ExplicitContentAnnotation")
	proto.RegisterType((*NormalizedBoundingBox)(nil), "google.cloud.videointelligence.v1p3beta1.NormalizedBoundingBox")
	proto.RegisterType((*TimestampedObject)(nil), "google.cloud.videointelligence.v1p3beta1.TimestampedObject")
	proto.RegisterType((*Track)(nil), "google.cloud.videointelligence.v1p3beta1.Track")
	proto.RegisterType((*DetectedAttribute)(nil), "google.cloud.videointelligence.v1p3beta1.DetectedAttribute")
	proto.RegisterType((*Celebrity)(nil), "google.cloud.videointelligence.v1p3beta1.Celebrity")
	proto.RegisterType((*CelebrityTrack)(nil), "google.cloud.videointelligence.v1p3beta1.CelebrityTrack")
	proto.RegisterType((*CelebrityTrack_RecognizedCelebrity)(nil), "google.cloud.videointelligence.v1p3beta1.CelebrityTrack.RecognizedCelebrity")
	proto.RegisterType((*CelebrityRecognitionAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.CelebrityRecognitionAnnotation")
	proto.RegisterType((*DetectedLandmark)(nil), "google.cloud.videointelligence.v1p3beta1.DetectedLandmark")
	proto.RegisterType((*FaceDetectionAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.FaceDetectionAnnotation")
	proto.RegisterType((*PersonDetectionAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.PersonDetectionAnnotation")
	proto.RegisterType((*VideoAnnotationResults)(nil), "google.cloud.videointelligence.v1p3beta1.VideoAnnotationResults")
	proto.RegisterType((*AnnotateVideoResponse)(nil), "google.cloud.videointelligence.v1p3beta1.AnnotateVideoResponse")
	proto.RegisterType((*VideoAnnotationProgress)(nil), "google.cloud.videointelligence.v1p3beta1.VideoAnnotationProgress")
	proto.RegisterType((*AnnotateVideoProgress)(nil), "google.cloud.videointelligence.v1p3beta1.AnnotateVideoProgress")
	proto.RegisterType((*SpeechTranscriptionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.SpeechTranscriptionConfig")
	proto.RegisterType((*SpeechContext)(nil), "google.cloud.videointelligence.v1p3beta1.SpeechContext")
	proto.RegisterType((*SpeechTranscription)(nil), "google.cloud.videointelligence.v1p3beta1.SpeechTranscription")
	proto.RegisterType((*SpeechRecognitionAlternative)(nil), "google.cloud.videointelligence.v1p3beta1.SpeechRecognitionAlternative")
	proto.RegisterType((*WordInfo)(nil), "google.cloud.videointelligence.v1p3beta1.WordInfo")
	proto.RegisterType((*NormalizedVertex)(nil), "google.cloud.videointelligence.v1p3beta1.NormalizedVertex")
	proto.RegisterType((*NormalizedBoundingPoly)(nil), "google.cloud.videointelligence.v1p3beta1.NormalizedBoundingPoly")
	proto.RegisterType((*TextSegment)(nil), "google.cloud.videointelligence.v1p3beta1.TextSegment")
	proto.RegisterType((*TextFrame)(nil), "google.cloud.videointelligence.v1p3beta1.TextFrame")
	proto.RegisterType((*TextAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.TextAnnotation")
	proto.RegisterType((*ObjectTrackingFrame)(nil), "google.cloud.videointelligence.v1p3beta1.ObjectTrackingFrame")
	proto.RegisterType((*ObjectTrackingAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.ObjectTrackingAnnotation")
	proto.RegisterType((*LogoRecognitionAnnotation)(nil), "google.cloud.videointelligence.v1p3beta1.LogoRecognitionAnnotation")
	proto.RegisterType((*StreamingAnnotateVideoRequest)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingAnnotateVideoRequest")
	proto.RegisterType((*StreamingAnnotateVideoResponse)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingAnnotateVideoResponse")
	proto.RegisterType((*StreamingAutomlClassificationConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingAutomlClassificationConfig")
	proto.RegisterType((*StreamingAutomlObjectTrackingConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingAutomlObjectTrackingConfig")
	proto.RegisterType((*StreamingExplicitContentDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingExplicitContentDetectionConfig")
	proto.RegisterType((*StreamingLabelDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingLabelDetectionConfig")
	proto.RegisterType((*StreamingObjectTrackingConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingObjectTrackingConfig")
	proto.RegisterType((*StreamingShotChangeDetectionConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingShotChangeDetectionConfig")
	proto.RegisterType((*StreamingStorageConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingStorageConfig")
	proto.RegisterType((*StreamingVideoAnnotationResults)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingVideoAnnotationResults")
	proto.RegisterType((*StreamingVideoConfig)(nil), "google.cloud.videointelligence.v1p3beta1.StreamingVideoConfig")
}

func init() {
	proto.RegisterFile("google/cloud/videointelligence/v1p3beta1/video_intelligence.proto", fileDescriptor_06234ac6e4dad78c)
}

var fileDescriptor_06234ac6e4dad78c = []byte{
	// 3812 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3b, 0x4d, 0x73, 0x23, 0x59,
	0x52, 0x5d, 0x25, 0xdb, 0x6d, 0xa7, 0x65, 0x5b, 0x7e, 0x96, 0x6d, 0xd9, 0xd3, 0x76, 0xbb, 0xab,
	0x7b, 0xc1, 0xdb, 0xcc, 0xca, 0xdb, 0xdd, 0xc3, 0xb2, 0xd3, 0xb3, 0x5f, 0xb2, 0xac, 0xb6, 0xc5,
	0xa8, 0x6d, 0x4d, 0x59, 0xdd, 0xec, 0xc0, 0x4c, 0x14, 0xe5, 0xaa, 0x27, 0xb9, 0xb6, 0x4b, 0xf5,
	0x34, 0x55, 0xa5, 0x6e, 0x7b, 0x2f, 0x33, 0xb1, 0xb0, 0xc4, 0x12, 0x04, 0xc1, 0xc2, 0x72, 0xe0,
	0xc4, 0x0f, 0x80, 0x20, 0x02, 0xf6, 0x08, 0x07, 0xb8, 0x10, 0x44, 0x4c, 0x10, 0x1b, 0x04, 0x1b,
	0x1c, 0xd8, 0xe5, 0xc0, 0x01, 0xfe, 0x03, 0xc1, 0x89, 0x78, 0x1f, 0xf5, 0xa1, 0xaa, 0x92, 0x6d,
	0xc9, 0xdd, 0x10, 0xdc, 0x54, 0x99, 0xf9, 0x32, 0xf3, 0xe5, 0xcb, 0x97, 0x99, 0x2f, 0xdf, 0x13,
	0x54, 0x3a, 0x84, 0x74, 0x6c, 0xbc, 0x63, 0xd8, 0xa4, 0x6f, 0xee, 0xbc, 0xb4, 0x4c, 0x4c, 0x2c,
	0xc7, 0xc7, 0xb6, 0x6d, 0x75, 0xb0, 0x63, 0xe0, 0x9d, 0x97, 0x0f, 0x7a, 0x8f, 0x4e, 0xb0, 0xaf,
	0x3f, 0xe0, 0x38, 0x2d, 0x8e, 0x2c, 0xf7, 0x5c, 0xe2, 0x13, 0xb4, 0xcd, 0x59, 0x94, 0x19, 0x8b,
	0x72, 0x8a, 0x45, 0x39, 0x64, 0xb1, 0x7e, 0x4b, 0x08, 0xd3, 0x7b, 0xd6, 0x8e, 0xee, 0x38, 0xc4,
	0xd7, 0x7d, 0x8b, 0x38, 0x1e, 0xe7, 0xb3, 0xbe, 0x1a, 0xc3, 0x1a, 0xb6, 0x85, 0x1d, 0x5f, 0x20,
	0x6e, 0xc7, 0x10, 0x6d, 0x0b, 0xdb, 0xa6, 0x76, 0x82, 0x4f, 0xf5, 0x97, 0x16, 0x71, 0x05, 0xc1,
	0x5d, 0x41, 0x60, 0x13, 0xa7, 0xe3, 0xf6, 0x1d, 0xc7, 0x72, 0x3a, 0x3b, 0xa4, 0x87, 0xdd, 0x01,
	0xf6, 0x9b, 0x82, 0x88, 0x7d, 0x9d, 0xf4, 0xdb, 0x3b, 0x66, 0x9f, 0x13, 0x24, 0xa4, 0x84, 0x78,
	0xdf, 0xea, 0x62, 0xcf, 0xd7, 0xbb, 0xbd, 0x84, 0x7e, 0x6e, 0xcf, 0xd8, 0xf1, 0x7c, 0xdd, 0xef,
	0x0b, 0xce, 0xca, 0x4f, 0x65, 0x28, 0x56, 0xf8, 0x74, 0xf0, 0x73, 0x3a, 0x7d, 0x15, 0x7f, 0xd2,
	0xc7, 0x9e, 0x8f, 0xde, 0x82, 0x19, 0xcb, 0xe9, 0xf5, 0x7d, 0xad, 0xef, 0x5a, 0x25, 0x69, 0x4b,
	0xda, 0x9e, 0x51, 0xa7, 0x19, 0xe0, 0x99, 0x6b, 0xa1, 0xbb, 0x30, 0xc7, 0x91, 0x06, 0x71, 0x7c,
	0xec, 0xf8, 0xa5, 0xa9, 0x2d, 0x69, 0x3b, 0xaf, 0xe6, 0x19, 0xb0, 0xca, 0x61, 0x48, 0x85, 0xe9,
	0x36, 0xd6, 0xfd, 0xbe, 0x8b, 0xbd, 0x92, 0xbc, 0x95, 0xdb, 0x9e, 0x7f, 0xf8, 0xa0, 0x7c, 0x55,
	0x73, 0x97, 0x9f, 0xf0, 0x91, 0xbb, 0xb9, 0x7f, 0xaf, 0xc8, 0x6a, 0xc8, 0x07, 0xfd, 0x06, 0xcc,
	0xf1, 0xb5, 0x64, 0x82, 0xcf, 0xfc, 0x52, 0x6e, 0x4b, 0xda, 0x9e, 0x7d, 0xf8, 0x95, 0xab, 0x33,
	0x66, 0x93, 0xac, 0xf2, 0xd1, 0x6a, 0xfe, 0x65, 0xec, 0x0b, 0x29, 0x00, 0xa4, 0xef, 0x07, 0x73,
	0x9e, 0xa0, 0x73, 0xa6, 0xf2, 0x25, 0x75, 0x86, 0x83, 0xe9, 0xcc, 0xef, 0xc1, 0xac, 0x4d, 0x0c,
	0x66, 0x7b, 0xcd, 0x32, 0x4b, 0x93, 0x11, 0x11, 0x04, 0xf0, 0xba, 0xa9, 0xfc, 0xd3, 0x34, 0xe4,
	0xe3, 0x82, 0xa8, 0x2d, 0x3c, 0xdc, 0xe9, 0x62, 0xc7, 0xf7, 0x4a, 0xd2, 0x56, 0x6e, 0x0c, 0x95,
	0x8f, 0xf9, 0x70, 0x35, 0xe4, 0x83, 0x7c, 0x58, 0xb1, 0xf5, 0x13, 0x6c, 0x6b, 0x26, 0xf6, 0xb1,
	0xc1, 0x34, 0x32, 0x88, 0xd3, 0xb6, 0x3a, 0x25, 0x99, 0x19, 0xe5, 0x1b, 0x57, 0x97, 0xd0, 0xa0,
	0x7c, 0xf6, 0x02, 0x36, 0x55, 0xc6, 0x45, 0x2d, 0xda, 0x19, 0x50, 0xf4, 0xdb, 0x12, 0xdc, 0xf2,
	0x4e, 0x89, 0xaf, 0x19, 0xa7, 0xba, 0xd3, 0xc1, 0x69, 0xe1, 0x7c, 0x45, 0xaa, 0x57, 0x17, 0x7e,
	0x7c, 0x4a, 0xfc, 0x2a, 0x63, 0x96, 0xd4, 0x60, 0xcd, 0x1b, 0x86, 0x42, 0x3f, 0x92, 0xe0, 0x0e,
	0x3e, 0xeb, 0xd9, 0x96, 0x61, 0x85, 0x5e, 0x98, 0xd6, 0x65, 0x82, 0xe9, 0x72, 0x70, 0x75, 0x5d,
	0x6a, 0x82, 0xa5, 0xf0, 0xe1, 0xa4, 0x42, 0x9b, 0xf8, 0x42, 0x3c, 0xfa, 0x04, 0x96, 0xdb, 0xba,
	0x91, 0x61, 0x94, 0x49, 0xa6, 0xc8, 0xd7, 0x47, 0xf0, 0x7f, 0xdd, 0x48, 0x99, 0x63, 0xa9, 0x9d,
	0x06, 0xa2, 0xdf, 0x92, 0xe0, 0x2d, 0xaf, 0x87, 0xb1, 0x71, 0xaa, 0xf9, 0xae, 0xee, 0x78, 0x86,
	0x6b, 0xf5, 0xe2, 0x92, 0xa7, 0x46, 0x5e, 0x0e, 0xc6, 0xac, 0x15, 0xe7, 0x15, 0x2e, 0xc7, 0x30,
	0x14, 0x9d, 0x38, 0xf5, 0xf3, 0xf4, 0xc4, 0xa7, 0x47, 0x9d, 0x78, 0x0b, 0x9f, 0xa5, 0xcc, 0xbe,
	0xe4, 0xa7, 0x81, 0xe8, 0x15, 0xac, 0xf6, 0xb0, 0xeb, 0x11, 0x27, 0x2d, 0x74, 0x96, 0x09, 0xfd,
	0xe6, 0xd5, 0x85, 0x36, 0x19, 0xa3, 0xa4, 0xd8, 0xe5, 0x5e, 0x16, 0x98, 0xee, 0x3b, 0x72, 0xf2,
	0x1d, 0x6c, 0xf8, 0xd4, 0xe0, 0xc6, 0x0b, 0xcb, 0xe9, 0x04, 0x72, 0xe7, 0x46, 0xdd, 0x77, 0x47,
	0x8c, 0x4f, 0x4b, 0xb0, 0x09, 0xf6, 0x1d, 0xc9, 0x80, 0x2a, 0x7f, 0x2f, 0x43, 0x31, 0x6b, 0x9b,
	0x22, 0x07, 0x8a, 0xc9, 0x30, 0xd0, 0x25, 0x26, 0x66, 0x31, 0x7b, 0xfe, 0xe1, 0xd7, 0xc6, 0x0d,
	0x02, 0x4f, 0x89, 0x89, 0x55, 0x64, 0xa7, 0x60, 0xe8, 0x97, 0x60, 0xd1, 0xe3, 0xc9, 0x4f, 0x77,
	0xcf, 0x35, 0x43, 0xef, 0x62, 0x57, 0x67, 0x11, 0x67, 0x5a, 0x2d, 0x44, 0x88, 0x2a, 0x83, 0xa3,
	0x22, 0x4c, 0x52, 0x65, 0x6c, 0x16, 0x15, 0x66, 0x54, 0xfe, 0x81, 0xbe, 0x06, 0xeb, 0x6d, 0x57,
	0xef, 0x62, 0x6e, 0x37, 0x93, 0xea, 0xa1, 0xf9, 0xa7, 0x2e, 0xf6, 0x4e, 0x89, 0x6d, 0xb2, 0x4d,
	0x2b, 0xab, 0x25, 0x46, 0x51, 0x0d, 0x09, 0x5a, 0x01, 0x9e, 0x8e, 0x0e, 0x73, 0x40, 0x7a, 0xf4,
	0x24, 0x1f, 0x1d, 0x04, 0xf6, 0xe4, 0x68, 0xe5, 0x01, 0xac, 0x0d, 0x0d, 0x38, 0x91, 0xba, 0x52,
	0x4c, 0x5d, 0xe5, 0x6d, 0x28, 0x66, 0x2d, 0xd4, 0x10, 0xea, 0xaf, 0xc0, 0xe6, 0xc5, 0x51, 0x64,
	0xc8, 0xb8, 0x1f, 0x4a, 0xb0, 0x94, 0xb1, 0xeb, 0xb3, 0xa9, 0xd1, 0x3b, 0xb0, 0x62, 0x39, 0x86,
	0xdd, 0x37, 0xb1, 0x76, 0x42, 0xfa, 0x8e, 0x49, 0xbd, 0xf0, 0x84, 0x9c, 0xb1, 0x54, 0x4b, 0x97,
	0xa2, 0x28, 0xb0, 0xbb, 0x02, 0xb9, 0x4b, 0x71, 0xe8, 0x4b, 0x80, 0x82, 0x51, 0xba, 0xef, 0xbb,
	0xd6, 0x49, 0xdf, 0xc7, 0x1e, 0x33, 0xd9, 0xb4, 0xba, 0x28, 0x30, 0x95, 0x10, 0xa1, 0xfc, 0x58,
	0x82, 0xe5, 0xcc, 0xad, 0x71, 0x81, 0x78, 0xe9, 0x02, 0xf1, 0xb1, 0x51, 0x3d, 0xe2, 0x61, 0xcd,
	0xd6, 0x1d, 0xb3, 0xab, 0xbb, 0x2f, 0x92, 0x4a, 0x37, 0x89, 0x87, 0x1b, 0x01, 0x6e, 0x88, 0xd2,
	0xb9, 0x61, 0x4a, 0xab, 0xb0, 0x94, 0x11, 0x43, 0xd0, 0x17, 0x60, 0xde, 0xd6, 0x9d, 0x4e, 0x5f,
	0xef, 0x60, 0xed, 0xd4, 0x0a, 0xf2, 0xf0, 0x8c, 0x3a, 0x17, 0x40, 0x0f, 0x28, 0x30, 0xb2, 0xb6,
	0x1c, 0x5f, 0x9b, 0x3f, 0x91, 0x44, 0x3e, 0x17, 0x59, 0x18, 0xd5, 0xd8, 0x26, 0x70, 0x7d, 0x8d,
	0x16, 0x5a, 0x1a, 0x69, 0xb7, 0x3d, 0xec, 0xb3, 0xa9, 0xcf, 0x3e, 0x5c, 0x0b, 0x76, 0x5c, 0x50,
	0x8c, 0x95, 0xf7, 0x44, 0xb1, 0xa6, 0x2e, 0xb0, 0x31, 0x2d, 0xab, 0x8b, 0x8f, 0xd8, 0x08, 0x54,
	0x81, 0x05, 0xec, 0x98, 0x03, 0x4c, 0xe4, 0xcb, 0x98, 0xcc, 0x61, 0xc7, 0x8c, 0x58, 0x28, 0x9f,
	0x49, 0x90, 0x67, 0x3b, 0x37, 0x50, 0xad, 0x09, 0x37, 0x45, 0x89, 0x20, 0x14, 0x1a, 0xb7, 0xd2,
	0x08, 0xd8, 0xa0, 0x4d, 0x80, 0x68, 0xab, 0x31, 0x05, 0x65, 0x35, 0x06, 0x51, 0x4e, 0x01, 0x98,
	0x06, 0x4f, 0xe8, 0x8e, 0x45, 0x8f, 0x61, 0x76, 0x24, 0xa3, 0x80, 0x1f, 0xd9, 0xe3, 0x32, 0x49,
	0x36, 0x4c, 0xd5, 0x1c, 0xdf, 0xf2, 0xcf, 0x69, 0x79, 0x8a, 0xd9, 0x2f, 0x5a, 0x85, 0x89, 0xf2,
	0x94, 0x03, 0xea, 0x26, 0xda, 0x82, 0x59, 0x13, 0x87, 0x29, 0x4a, 0x2c, 0x65, 0x1c, 0x44, 0x0b,
	0xd8, 0xd0, 0x1b, 0x0c, 0x1a, 0x2d, 0x79, 0x7c, 0xca, 0x07, 0xc0, 0x2a, 0x31, 0xb1, 0xf2, 0x6f,
	0x32, 0x2c, 0xb0, 0x89, 0x55, 0xc2, 0x7a, 0x1f, 0x1d, 0xc0, 0x14, 0x17, 0x23, 0x26, 0xf6, 0xe5,
	0x11, 0x6a, 0x0b, 0x36, 0x4e, 0x15, 0xe3, 0xd1, 0xc7, 0xb0, 0x68, 0xe8, 0x3e, 0xee, 0x10, 0xf7,
	0x5c, 0x63, 0x20, 0x4b, 0xd4, 0xc9, 0xe3, 0x30, 0x2d, 0x04, 0xac, 0x6a, 0x82, 0xd3, 0x40, 0xc5,
	0x99, 0x1b, 0xb5, 0xe2, 0x8c, 0x3b, 0x54, 0xac, 0xe2, 0x6c, 0xc0, 0x14, 0x8b, 0xca, 0x5e, 0x69,
	0x82, 0x71, 0x7c, 0x67, 0x44, 0x8e, 0xcc, 0x41, 0x54, 0xc1, 0x43, 0xf9, 0x5b, 0x09, 0x8a, 0x89,
	0x48, 0x79, 0x7d, 0x0f, 0x7a, 0x01, 0x2b, 0x3d, 0xe2, 0x3a, 0xa4, 0xe3, 0xea, 0xbd, 0xd3, 0x73,
	0xcd, 0xb6, 0x5e, 0x60, 0xdb, 0x3a, 0x25, 0xc4, 0x64, 0x5e, 0x30, 0x3f, 0x92, 0xca, 0xe1, 0x58,
	0x75, 0x39, 0xc6, 0x33, 0x02, 0x2b, 0x1e, 0xac, 0x25, 0x26, 0x10, 0xf3, 0x94, 0xe7, 0xa1, 0xb1,
	0x78, 0xc1, 0xff, 0x8d, 0xb1, 0xab, 0xd0, 0x41, 0xb3, 0xbd, 0x80, 0xe5, 0x43, 0xe2, 0x76, 0x75,
	0xdb, 0xfa, 0x2e, 0x36, 0x63, 0xf1, 0x15, 0x21, 0x98, 0xb0, 0x71, 0x9b, 0xdb, 0x4b, 0x56, 0xd9,
	0x6f, 0x54, 0x80, 0x9c, 0x4f, 0x7a, 0x62, 0x27, 0xd1, 0x9f, 0x34, 0xc0, 0xb9, 0x56, 0xe7, 0x94,
	0x9f, 0x9c, 0x64, 0x95, 0x7f, 0xa0, 0x15, 0x98, 0x3a, 0x21, 0xbe, 0x4f, 0xba, 0x22, 0xfb, 0x8a,
	0x2f, 0xe5, 0x77, 0x73, 0xb0, 0xd8, 0x0a, 0xce, 0x92, 0xd8, 0xe4, 0x69, 0x90, 0x96, 0x5e, 0x4e,
	0xa8, 0xc2, 0x40, 0x02, 0x10, 0x8b, 0x35, 0x42, 0xe9, 0x95, 0x39, 0x17, 0x75, 0xd9, 0xc9, 0x9c,
	0x62, 0xc2, 0x33, 0xe4, 0x51, 0x3c, 0xe3, 0x37, 0x01, 0x06, 0xd2, 0x07, 0x5d, 0x93, 0xf7, 0xae,
	0xae, 0x27, 0xcf, 0x27, 0xd8, 0x0c, 0x33, 0x8d, 0x38, 0xf5, 0x45, 0x3c, 0xd1, 0xc7, 0x30, 0x13,
	0x65, 0x34, 0xbe, 0x43, 0x1e, 0x8f, 0x2e, 0x20, 0x48, 0x7c, 0xe2, 0xe8, 0x19, 0x72, 0x54, 0x7e,
	0x22, 0xc3, 0x24, 0xab, 0x40, 0xde, 0x40, 0x88, 0xb7, 0x61, 0xc9, 0x8f, 0x96, 0x59, 0xe3, 0x15,
	0x68, 0x10, 0x8e, 0x46, 0xb0, 0x52, 0xca, 0x57, 0x54, 0xe4, 0x27, 0x41, 0xde, 0xff, 0xc2, 0x52,
	0xdc, 0x1d, 0x48, 0x24, 0xcc, 0xa7, 0x05, 0x51, 0x2c, 0x9b, 0x7c, 0x0c, 0x8b, 0x29, 0x56, 0x74,
	0x17, 0x39, 0x7a, 0x17, 0x8b, 0x9c, 0xc2, 0x7e, 0x5f, 0x96, 0x96, 0xe8, 0x9e, 0x7a, 0xa9, 0xdb,
	0xfd, 0x20, 0x8b, 0xf0, 0x0f, 0xc5, 0x84, 0x99, 0x2a, 0xb6, 0xf1, 0x89, 0x4b, 0xa3, 0x7d, 0x16,
	0xdb, 0x3b, 0x90, 0x37, 0x2d, 0xaf, 0x67, 0xeb, 0xe7, 0x1a, 0xc3, 0x05, 0x79, 0x8a, 0xc3, 0x0e,
	0x29, 0x49, 0x22, 0x93, 0xe5, 0x52, 0x99, 0x4c, 0xf9, 0xb9, 0x0c, 0xf3, 0xa1, 0x18, 0xee, 0x1e,
	0x0e, 0xcc, 0x1a, 0x02, 0x62, 0x85, 0xe1, 0xa7, 0x71, 0x75, 0xfb, 0x0e, 0xb2, 0x2b, 0xab, 0xd8,
	0x20, 0x1d, 0x87, 0x6e, 0xc5, 0x10, 0xa1, 0xc6, 0x05, 0xa0, 0x43, 0x00, 0x76, 0xea, 0x65, 0xc7,
	0x21, 0x71, 0xfe, 0xdf, 0x19, 0xc1, 0x67, 0xe8, 0x30, 0x75, 0x86, 0xb2, 0x60, 0x3f, 0xd7, 0x7f,
	0x20, 0xc1, 0x52, 0x86, 0x50, 0xf4, 0x01, 0xcc, 0x04, 0x62, 0x83, 0xf4, 0xfb, 0x68, 0x8c, 0x59,
	0xa9, 0x11, 0x97, 0x4b, 0x0b, 0x8e, 0xef, 0x4b, 0xb0, 0x19, 0x0d, 0xe4, 0x3a, 0x51, 0xb3, 0xc7,
	0xe2, 0xbc, 0x01, 0x85, 0x90, 0x1f, 0x37, 0x41, 0x60, 0xf2, 0xaf, 0x8e, 0x6b, 0x72, 0x75, 0xc1,
	0x18, 0xf8, 0xf6, 0x68, 0x01, 0x5a, 0x48, 0x06, 0x88, 0x4c, 0x9f, 0x6a, 0xc2, 0x64, 0x8f, 0x0a,
	0x11, 0xb1, 0xf1, 0xf1, 0x38, 0x81, 0xf8, 0x39, 0x76, 0x7d, 0x7c, 0xa6, 0x72, 0x46, 0x09, 0x13,
	0xe5, 0x52, 0x26, 0xfa, 0x4c, 0x82, 0xd5, 0x81, 0x73, 0x4b, 0xcc, 0x36, 0xfb, 0x30, 0x25, 0x2c,
	0xc2, 0x37, 0xf9, 0xc8, 0x5e, 0x21, 0x86, 0xa3, 0x5b, 0x30, 0xe3, 0x9f, 0xf6, 0xbb, 0x27, 0x8e,
	0x6e, 0xd9, 0x6c, 0x3b, 0xe7, 0xd5, 0x08, 0xa0, 0x98, 0xb0, 0x96, 0x38, 0xa6, 0x64, 0xea, 0x20,
	0x5d, 0x4b, 0x07, 0xe5, 0x3f, 0xe7, 0x61, 0x85, 0x45, 0xcf, 0x88, 0xb9, 0x8a, 0xbd, 0xbe, 0xed,
	0x7b, 0x17, 0x37, 0x4b, 0x63, 0xd1, 0x1a, 0x5e, 0x4f, 0xb4, 0xee, 0xc3, 0x9a, 0xf8, 0xa9, 0xf1,
	0xa3, 0x7f, 0xac, 0x21, 0x2d, 0x62, 0xf6, 0xbb, 0x23, 0x96, 0x66, 0xb1, 0x39, 0xad, 0x0a, 0xde,
	0x09, 0xb8, 0x87, 0x7e, 0x47, 0x02, 0x25, 0x90, 0xdb, 0x73, 0xb1, 0xc7, 0x4e, 0xde, 0x69, 0x05,
	0x56, 0xaf, 0xab, 0xc0, 0x6d, 0x21, 0xa4, 0x29, 0x64, 0xa4, 0x14, 0x21, 0xb0, 0xc2, 0x5a, 0x90,
	0x69, 0xd9, 0xb9, 0xeb, 0xca, 0x2e, 0x52, 0xc6, 0x29, 0x81, 0x9f, 0x49, 0x70, 0x9b, 0x49, 0xbc,
	0x60, 0xda, 0xa5, 0xeb, 0x8a, 0x66, 0x6d, 0xd5, 0xa1, 0x73, 0xfe, 0x04, 0x56, 0x79, 0xcf, 0x24,
	0x2d, 0x79, 0xe2, 0xba, 0x92, 0x97, 0x19, 0xe7, 0x94, 0xc8, 0x4f, 0x61, 0x3d, 0xd1, 0xcd, 0x8c,
	0x4b, 0x9d, 0x63, 0x52, 0x2b, 0x63, 0xb6, 0x34, 0x63, 0xd2, 0x4b, 0xed, 0x6c, 0x84, 0x87, 0x74,
	0x28, 0x30, 0xab, 0xc7, 0xc5, 0x4e, 0x5d, 0xab, 0x7b, 0xbe, 0x40, 0xf9, 0xc5, 0x45, 0xf8, 0xb0,
	0x14, 0xb6, 0x91, 0x23, 0x31, 0xa5, 0x9b, 0xa3, 0x76, 0x4d, 0x87, 0x9e, 0x03, 0x54, 0x14, 0xf0,
	0x8f, 0xc5, 0x24, 0x17, 0x96, 0xb3, 0x7a, 0xb6, 0x5e, 0x69, 0x96, 0xcd, 0xee, 0xeb, 0xd7, 0xea,
	0xd6, 0xaa, 0xc5, 0x8c, 0x3e, 0xad, 0x47, 0xf3, 0x14, 0x6b, 0xd1, 0xc6, 0x8d, 0x99, 0x1f, 0x35,
	0x4f, 0xb5, 0xf0, 0x59, 0x7c, 0x6e, 0x0b, 0xfe, 0xc0, 0x37, 0xf5, 0x52, 0x24, 0x7a, 0xa3, 0x71,
	0x31, 0xf3, 0x4c, 0xcc, 0xee, 0xb8, 0x7d, 0xd1, 0x98, 0xc0, 0x45, 0xce, 0x3d, 0x2e, 0xf2, 0xfb,
	0x12, 0xdc, 0xb2, 0x49, 0x87, 0x68, 0x6e, 0x94, 0x9e, 0x07, 0xa4, 0x2f, 0x31, 0xe9, 0x23, 0xac,
	0x65, 0x83, 0x74, 0x48, 0x66, 0xae, 0x57, 0xd7, 0xed, 0x61, 0x28, 0xae, 0x47, 0xaa, 0x21, 0x1d,
	0xd7, 0xa3, 0x38, 0xaa, 0x1e, 0x43, 0x73, 0x9a, 0xba, 0xde, 0x1b, 0x86, 0xf2, 0xd0, 0x1f, 0x4b,
	0x70, 0x27, 0x2a, 0x48, 0x86, 0x19, 0x65, 0x79, 0xd4, 0x9b, 0x91, 0x8b, 0xab, 0x20, 0xf5, 0xb6,
	0x71, 0x21, 0xde, 0x43, 0xdb, 0x30, 0x89, 0x5d, 0x97, 0xb8, 0xa5, 0x19, 0x26, 0x19, 0x05, 0x92,
	0xdd, 0x9e, 0x51, 0x3e, 0x66, 0x37, 0x92, 0x2a, 0x27, 0x50, 0x7e, 0x20, 0xc1, 0x72, 0xe2, 0x4a,
	0xd2, 0xeb, 0x11, 0xc7, 0xc3, 0x88, 0x00, 0x8a, 0xe6, 0xa0, 0xb9, 0x3c, 0xf9, 0x8a, 0xb4, 0xfe,
	0xad, 0x11, 0x23, 0x42, 0x2a, 0x89, 0xab, 0x8b, 0x7a, 0x12, 0xa4, 0xfc, 0x97, 0x0c, 0xab, 0x09,
	0xea, 0xa6, 0x4b, 0x3a, 0x2e, 0xf6, 0x2e, 0xc9, 0xf9, 0x5f, 0x84, 0x42, 0x4f, 0x10, 0x6a, 0x3d,
	0xec, 0x1a, 0x58, 0x54, 0x64, 0x93, 0xea, 0x42, 0x00, 0x6f, 0x72, 0x30, 0x7a, 0x17, 0x20, 0x6a,
	0x25, 0x8a, 0xea, 0x79, 0x3d, 0x75, 0xa4, 0x0d, 0x0f, 0x56, 0xea, 0x4c, 0xd8, 0x44, 0x44, 0xef,
	0xc1, 0x6c, 0xbf, 0x67, 0xea, 0x3e, 0xe6, 0x63, 0x27, 0x2e, 0x1d, 0x0b, 0x9c, 0x9c, 0x0d, 0x7e,
	0x1f, 0x6e, 0x8a, 0x6b, 0x55, 0xd6, 0x00, 0x1e, 0xe7, 0x76, 0x56, 0x0d, 0x38, 0xc4, 0x6b, 0x9c,
	0xa9, 0xd7, 0x52, 0xe3, 0x28, 0xbf, 0x97, 0xf4, 0x82, 0xd0, 0xf0, 0x2e, 0x2c, 0xc5, 0xbc, 0x20,
	0x30, 0xa7, 0x70, 0x83, 0xca, 0xd8, 0x6e, 0x10, 0xf0, 0x57, 0x63, 0x3e, 0x16, 0xc0, 0x94, 0xbf,
	0x9e, 0x80, 0xb5, 0xa1, 0x17, 0x63, 0x68, 0x3b, 0xd9, 0x4d, 0x94, 0x82, 0x6b, 0x61, 0x79, 0xb0,
	0xa5, 0x88, 0xca, 0x50, 0xe8, 0xea, 0x67, 0x9a, 0x6e, 0xfb, 0xd8, 0x75, 0x74, 0xdf, 0x7a, 0x29,
	0x1a, 0xf6, 0x93, 0xfc, 0x74, 0xba, 0xd0, 0xd5, 0xcf, 0x2a, 0x31, 0x1c, 0xa5, 0x6f, 0x5b, 0x14,
	0x40, 0xe7, 0xd9, 0xd6, 0x1d, 0x7a, 0xf2, 0x61, 0x9d, 0x6f, 0x41, 0xcf, 0x91, 0xcd, 0x00, 0x87,
	0x30, 0x2c, 0x88, 0xc4, 0x22, 0x2e, 0xc8, 0x83, 0xea, 0xe0, 0x57, 0x46, 0x4d, 0x29, 0xe2, 0xe6,
	0x9a, 0xcb, 0x99, 0xf7, 0xe2, 0x30, 0x0f, 0xd5, 0xe0, 0x16, 0x76, 0xf4, 0x13, 0x1b, 0x6b, 0x7a,
	0xdf, 0x27, 0x5d, 0xdd, 0xb7, 0x0c, 0xad, 0xd7, 0x77, 0x0c, 0xbf, 0xcf, 0xd3, 0xe7, 0x64, 0xa4,
	0xe2, 0x3a, 0x27, 0xac, 0x04, 0x74, 0xcd, 0x88, 0x0c, 0xfd, 0x02, 0xe4, 0xf5, 0xbe, 0x69, 0x91,
	0xe0, 0xd8, 0x44, 0x73, 0xbb, 0xb0, 0xc4, 0x2c, 0x43, 0xf0, 0xd3, 0x0f, 0xaa, 0x80, 0xe0, 0xa2,
	0x79, 0x3d, 0xac, 0xbf, 0xc0, 0xae, 0x66, 0x5a, 0xba, 0x6b, 0x7d, 0x37, 0xca, 0xd5, 0x42, 0x58,
	0x89, 0x93, 0x1d, 0x73, 0xaa, 0xbd, 0x88, 0x08, 0x7d, 0x13, 0xd6, 0x62, 0x63, 0x42, 0x3e, 0x06,
	0xe9, 0x3b, 0x3e, 0xbb, 0xa4, 0x14, 0x72, 0x57, 0x63, 0x54, 0x82, 0x4d, 0x95, 0xd2, 0xa0, 0x77,
	0x61, 0x45, 0xe8, 0xf0, 0x8a, 0xb8, 0x66, 0xec, 0xee, 0x89, 0x05, 0x34, 0x21, 0xbf, 0xc8, 0x49,
	0x7e, 0x8d, 0xb8, 0x66, 0x74, 0xf7, 0xa4, 0x94, 0x61, 0x6e, 0xc0, 0xa6, 0x68, 0x03, 0x6e, 0xf6,
	0x4e, 0x5d, 0xdd, 0x13, 0x87, 0x73, 0xf1, 0x80, 0x20, 0x80, 0x29, 0x7f, 0x2e, 0xc1, 0x52, 0x86,
	0xb3, 0xa1, 0xef, 0x40, 0x7e, 0xc0, 0x71, 0xb8, 0xc7, 0x3f, 0x19, 0x75, 0x65, 0xe3, 0x01, 0x3a,
	0x62, 0xa7, 0x0e, 0xf0, 0x4e, 0xbb, 0xb4, 0x1c, 0xb8, 0x74, 0x2e, 0xd1, 0x25, 0xff, 0xb1, 0x04,
	0xb7, 0x2e, 0x62, 0x4c, 0x0f, 0x90, 0x51, 0x95, 0x23, 0x22, 0x65, 0x0c, 0x92, 0xe8, 0xd5, 0xc8,
	0x41, 0xaf, 0x26, 0x37, 0xd0, 0x62, 0x79, 0x0a, 0x93, 0xd4, 0xee, 0x41, 0x85, 0xff, 0xf0, 0xea,
	0x93, 0xa6, 0x8b, 0x51, 0x77, 0xda, 0x84, 0xf3, 0xe4, 0x5c, 0x94, 0x7f, 0x95, 0x60, 0x3a, 0x40,
	0xa0, 0xaf, 0x0e, 0x44, 0xe0, 0x4b, 0xdb, 0xcd, 0xb1, 0x00, 0xfc, 0x0e, 0x4c, 0x07, 0xf7, 0x37,
	0x97, 0x37, 0x23, 0x6f, 0x8a, 0x8b, 0x1b, 0x7a, 0x6e, 0xa7, 0x5a, 0x88, 0x6e, 0x0e, 0xfb, 0x3d,
	0xac, 0x61, 0x35, 0x68, 0x84, 0x7b, 0x30, 0x1b, 0x38, 0xae, 0xaf, 0xf3, 0x47, 0x05, 0x93, 0x82,
	0x4a, 0xc0, 0x5b, 0x7a, 0x47, 0x29, 0x43, 0x21, 0x79, 0x96, 0x47, 0x79, 0x90, 0xce, 0x44, 0x63,
	0x58, 0x62, 0x5f, 0xe7, 0xa2, 0xd9, 0x21, 0x9d, 0x2b, 0x3d, 0x58, 0x49, 0x37, 0x61, 0x9b, 0xc4,
	0x3e, 0x47, 0xcf, 0x61, 0xfa, 0x25, 0x76, 0x7d, 0xcb, 0x08, 0x9d, 0xed, 0x3a, 0xfd, 0x84, 0x90,
	0x97, 0xf2, 0x8f, 0x12, 0xcc, 0xd2, 0x4a, 0xf2, 0xff, 0xec, 0xca, 0x0a, 0xbd, 0x1f, 0x36, 0xe7,
	0xb9, 0x3f, 0x3d, 0x1a, 0xad, 0x04, 0x1e, 0xec, 0xc8, 0xff, 0x8d, 0x04, 0x33, 0x21, 0x14, 0xb9,
	0x50, 0x74, 0x59, 0xd6, 0xca, 0xec, 0x8c, 0x7f, 0xeb, 0x3a, 0x9d, 0x71, 0xba, 0x28, 0x2a, 0x12,
	0xdc, 0x5f, 0x53, 0x5f, 0x5c, 0x79, 0x05, 0xf3, 0x83, 0x55, 0x3d, 0xf5, 0x4f, 0xf6, 0xb6, 0x4a,
	0xf4, 0x95, 0x58, 0xc8, 0xfa, 0x20, 0x76, 0x9d, 0xc4, 0x3b, 0x0c, 0xbf, 0x3c, 0x9a, 0xc9, 0x52,
	0xb7, 0x49, 0xca, 0xe7, 0x12, 0x2c, 0x0d, 0x16, 0xfa, 0xdc, 0x80, 0xff, 0x1f, 0x6f, 0x17, 0x94,
	0x9f, 0xc9, 0x50, 0x1a, 0x76, 0x6a, 0x79, 0x8d, 0x97, 0x86, 0x9b, 0xe9, 0x30, 0x31, 0xe0, 0xd7,
	0xcf, 0x42, 0xbf, 0x96, 0x47, 0x3d, 0x49, 0x66, 0x2c, 0x45, 0xe0, 0xe1, 0x48, 0x8d, 0x36, 0x68,
	0xee, 0x3a, 0x1b, 0xf4, 0xe0, 0x46, 0xb4, 0x45, 0xdf, 0x82, 0x69, 0x96, 0xf6, 0x83, 0x67, 0x74,
	0x39, 0x8a, 0x64, 0x90, 0xba, 0xb9, 0x9b, 0x67, 0x39, 0x83, 0x22, 0x9d, 0x36, 0x51, 0xbe, 0x27,
	0xc3, 0xda, 0xd0, 0x43, 0xd9, 0x6b, 0xb4, 0x6e, 0xd4, 0x2a, 0x94, 0xaf, 0xd7, 0xae, 0xbc, 0xd6,
	0xe5, 0x6b, 0xf6, 0x73, 0x3f, 0xe5, 0xef, 0x24, 0xd8, 0x38, 0xf6, 0x5d, 0xac, 0x77, 0x23, 0xe7,
	0x1a, 0x7c, 0xb2, 0x69, 0x40, 0x3e, 0xf6, 0x30, 0xa6, 0x23, 0xcc, 0x31, 0xc2, 0xbd, 0x63, 0xc8,
	0xfe, 0x79, 0xf8, 0x7a, 0xa6, 0x73, 0x70, 0x43, 0x9d, 0x8d, 0x1e, 0xd3, 0x74, 0xd0, 0x17, 0x92,
	0x4f, 0x3f, 0xe9, 0x36, 0xc9, 0x1f, 0xdc, 0x18, 0x7c, 0xfc, 0xb9, 0xbb, 0x04, 0x8b, 0x5e, 0xc0,
	0x4d, 0x73, 0xb9, 0x82, 0xca, 0x7f, 0x4b, 0xb0, 0x39, 0x6c, 0x0a, 0xe2, 0x88, 0x17, 0x1e, 0x13,
	0xa5, 0x4b, 0x8e, 0x89, 0xe8, 0x2c, 0xf3, 0x30, 0xc8, 0x37, 0x6d, 0x7d, 0xdc, 0x39, 0x5f, 0xe5,
	0x54, 0x88, 0xde, 0x81, 0x95, 0xb4, 0x64, 0x76, 0x0c, 0xe4, 0x19, 0xbd, 0x98, 0x1a, 0xf2, 0xcc,
	0xb5, 0x94, 0x3d, 0xb8, 0x1b, 0xcd, 0x9d, 0x56, 0xc3, 0x76, 0xd5, 0xd6, 0x3d, 0xcf, 0x6a, 0x5b,
	0xfc, 0xd9, 0xa8, 0xb0, 0xef, 0x06, 0x00, 0x7b, 0x73, 0xa2, 0xc5, 0x5a, 0xfb, 0x33, 0x0c, 0x72,
	0xa8, 0x77, 0x71, 0x06, 0x97, 0xcc, 0xa7, 0x49, 0x97, 0x70, 0xf9, 0x22, 0xfc, 0x62, 0xc8, 0xe5,
	0xe2, 0xc7, 0x4a, 0x4a, 0x23, 0xe6, 0x75, 0x99, 0xef, 0xcf, 0x32, 0xdf, 0x83, 0x49, 0xd9, 0xef,
	0xc1, 0x94, 0xdb, 0x31, 0x6e, 0x59, 0x8a, 0x2b, 0xf7, 0x40, 0x09, 0x09, 0x86, 0xbe, 0xd3, 0x52,
	0xfe, 0x52, 0x82, 0x95, 0x88, 0xcc, 0x27, 0x2e, 0x2b, 0x46, 0x99, 0x3a, 0xfb, 0xb0, 0x15, 0x9c,
	0x15, 0x38, 0x5c, 0x4b, 0xad, 0x95, 0xd0, 0x6e, 0x43, 0x1c, 0x16, 0x38, 0x59, 0x72, 0xe5, 0xd1,
	0x53, 0xb8, 0x9b, 0x1a, 0x19, 0xf2, 0x34, 0x2d, 0x17, 0x1b, 0x3e, 0x71, 0xcf, 0xc5, 0x92, 0x6f,
	0x25, 0x97, 0x5c, 0x70, 0xdd, 0x0b, 0xe8, 0x94, 0x7f, 0xc9, 0xc1, 0xed, 0x4b, 0x7c, 0x2d, 0xb3,
	0xdf, 0x29, 0xbd, 0xde, 0x7e, 0x67, 0x1b, 0x16, 0xdf, 0xc0, 0x95, 0x41, 0xc1, 0x4e, 0xf6, 0x8e,
	0x87, 0xf4, 0x55, 0x73, 0x6f, 0xb6, 0xaf, 0x9a, 0xdd, 0x7e, 0x9c, 0x78, 0x83, 0xed, 0x47, 0xe5,
	0x1f, 0xa6, 0xa1, 0x98, 0x15, 0x37, 0x51, 0x2b, 0xea, 0xaf, 0xf0, 0xa7, 0x98, 0x8f, 0xc7, 0x08,
	0x4a, 0xa9, 0x46, 0xcb, 0x1f, 0x5c, 0xf6, 0xfc, 0x9a, 0x07, 0xc0, 0xc6, 0x18, 0xb2, 0x86, 0x6e,
	0xb7, 0x83, 0x1b, 0x17, 0xbd, 0xc4, 0xfe, 0x74, 0xe8, 0x33, 0x74, 0xbe, 0xd8, 0xfb, 0x63, 0xa8,
	0x92, 0x15, 0x68, 0x0e, 0x6e, 0x0c, 0x79, 0x91, 0xfe, 0xa7, 0x23, 0x3c, 0x05, 0xff, 0x60, 0x0c,
	0x65, 0x2e, 0x0e, 0x90, 0x07, 0x37, 0x2e, 0x7d, 0x15, 0xfe, 0xe9, 0xd0, 0x07, 0xc3, 0x93, 0x63,
	0x5b, 0x28, 0x2b, 0x78, 0x52, 0x0b, 0x65, 0xbd, 0x1d, 0x46, 0x7f, 0x28, 0xc1, 0x2d, 0xd6, 0xa8,
	0xb1, 0x35, 0x63, 0x20, 0xe7, 0x04, 0x7a, 0xf0, 0x6e, 0xf0, 0xd3, 0x31, 0xf4, 0x18, 0x9e, 0xc9,
	0x0e, 0x6e, 0xa8, 0xeb, 0xfa, 0xf0, 0x3c, 0xf7, 0x47, 0x12, 0x6c, 0x08, 0x9d, 0x86, 0x18, 0x67,
	0xe5, 0x9a, 0x4a, 0x0d, 0x31, 0x91, 0x50, 0x2a, 0x33, 0x6d, 0x76, 0x60, 0x3e, 0x88, 0xf0, 0x42,
	0x89, 0xcd, 0x51, 0x4f, 0x6d, 0xd9, 0x69, 0x49, 0x9d, 0xf3, 0xe2, 0x9f, 0xbb, 0x08, 0x0a, 0x51,
	0x79, 0xc4, 0x45, 0xdd, 0xff, 0xa1, 0x0c, 0x37, 0xc5, 0x7e, 0x47, 0xab, 0xb0, 0xf4, 0xa4, 0x56,
	0x69, 0x3d, 0x53, 0x6b, 0xda, 0xb3, 0xc3, 0xe3, 0x66, 0xad, 0x5a, 0x7f, 0x52, 0xaf, 0xed, 0x15,
	0x6e, 0xa0, 0x25, 0x58, 0x68, 0x54, 0x76, 0x6b, 0x0d, 0x6d, 0xaf, 0xd6, 0xaa, 0x55, 0x5b, 0xf5,
	0xa3, 0xc3, 0x82, 0x84, 0xd6, 0x60, 0xf9, 0xf8, 0xe0, 0xa8, 0xa5, 0x55, 0x0f, 0x2a, 0x87, 0xfb,
	0xb5, 0x18, 0x4a, 0x46, 0x9b, 0xb0, 0x5e, 0xfb, 0x76, 0xb3, 0x51, 0xaf, 0xd6, 0x5b, 0x5a, 0xf5,
	0xe8, 0xb0, 0x55, 0x3b, 0x6c, 0xc5, 0xf0, 0x39, 0x84, 0x60, 0xfe, 0x49, 0xa5, 0x1a, 0x1f, 0x33,
	0x81, 0x4a, 0x50, 0x3c, 0x6e, 0xd6, 0x6a, 0xd5, 0x03, 0xad, 0xa5, 0x56, 0x0e, 0x8f, 0xab, 0x6a,
	0xbd, 0xc9, 0x30, 0x53, 0x94, 0xba, 0x55, 0xfb, 0x76, 0x9c, 0xc3, 0x4d, 0xaa, 0xd1, 0xd1, 0xee,
	0xaf, 0xd6, 0xaa, 0x2d, 0x4a, 0x5d, 0x7d, 0xbf, 0x7e, 0xb8, 0x5f, 0x98, 0x41, 0x45, 0x28, 0x34,
	0x8e, 0xf6, 0x8f, 0x34, 0xb5, 0x56, 0x3d, 0xda, 0x3f, 0xac, 0x33, 0xd2, 0x3c, 0xd5, 0xb3, 0x5a,
	0x6b, 0xd4, 0x76, 0xd5, 0x7a, 0xeb, 0xc3, 0x01, 0xd4, 0x1c, 0x1d, 0xd0, 0xac, 0xa9, 0xc7, 0x47,
	0x87, 0x31, 0xde, 0xf3, 0xf7, 0x5d, 0x40, 0xe9, 0x57, 0xe9, 0xe8, 0x1e, 0x6c, 0x25, 0x6c, 0xa0,
	0x3d, 0x3d, 0xda, 0x4b, 0x5a, 0x6a, 0x0e, 0x66, 0x98, 0x51, 0x28, 0xaa, 0x20, 0xa1, 0x79, 0x80,
	0x27, 0x6a, 0xe5, 0x69, 0x8d, 0x7f, 0xcb, 0xd4, 0xc2, 0x0c, 0x5d, 0x39, 0xdc, 0xd3, 0x62, 0x88,
	0xdc, 0x7d, 0x1f, 0x20, 0x7a, 0xe2, 0x87, 0xd6, 0x61, 0xa5, 0x51, 0x7f, 0xbf, 0xd6, 0xa8, 0x1f,
	0x1c, 0x1d, 0xed, 0x25, 0x24, 0x2c, 0xc2, 0xdc, 0xf3, 0x9a, 0xfa, 0xa1, 0xf6, 0xec, 0x90, 0x91,
	0x7c, 0x58, 0x90, 0x50, 0x1e, 0xa6, 0xc3, 0x2f, 0x99, 0x7e, 0x35, 0x8f, 0x8e, 0x8f, 0xeb, 0xbb,
	0x8d, 0x5a, 0x21, 0x87, 0x00, 0xa6, 0x04, 0x66, 0x02, 0x2d, 0xc0, 0x2c, 0x1b, 0x2a, 0x00, 0x93,
	0xf7, 0x7f, 0x5f, 0x86, 0x42, 0x32, 0xea, 0xa3, 0x3b, 0xb0, 0x71, 0xdc, 0x52, 0x6b, 0x95, 0xa7,
	0xf5, 0xc3, 0x7d, 0x2d, 0xdb, 0x1f, 0x36, 0x60, 0x2d, 0x22, 0x49, 0x7b, 0xc6, 0x5d, 0xb8, 0x1d,
	0xa1, 0x87, 0xf9, 0xc8, 0x36, 0xdc, 0x8b, 0x88, 0x2e, 0xf4, 0x96, 0x01, 0x69, 0xc9, 0x55, 0x9f,
	0x18, 0x94, 0x56, 0x79, 0xd6, 0x3a, 0x7a, 0xda, 0xd0, 0xaa, 0x8d, 0xca, 0xf1, 0x71, 0xfd, 0x49,
	0xbd, 0x5a, 0x61, 0x3c, 0x96, 0xe9, 0xea, 0xa5, 0x88, 0x92, 0xac, 0x56, 0x1e, 0xfe, 0x44, 0x86,
	0x12, 0xcb, 0xa6, 0xf5, 0xd8, 0x36, 0x3b, 0xc6, 0xee, 0x4b, 0xcb, 0xc0, 0xe8, 0xe7, 0x12, 0xcc,
	0x0d, 0x1c, 0x1f, 0xd0, 0x08, 0x87, 0x9c, 0xac, 0xa3, 0xd3, 0xfa, 0x46, 0x30, 0x3e, 0xf6, 0x37,
	0xbc, 0xf2, 0x51, 0xf0, 0x37, 0x3c, 0xe5, 0xc5, 0xe7, 0x95, 0xf2, 0xb0, 0x4b, 0xa9, 0xec, 0x5b,
	0x8a, 0x9f, 0x55, 0x50, 0x78, 0x3b, 0xf4, 0x76, 0xf0, 0xf7, 0xb5, 0xef, 0xfd, 0xf4, 0x3f, 0x7e,
	0x24, 0xdf, 0x56, 0xd6, 0x93, 0xff, 0x4c, 0xf4, 0x1e, 0x8b, 0x72, 0x05, 0x3f, 0x96, 0xee, 0xaf,
	0xb7, 0x3e, 0xaf, 0x6c, 0xa5, 0x27, 0xc0, 0xf5, 0xd3, 0x7b, 0x96, 0x57, 0x36, 0x48, 0xf7, 0x9f,
	0x2b, 0xe5, 0x53, 0xdf, 0xef, 0x79, 0x8f, 0x77, 0x76, 0x5e, 0xbd, 0x7a, 0x95, 0x40, 0xee, 0xe8,
	0x7d, 0xff, 0x94, 0xff, 0x2b, 0xf2, 0x4b, 0x3d, 0x5b, 0xf7, 0xdb, 0xc4, 0xed, 0x3e, 0xfc, 0x0b,
	0x19, 0xee, 0x0c, 0xd6, 0x29, 0x59, 0x96, 0xfd, 0xab, 0x78, 0x61, 0x3d, 0x68, 0xe2, 0x71, 0xb2,
	0x54, 0xa6, 0xad, 0x0f, 0xae, 0xcf, 0x88, 0x9b, 0x5e, 0xb9, 0xb1, 0x2d, 0x7d, 0x59, 0x7a, 0x33,
	0xf6, 0xda, 0xfd, 0x4c, 0x86, 0xb7, 0x0d, 0xd2, 0xbd, 0xb2, 0xae, 0xbb, 0x1b, 0xc3, 0x8c, 0xda,
	0x74, 0x89, 0x4f, 0x9a, 0xd2, 0xaf, 0x7f, 0x28, 0x58, 0x75, 0x88, 0xad, 0x3b, 0x9d, 0x32, 0x71,
	0x3b, 0x3b, 0x1d, 0xec, 0xb0, 0xb6, 0xd2, 0x4e, 0xa4, 0xd0, 0xe5, 0xff, 0x66, 0x7d, 0x2f, 0x85,
	0xfb, 0x33, 0x79, 0x7b, 0x9f, 0xf3, 0xae, 0x32, 0x35, 0x53, 0x9a, 0x94, 0x9f, 0x3f, 0x68, 0x3e,
	0xda, 0xa5, 0x83, 0x3f, 0x0f, 0x48, 0x3f, 0x62, 0xa4, 0x1f, 0xa5, 0x48, 0x3f, 0x7a, 0x1e, 0xc8,
	0x39, 0x99, 0x62, 0xba, 0x3d, 0xfa, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xea, 0xb0, 0x84, 0x8a,
	0x68, 0x3b, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// VideoIntelligenceServiceClient is the client API for VideoIntelligenceService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type VideoIntelligenceServiceClient interface {
	// Performs asynchronous video annotation. Progress and results can be
	// retrieved through the `google.longrunning.Operations` interface.
	// `Operation.metadata` contains `AnnotateVideoProgress` (progress).
	// `Operation.response` contains `AnnotateVideoResponse` (results).
	AnnotateVideo(ctx context.Context, in *AnnotateVideoRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
}

type videoIntelligenceServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewVideoIntelligenceServiceClient(cc grpc.ClientConnInterface) VideoIntelligenceServiceClient {
	return &videoIntelligenceServiceClient{cc}
}

func (c *videoIntelligenceServiceClient) AnnotateVideo(ctx context.Context, in *AnnotateVideoRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
	out := new(longrunning.Operation)
	err := c.cc.Invoke(ctx, "/google.cloud.videointelligence.v1p3beta1.VideoIntelligenceService/AnnotateVideo", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// VideoIntelligenceServiceServer is the server API for VideoIntelligenceService service.
type VideoIntelligenceServiceServer interface {
	// Performs asynchronous video annotation. Progress and results can be
	// retrieved through the `google.longrunning.Operations` interface.
	// `Operation.metadata` contains `AnnotateVideoProgress` (progress).
	// `Operation.response` contains `AnnotateVideoResponse` (results).
	AnnotateVideo(context.Context, *AnnotateVideoRequest) (*longrunning.Operation, error)
}

// UnimplementedVideoIntelligenceServiceServer can be embedded to have forward compatible implementations.
type UnimplementedVideoIntelligenceServiceServer struct {
}

func (*UnimplementedVideoIntelligenceServiceServer) AnnotateVideo(ctx context.Context, req *AnnotateVideoRequest) (*longrunning.Operation, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method AnnotateVideo not implemented")
}

func RegisterVideoIntelligenceServiceServer(s *grpc.Server, srv VideoIntelligenceServiceServer) {
	s.RegisterService(&_VideoIntelligenceService_serviceDesc, srv)
}

func _VideoIntelligenceService_AnnotateVideo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnnotateVideoRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(VideoIntelligenceServiceServer).AnnotateVideo(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.videointelligence.v1p3beta1.VideoIntelligenceService/AnnotateVideo",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(VideoIntelligenceServiceServer).AnnotateVideo(ctx, req.(*AnnotateVideoRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _VideoIntelligenceService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.videointelligence.v1p3beta1.VideoIntelligenceService",
	HandlerType: (*VideoIntelligenceServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "AnnotateVideo",
			Handler:    _VideoIntelligenceService_AnnotateVideo_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/videointelligence/v1p3beta1/video_intelligence.proto",
}

// StreamingVideoIntelligenceServiceClient is the client API for StreamingVideoIntelligenceService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type StreamingVideoIntelligenceServiceClient interface {
	// Performs video annotation with bidirectional streaming: emitting results
	// while sending video/audio bytes.
	// This method is only available via the gRPC API (not REST).
	StreamingAnnotateVideo(ctx context.Context, opts ...grpc.CallOption) (StreamingVideoIntelligenceService_StreamingAnnotateVideoClient, error)
}

type streamingVideoIntelligenceServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewStreamingVideoIntelligenceServiceClient(cc grpc.ClientConnInterface) StreamingVideoIntelligenceServiceClient {
	return &streamingVideoIntelligenceServiceClient{cc}
}

func (c *streamingVideoIntelligenceServiceClient) StreamingAnnotateVideo(ctx context.Context, opts ...grpc.CallOption) (StreamingVideoIntelligenceService_StreamingAnnotateVideoClient, error) {
	stream, err := c.cc.NewStream(ctx, &_StreamingVideoIntelligenceService_serviceDesc.Streams[0], "/google.cloud.videointelligence.v1p3beta1.StreamingVideoIntelligenceService/StreamingAnnotateVideo", opts...)
	if err != nil {
		return nil, err
	}
	x := &streamingVideoIntelligenceServiceStreamingAnnotateVideoClient{stream}
	return x, nil
}

type StreamingVideoIntelligenceService_StreamingAnnotateVideoClient interface {
	Send(*StreamingAnnotateVideoRequest) error
	Recv() (*StreamingAnnotateVideoResponse, error)
	grpc.ClientStream
}

type streamingVideoIntelligenceServiceStreamingAnnotateVideoClient struct {
	grpc.ClientStream
}

func (x *streamingVideoIntelligenceServiceStreamingAnnotateVideoClient) Send(m *StreamingAnnotateVideoRequest) error {
	return x.ClientStream.SendMsg(m)
}

func (x *streamingVideoIntelligenceServiceStreamingAnnotateVideoClient) Recv() (*StreamingAnnotateVideoResponse, error) {
	m := new(StreamingAnnotateVideoResponse)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

// StreamingVideoIntelligenceServiceServer is the server API for StreamingVideoIntelligenceService service.
type StreamingVideoIntelligenceServiceServer interface {
	// Performs video annotation with bidirectional streaming: emitting results
	// while sending video/audio bytes.
	// This method is only available via the gRPC API (not REST).
	StreamingAnnotateVideo(StreamingVideoIntelligenceService_StreamingAnnotateVideoServer) error
}

// UnimplementedStreamingVideoIntelligenceServiceServer can be embedded to have forward compatible implementations.
type UnimplementedStreamingVideoIntelligenceServiceServer struct {
}

func (*UnimplementedStreamingVideoIntelligenceServiceServer) StreamingAnnotateVideo(srv StreamingVideoIntelligenceService_StreamingAnnotateVideoServer) error {
	return status1.Errorf(codes.Unimplemented, "method StreamingAnnotateVideo not implemented")
}

func RegisterStreamingVideoIntelligenceServiceServer(s *grpc.Server, srv StreamingVideoIntelligenceServiceServer) {
	s.RegisterService(&_StreamingVideoIntelligenceService_serviceDesc, srv)
}

func _StreamingVideoIntelligenceService_StreamingAnnotateVideo_Handler(srv interface{}, stream grpc.ServerStream) error {
	return srv.(StreamingVideoIntelligenceServiceServer).StreamingAnnotateVideo(&streamingVideoIntelligenceServiceStreamingAnnotateVideoServer{stream})
}

type StreamingVideoIntelligenceService_StreamingAnnotateVideoServer interface {
	Send(*StreamingAnnotateVideoResponse) error
	Recv() (*StreamingAnnotateVideoRequest, error)
	grpc.ServerStream
}

type streamingVideoIntelligenceServiceStreamingAnnotateVideoServer struct {
	grpc.ServerStream
}

func (x *streamingVideoIntelligenceServiceStreamingAnnotateVideoServer) Send(m *StreamingAnnotateVideoResponse) error {
	return x.ServerStream.SendMsg(m)
}

func (x *streamingVideoIntelligenceServiceStreamingAnnotateVideoServer) Recv() (*StreamingAnnotateVideoRequest, error) {
	m := new(StreamingAnnotateVideoRequest)
	if err := x.ServerStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

var _StreamingVideoIntelligenceService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.videointelligence.v1p3beta1.StreamingVideoIntelligenceService",
	HandlerType: (*StreamingVideoIntelligenceServiceServer)(nil),
	Methods:     []grpc.MethodDesc{},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "StreamingAnnotateVideo",
			Handler:       _StreamingVideoIntelligenceService_StreamingAnnotateVideo_Handler,
			ServerStreams: true,
			ClientStreams: true,
		},
	},
	Metadata: "google/cloud/videointelligence/v1p3beta1/video_intelligence.proto",
}
