// Copyright 2017 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package google.cloud.videointelligence.v1beta1; import "google/api/annotations.proto"; import "google/longrunning/operations.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/status.proto"; option csharp_namespace = "Google.Cloud.VideoIntelligence.V1Beta1"; option go_package = "google.golang.org/genproto/googleapis/cloud/videointelligence/v1beta1;videointelligence"; option java_multiple_files = true; option java_outer_classname = "VideoIntelligenceServiceProto"; option java_package = "com.google.cloud.videointelligence.v1beta1"; option php_namespace = "Google\\Cloud\\VideoIntelligence\\V1beta1"; // Service that implements Google Cloud Video Intelligence API. service VideoIntelligenceService { // 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). rpc AnnotateVideo(AnnotateVideoRequest) returns (google.longrunning.Operation) { option (google.api.http) = { post: "/v1beta1/videos:annotate" body: "*" }; } } // Video annotation request. message AnnotateVideoRequest { // 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. string input_uri = 1; // The video data bytes. Encoding: base64. If unset, the input video(s) // should be specified via `input_uri`. If set, `input_uri` should be unset. string input_content = 6; // Requested video annotation features. repeated Feature features = 2; // Additional video context and/or feature-specific parameters. VideoContext video_context = 3; // 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). string output_uri = 4; // 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. string location_id = 5; } // Video context and/or feature-specific parameters. message VideoContext { // 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. repeated VideoSegment segments = 1; // If label detection has been requested, what labels should be detected // in addition to video-level labels or segment-level labels. If unspecified, // defaults to `SHOT_MODE`. LabelDetectionMode label_detection_mode = 2; // 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. bool stationary_camera = 3; // Model to use for label detection. // Supported values: "latest" and "stable" (the default). string label_detection_model = 4; // Model to use for face detection. // Supported values: "latest" and "stable" (the default). string face_detection_model = 5; // Model to use for shot change detection. // Supported values: "latest" and "stable" (the default). string shot_change_detection_model = 6; // Model to use for safe search detection. // Supported values: "latest" and "stable" (the default). string safe_search_detection_model = 7; } // Video segment. message VideoSegment { // Start offset in microseconds (inclusive). Unset means 0. int64 start_time_offset = 1; // End offset in microseconds (inclusive). Unset means 0. int64 end_time_offset = 2; } // Label location. message LabelLocation { // Video segment. Set to [-1, -1] for video-level labels. // Set to [timestamp, timestamp] for frame-level labels. // Otherwise, corresponds to one of `AnnotateSpec.segments` // (if specified) or to shot boundaries (if requested). VideoSegment segment = 1; // Confidence that the label is accurate. Range: [0, 1]. float confidence = 2; // Label level. LabelLevel level = 3; } // Label annotation. message LabelAnnotation { // Textual description, e.g. `Fixed-gear bicycle`. string description = 1; // Language code for `description` in BCP-47 format. string language_code = 2; // Where the label was detected and with what confidence. repeated LabelLocation locations = 3; } // Safe search annotation (based on per-frame visual signals only). // If no unsafe content has been detected in a frame, no annotations // are present for that frame. If only some types of unsafe content // have been detected in a frame, the likelihood is set to `UNKNOWN` // for all other types of unsafe content. message SafeSearchAnnotation { // Likelihood of adult content. Likelihood adult = 1; // Likelihood that an obvious modification was made to the original // version to make it appear funny or offensive. Likelihood spoof = 2; // Likelihood of medical content. Likelihood medical = 3; // Likelihood of violent content. Likelihood violent = 4; // Likelihood of racy content. Likelihood racy = 5; // Video time offset in microseconds. int64 time_offset = 6; } // Bounding box. message BoundingBox { // Left X coordinate. int32 left = 1; // Right X coordinate. int32 right = 2; // Bottom Y coordinate. int32 bottom = 3; // Top Y coordinate. int32 top = 4; } // Face location. message FaceLocation { // Bounding box in a frame. BoundingBox bounding_box = 1; // Video time offset in microseconds. int64 time_offset = 2; } // Face annotation. message FaceAnnotation { // Thumbnail of a representative face view (in JPEG format). Encoding: base64. string thumbnail = 1; // All locations where a face was detected. // Faces are detected and tracked on a per-video basis // (as opposed to across multiple videos). repeated VideoSegment segments = 2; // Face locations at one frame per second. repeated FaceLocation locations = 3; } // Annotation results for a single video. message VideoAnnotationResults { // Video file location in // [Google Cloud Storage](https://cloud.google.com/storage/). string input_uri = 1; // Label annotations. There is exactly one element for each unique label. repeated LabelAnnotation label_annotations = 2; // Face annotations. There is exactly one element for each unique face. repeated FaceAnnotation face_annotations = 3; // Shot annotations. Each shot is represented as a video segment. repeated VideoSegment shot_annotations = 4; // Safe search annotations. repeated SafeSearchAnnotation safe_search_annotations = 6; // If set, indicates an error. Note that for a single `AnnotateVideoRequest` // some videos may succeed and some may fail. google.rpc.Status error = 5; } // Video annotation response. Included in the `response` // field of the `Operation` returned by the `GetOperation` // call of the `google::longrunning::Operations` service. message AnnotateVideoResponse { // Annotation results for all videos specified in `AnnotateVideoRequest`. repeated VideoAnnotationResults annotation_results = 1; } // Annotation progress for a single video. message VideoAnnotationProgress { // Video file location in // [Google Cloud Storage](https://cloud.google.com/storage/). string input_uri = 1; // Approximate percentage processed thus far. // Guaranteed to be 100 when fully processed. int32 progress_percent = 2; // Time when the request was received. google.protobuf.Timestamp start_time = 3; // Time of the most recent update. google.protobuf.Timestamp update_time = 4; } // Video annotation progress. Included in the `metadata` // field of the `Operation` returned by the `GetOperation` // call of the `google::longrunning::Operations` service. message AnnotateVideoProgress { // Progress metadata for all videos specified in `AnnotateVideoRequest`. repeated VideoAnnotationProgress annotation_progress = 1; } // Video annotation feature. enum Feature { // Unspecified. FEATURE_UNSPECIFIED = 0; // Label detection. Detect objects, such as dog or flower. LABEL_DETECTION = 1; // Human face detection and tracking. FACE_DETECTION = 2; // Shot change detection. SHOT_CHANGE_DETECTION = 3; // Safe search detection. SAFE_SEARCH_DETECTION = 4; } // Label level (scope). enum LabelLevel { // Unspecified. LABEL_LEVEL_UNSPECIFIED = 0; // Video-level. Corresponds to the whole video. VIDEO_LEVEL = 1; // Segment-level. Corresponds to one of `AnnotateSpec.segments`. SEGMENT_LEVEL = 2; // Shot-level. Corresponds to a single shot (i.e. a series of frames // without a major camera position or background change). SHOT_LEVEL = 3; // Frame-level. Corresponds to a single video frame. FRAME_LEVEL = 4; } // Label detection mode. enum LabelDetectionMode { // Unspecified. LABEL_DETECTION_MODE_UNSPECIFIED = 0; // Detect shot-level labels. SHOT_MODE = 1; // Detect frame-level labels. FRAME_MODE = 2; // Detect both shot-level and frame-level labels. SHOT_AND_FRAME_MODE = 3; } // Bucketized representation of likelihood. enum Likelihood { // Unknown likelihood. UNKNOWN = 0; // Very unlikely. VERY_UNLIKELY = 1; // Unlikely. UNLIKELY = 2; // Possible. POSSIBLE = 3; // Likely. LIKELY = 4; // Very likely. VERY_LIKELY = 5; }