Skip to content
This repository was archived by the owner on Apr 21, 2020. It is now read-only.

Commit b71f220

Browse files
authored
adding av1 (#148)
1 parent 7badfc6 commit b71f220

File tree

5 files changed

+147
-3
lines changed

5 files changed

+147
-3
lines changed

provider/mediaconvert/av1.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package mediaconvert
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
8+
"github.com/aws/aws-sdk-go-v2/service/mediaconvert"
9+
"github.com/aws/aws-sdk-go/aws"
10+
"github.com/cbsinteractive/video-transcoding-api/db"
11+
"github.com/pkg/errors"
12+
)
13+
14+
func av1CodecSettingsFrom(preset db.Preset) (*mediaconvert.VideoCodecSettings, error) {
15+
bitrate, err := strconv.ParseInt(preset.Video.Bitrate, 10, 64)
16+
if err != nil {
17+
return nil, errors.Wrapf(err, "parsing video bitrate %q to int64", preset.Video.Bitrate)
18+
}
19+
20+
gopSize, err := av1GopSizeFrom(preset.Video.GopUnit, preset.Video.GopSize)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
return &mediaconvert.VideoCodecSettings{
26+
Codec: mediaconvert.VideoCodecAv1,
27+
Av1Settings: &mediaconvert.Av1Settings{
28+
MaxBitrate: aws.Int64(bitrate),
29+
GopSize: aws.Float64(gopSize),
30+
QvbrSettings: &mediaconvert.Av1QvbrSettings{
31+
QvbrQualityLevel: aws.Int64(7),
32+
QvbrQualityLevelFineTune: aws.Float64(0),
33+
},
34+
RateControlMode: mediaconvert.Av1RateControlModeQvbr,
35+
},
36+
}, nil
37+
}
38+
39+
func av1GopSizeFrom(gopUnit string, gopSize string) (float64, error) {
40+
switch strings.ToLower(gopUnit) {
41+
case "", db.GopUnitFrames:
42+
f, err := strconv.ParseFloat(gopSize, 64)
43+
if err != nil {
44+
return 0, errors.Wrapf(err, "parsing gop size %q to float64", gopSize)
45+
}
46+
return f, nil
47+
case db.GopUnitSeconds:
48+
return 0, fmt.Errorf("gop unit %q is not supported with mediaconvert and AV1", gopUnit)
49+
default:
50+
return 0, fmt.Errorf("gop unit %q is not supported with mediaconvert", gopUnit)
51+
}
52+
}

