Skip to content

Commit c951027

Browse files
bschaatsbergenc2thornBBBmau
authored
Add Google Transcoder API (#10932)
Co-authored-by: Cameron Thornton <[email protected]> Co-authored-by: BBBmau <[email protected]>
1 parent 5e938c6 commit c951027

17 files changed

+2373
-0
lines changed

mmv1/products/transcoder/Job.yaml

+571
Large diffs are not rendered by default.

mmv1/products/transcoder/JobTemplate.yaml

+520
Large diffs are not rendered by default.

mmv1/products/transcoder/product.yaml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Copyright 2024 Google Inc.
2+
# Licensed under the Apache License, Version 2.0 (the "License");
3+
# you may not use this file except in compliance with the License.
4+
# You may obtain a copy of the License at
5+
#
6+
# http://www.apache.org/licenses/LICENSE-2.0
7+
#
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
# See the License for the specific language governing permissions and
12+
# limitations under the License.
13+
14+
---
15+
name: 'Transcoder'
16+
display_name: 'Transcoder'
17+
versions:
18+
- name: 'ga'
19+
base_url: 'https://transcoder.googleapis.com/v1/'
20+
scopes:
21+
- 'https://www.googleapis.com/auth/cloud-platform'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
resource "google_storage_bucket" "default" {
2+
name = "{{index $.Vars "bucket_name"}}"
3+
location = "US"
4+
force_destroy = true
5+
6+
uniform_bucket_level_access = true
7+
public_access_prevention = "enforced"
8+
}
9+
10+
resource "google_storage_bucket_object" "example_mp4" {
11+
name = "example.mp4"
12+
source = "./test-fixtures/example.mp4"
13+
bucket = google_storage_bucket.default.name
14+
}
15+
16+
resource "google_transcoder_job" "{{$.PrimaryResourceId}}" {
17+
template_id = google_transcoder_job_template.default.name
18+
location = "us-central1"
19+
20+
labels = {
21+
"label" = "key"
22+
}
23+
}
24+
25+
resource "google_transcoder_job_template" "default" {
26+
job_template_id = "{{index $.Vars "job_template_id"}}"
27+
location = "us-central1"
28+
config {
29+
inputs {
30+
key = "input0"
31+
uri = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.example_mp4.name}"
32+
}
33+
output {
34+
uri = "gs://${google_storage_bucket.default.name}/outputs/"
35+
}
36+
edit_list {
37+
key = "atom0"
38+
inputs = ["input0"]
39+
start_time_offset = "0s"
40+
}
41+
elementary_streams {
42+
key = "video-stream0"
43+
video_stream {
44+
h264 {
45+
width_pixels = 640
46+
height_pixels = 360
47+
bitrate_bps = 550000
48+
frame_rate = 60
49+
pixel_format = "yuv420p"
50+
rate_control_mode = "vbr"
51+
crf_level = 21
52+
gop_duration = "3s"
53+
vbv_size_bits = 550000
54+
vbv_fullness_bits = 495000
55+
entropy_coder = "cabac"
56+
profile = "high"
57+
preset = "veryfast"
58+
59+
}
60+
}
61+
}
62+
elementary_streams {
63+
key = "video-stream1"
64+
video_stream {
65+
h264 {
66+
width_pixels = 1280
67+
height_pixels = 720
68+
bitrate_bps = 550000
69+
frame_rate = 60
70+
pixel_format = "yuv420p"
71+
rate_control_mode = "vbr"
72+
crf_level = 21
73+
gop_duration = "3s"
74+
vbv_size_bits = 2500000
75+
vbv_fullness_bits = 2250000
76+
entropy_coder = "cabac"
77+
profile = "high"
78+
preset = "veryfast"
79+
}
80+
}
81+
}
82+
elementary_streams {
83+
key = "audio-stream0"
84+
audio_stream {
85+
codec = "aac"
86+
bitrate_bps = 64000
87+
channel_count = 2
88+
channel_layout = ["fl", "fr"]
89+
sample_rate_hertz = 48000
90+
}
91+
}
92+
mux_streams {
93+
key = "sd"
94+
file_name = "sd.mp4"
95+
container = "mp4"
96+
elementary_streams = ["video-stream0", "audio-stream0"]
97+
}
98+
mux_streams {
99+
key = "hd"
100+
file_name = "hd.mp4"
101+
container = "mp4"
102+
elementary_streams = ["video-stream1", "audio-stream0"]
103+
}
104+
}
105+
labels = {
106+
"label" = "key"
107+
}
108+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
resource "google_storage_bucket" "default" {
2+
name = "{{index $.Vars "bucket_name"}}"
3+
location = "US"
4+
force_destroy = true
5+
6+
uniform_bucket_level_access = true
7+
public_access_prevention = "enforced"
8+
provider = google-beta
9+
}
10+
11+
resource "google_storage_bucket_object" "example_mp4" {
12+
name = "example.mp4"
13+
source = "./test-fixtures/example.mp4"
14+
bucket = google_storage_bucket.default.name
15+
provider = google-beta
16+
}
17+
18+
resource "google_secret_manager_secret" "encryption_key" {
19+
secret_id = "{{index $.Vars "secret_manager_secret_id"}}"
20+
replication {
21+
auto {}
22+
}
23+
provider = google-beta
24+
}
25+
26+
resource "google_secret_manager_secret_version" "encryption_key" {
27+
secret = google_secret_manager_secret.encryption_key.name
28+
secret_data = "4A67F2C1B8E93A4F6D3E7890A1BC23DF"
29+
provider = google-beta
30+
}
31+
32+
data "google_project" "project" {
33+
provider = google-beta
34+
}
35+
36+
# this is required to allow the transcoder service identity to access the secret
37+
resource "google_project_service_identity" "transcoder" {
38+
project = data.google_project.project.project_id
39+
service = "transcoder.googleapis.com"
40+
provider = google-beta
41+
}
42+
43+
resource "google_secret_manager_secret_iam_member" "transcoder_encryption_key_accessor" {
44+
secret_id = google_secret_manager_secret.encryption_key.secret_id
45+
project = google_secret_manager_secret.encryption_key.project
46+
role = "roles/secretmanager.secretAccessor"
47+
member = "serviceAccount:${google_project_service_identity.transcoder.email}"
48+
provider = google-beta
49+
}
50+
51+
resource "google_transcoder_job" "{{$.PrimaryResourceId}}" {
52+
location = "us-central1"
53+
54+
config {
55+
inputs {
56+
key = "input0"
57+
uri = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.example_mp4.name}"
58+
}
59+
elementary_streams {
60+
key = "es_video"
61+
video_stream {
62+
h264 {
63+
profile = "main"
64+
height_pixels = 600
65+
width_pixels = 800
66+
bitrate_bps = 1000000
67+
frame_rate = 60
68+
}
69+
}
70+
}
71+
elementary_streams {
72+
key = "es_audio"
73+
audio_stream {
74+
codec = "aac"
75+
channel_count = 2
76+
bitrate_bps = 160000
77+
}
78+
}
79+
encryptions {
80+
id = "aes-128"
81+
secret_manager_key_source {
82+
secret_version = google_secret_manager_secret_version.encryption_key.name
83+
}
84+
drm_systems {
85+
clearkey {}
86+
}
87+
aes128 {}
88+
}
89+
encryptions {
90+
id = "cenc"
91+
secret_manager_key_source {
92+
secret_version = google_secret_manager_secret_version.encryption_key.name
93+
}
94+
drm_systems {
95+
widevine {}
96+
}
97+
mpeg_cenc {
98+
scheme = "cenc"
99+
}
100+
}
101+
encryptions {
102+
id = "cbcs"
103+
secret_manager_key_source {
104+
secret_version = google_secret_manager_secret_version.encryption_key.name
105+
}
106+
drm_systems {
107+
widevine {}
108+
}
109+
mpeg_cenc {
110+
scheme = "cbcs"
111+
}
112+
}
113+
mux_streams {
114+
key = "ts_aes128"
115+
container = "ts"
116+
elementary_streams = ["es_video", "es_audio"]
117+
segment_settings {
118+
segment_duration = "6s"
119+
}
120+
encryption_id = "aes-128"
121+
}
122+
mux_streams {
123+
key = "fmp4_cenc_video"
124+
container = "fmp4"
125+
elementary_streams = ["es_video"]
126+
segment_settings {
127+
segment_duration = "6s"
128+
}
129+
encryption_id = "cenc"
130+
}
131+
mux_streams {
132+
key = "fmp4_cenc_audio"
133+
container = "fmp4"
134+
elementary_streams = ["es_audio"]
135+
segment_settings {
136+
segment_duration = "6s"
137+
}
138+
encryption_id = "cenc"
139+
}
140+
mux_streams {
141+
key = "fmp4_cbcs_video"
142+
container = "fmp4"
143+
elementary_streams = ["es_video"]
144+
segment_settings {
145+
segment_duration = "6s"
146+
}
147+
encryption_id = "cbcs"
148+
}
149+
mux_streams {
150+
key = "fmp4_cbcs_audio"
151+
container = "fmp4"
152+
elementary_streams = ["es_audio"]
153+
segment_settings {
154+
segment_duration = "6s"
155+
}
156+
encryption_id = "cbcs"
157+
}
158+
manifests {
159+
file_name = "manifest_aes128.m3u8"
160+
type = "HLS"
161+
mux_streams = ["ts_aes128"]
162+
}
163+
manifests {
164+
file_name = "manifest_cenc.mpd"
165+
type = "DASH"
166+
mux_streams = ["fmp4_cenc_video", "fmp4_cenc_audio"]
167+
}
168+
manifests {
169+
file_name = "manifest_cbcs.mpd"
170+
type = "DASH"
171+
mux_streams = ["fmp4_cbcs_video", "fmp4_cbcs_audio"]
172+
}
173+
output {
174+
uri = "gs://${google_storage_bucket.default.name}/outputs/"
175+
}
176+
}
177+
labels = {
178+
"label" = "key"
179+
}
180+
provider = google-beta
181+
}

0 commit comments

Comments
 (0)