provider/mediaconvert/h264.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func h264CodecSettingsFrom(preset db.Preset) (*mediaconvert.VideoCodecSettings,
1919

2020
gopSize, err := strconv.ParseFloat(preset.Video.GopSize, 64)
2121
if err != nil {
22-
return nil, errors.Wrapf(err, "parsing gop size %q to int64", preset.Video.GopSize)
22+
return nil, errors.Wrapf(err, "parsing gop size %q to float64", preset.Video.GopSize)
2323
}
2424

2525
gopUnit, err := h264GopUnitFrom(preset.Video.GopUnit)

provider/mediaconvert/h265.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func h265CodecSettingsFrom(preset db.Preset) (*mediaconvert.VideoCodecSettings,
1919

2020
gopSize, err := strconv.ParseFloat(preset.Video.GopSize, 64)
2121
if err != nil {
22-
return nil, errors.Wrapf(err, "parsing gop size %q to int64", preset.Video.GopSize)
22+
return nil, errors.Wrapf(err, "parsing gop size %q to float64", preset.Video.GopSize)
2323
}
2424

2525
gopUnit, err := h265GopUnitFrom(preset.Video.GopUnit)

provider/mediaconvert/mediaconvert_test.go

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,22 @@ var (
5656
},
5757
}
5858

59+
av1Preset = db.Preset{
60+
Name: "yet_another_preset_name",
61+
Description: "test_desc",
62+
Container: "mp4",
63+
TwoPass: false,
64+
Video: db.VideoPreset{
65+
Width: "300",
66+
Height: "400",
67+
Codec: "av1",
68+
Bitrate: "400000",
69+
GopSize: "120",
70+
GopUnit: "frames",
71+
InterlaceMode: "progressive",
72+
},
73+
}
74+
5975
defaultJob = db.Job{
6076
ID: "jobID",
6177
ProviderName: Name,
@@ -236,7 +252,7 @@ func Test_mcProvider_CreatePreset_fields(t *testing.T) {
236252
p.Video.GopSize = "gop"
237253
return p
238254
},
239-
wantErrMsg: `generating video preset: building h264 codec settings: parsing gop size "gop" to int64: strconv.ParseFloat: parsing "gop": invalid syntax`,
255+
wantErrMsg: `generating video preset: building h264 codec settings: parsing gop size "gop" to float64: strconv.ParseFloat: parsing "gop": invalid syntax`,
240256
},
241257
{
242258
name: "unrecognized rate control mode returns an error",
@@ -515,6 +531,75 @@ func Test_mcProvider_Transcode(t *testing.T) {
515531
},
516532
},
517533
},
534+
{
535+
name: "a valid av1 video-only mp4 transcode job is mapped correctly to a mediaconvert job input",
536+
job: &db.Job{
537+
ID: "jobID",
538+
ProviderName: Name,
539+
SourceMedia: "s3://some/path.mp4",
540+
Outputs: []db.TranscodeOutput{{Preset: db.PresetMap{Name: av1Preset.Name}, FileName: "file1.mp4"}},
541+
},
542+
preset: av1Preset,
543+
destination: "s3://some/destination",
544+
wantJobReq: mediaconvert.CreateJobInput{
545+
Role: aws.String(""),
546+
Queue: aws.String(""),
547+
Settings: &mediaconvert.JobSettings{
548+
Inputs: []mediaconvert.Input{
549+
{
550+
AudioSelectors: map[string]mediaconvert.AudioSelector{
551+
"Audio Selector 1": {
552+
DefaultSelection: mediaconvert.AudioDefaultSelectionDefault,
553+
},
554+
},
555+
FileInput: aws.String("s3://some/path.mp4"),
556+
VideoSelector: &mediaconvert.VideoSelector{
557+
ColorSpace: mediaconvert.ColorSpaceFollow,
558+
},
559+
},
560+
},
561+
OutputGroups: []mediaconvert.OutputGroup{
562+
{
563+
OutputGroupSettings: &mediaconvert.OutputGroupSettings{
564+
Type: mediaconvert.OutputGroupTypeFileGroupSettings,
565+
FileGroupSettings: &mediaconvert.FileGroupSettings{
566+
Destination: aws.String("s3://some/destination/jobID/m"),
567+
},
568+
},
569+
Outputs: []mediaconvert.Output{
570+
{
571+
NameModifier: aws.String("file1"),
572+
ContainerSettings: &mediaconvert.ContainerSettings{
573+
Container: mediaconvert.ContainerTypeMp4,
574+
},
575+
VideoDescription: &mediaconvert.VideoDescription{
576+
Height: aws.Int64(400),
577+
Width: aws.Int64(300),
578+
RespondToAfd: mediaconvert.RespondToAfdNone,
579+
ScalingBehavior: mediaconvert.ScalingBehaviorDefault,
580+
TimecodeInsertion: mediaconvert.VideoTimecodeInsertionDisabled,
581+
AntiAlias: mediaconvert.AntiAliasEnabled,
582+
CodecSettings: &mediaconvert.VideoCodecSettings{
583+
Codec: mediaconvert.VideoCodecAv1,
584+
Av1Settings: &mediaconvert.Av1Settings{
585+
MaxBitrate: aws.Int64(400000),
586+
GopSize: aws.Float64(120),
587+
QvbrSettings: &mediaconvert.Av1QvbrSettings{
588+
QvbrQualityLevel: aws.Int64(7),
589+
QvbrQualityLevelFineTune: aws.Float64(0),
590+
},
591+
RateControlMode: mediaconvert.Av1RateControlModeQvbr,
592+
},
593+
},
594+
},
595+
Extension: aws.String("mp4"),
596+
},
597+
},
598+
},
599+
},
600+
},
601+
},
602+
},
518603
}
519604

520605
for _, tt := range tests {

provider/mediaconvert/preset_mapping.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,13 @@ func videoPresetFrom(preset db.Preset) (*mediaconvert.VideoDescription, error) {
151151
return nil, errors.Wrap(err, "building h265 codec settings")
152152
}
153153

154+
videoPreset.CodecSettings = settings
155+
case "av1":
156+
settings, err := av1CodecSettingsFrom(preset)
157+
if err != nil {
158+
return nil, errors.Wrap(err, "building av1 codec settings")
159+
}
160+
154161
videoPreset.CodecSettings = settings
155162
default:
156163
return nil, fmt.Errorf("video codec %q is not yet supported with mediaconvert", codec)

0 commit comments

Comments
 (0)