Skip to content

Commit af92630

Browse files
authored
add bframe setting in preset (#293)
* add bframe setting in preset
1 parent cc943f9 commit af92630

File tree

11 files changed

+76
-19
lines changed

11 files changed

+76
-19
lines changed

db/types.go

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ type VideoPreset struct {
119119
GopSize string `json:"gopSize,omitempty" redis-hash:"gopsize,omitempty"`
120120
GopMode string `json:"gopMode,omitempty" redis-hash:"gopmode,omitempty"`
121121
InterlaceMode string `json:"interlaceMode,omitempty" redis-hash:"interlacemode,omitempty"`
122+
BFrames string `json:"bframes,omitempty" redis-hash:"bframes,omitempty"`
122123
}
123124

124125
// AudioPreset defines the set of parameters for audio on a given preset

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ require (
1818
github.com/onsi/gomega v1.5.0 // indirect
1919
github.com/pkg/errors v0.8.1
2020
github.com/sirupsen/logrus v1.4.2
21-
github.com/video-dev/go-elementalconductor v1.0.0
21+
github.com/video-dev/go-elementalconductor v1.1.0
2222
github.com/video-dev/go-encodingcom v1.0.0
2323
github.com/video-dev/zencoder v0.0.0-20161215190743-745874544382
2424
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
168168
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
169169
github.com/video-dev/go-elementalconductor v1.0.0 h1:vnWf1sAXgdTKhsHhAWOwKMBCPA+p0Rr8+ZotVUEes/4=
170170
github.com/video-dev/go-elementalconductor v1.0.0/go.mod h1:DwQxx5JUDRY0+/6OcAROOaOEUW6/FnOCDBkTVnWuJTM=
171+
github.com/video-dev/go-elementalconductor v1.1.0 h1:T+voFHpYQKrjH+72KywQO7v+qnzcFYD+YZFpRCLQYUU=
172+
github.com/video-dev/go-elementalconductor v1.1.0/go.mod h1:DwQxx5JUDRY0+/6OcAROOaOEUW6/FnOCDBkTVnWuJTM=
171173
github.com/video-dev/go-encodingcom v1.0.0 h1:OiVfdy9qUrKGfOID5TYwoBzvObNx9EQNI041ZA0kZ38=
172174
github.com/video-dev/go-encodingcom v1.0.0/go.mod h1:7O86jGr922w65EzPw83u2w36Mm+S90zdy4stfYFxelg=
173175
github.com/video-dev/zencoder v0.0.0-20161215190743-745874544382 h1:n83HJM7e1ECRGC6Q9Wb28Jmh/GwT973/r7x71QGyJrc=

internal/provider/bitmovin/bitmovin.go

+7
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,13 @@ func (p *bitmovinProvider) createH264VideoPreset(preset db.Preset, customData ma
228228
}
229229
h264.MaxGOP = intToPtr(int64(gopSize))
230230
}
231+
if preset.Video.BFrames != "" {
232+
bFrames, err := strconv.Atoi(preset.Video.BFrames)
233+
if err != nil {
234+
return nil, err
235+
}
236+
h264.BFrames = intToPtr(int64(bFrames))
237+
}
231238

232239
return h264, nil
233240
}

internal/provider/elementalconductor/elementalconductor.go

+4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ func (p *elementalConductorProvider) CreatePreset(preset db.Preset) (string, err
7070
elementalConductorPreset.AudioCodec = preset.Audio.Codec
7171
elementalConductorPreset.AudioBitrate = preset.Audio.Bitrate
7272

73+
if preset.Video.BFrames != "" {
74+
elementalConductorPreset.GopNumBFrames = preset.Video.BFrames
75+
}
76+
7377
result, err := p.client.CreatePreset(&elementalConductorPreset)
7478
if err != nil {
7579
return "", err

internal/provider/encodingcom/encodingcom.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ func (e *encodingComProvider) Transcode(job *db.Job) (*provider.JobStatus, error
7272
}
7373

7474
func (e *encodingComProvider) CreatePreset(preset db.Preset) (string, error) {
75-
resp, err := e.client.SavePreset(preset.Name, e.presetToFormat(preset))
75+
format, err := e.presetToFormat(preset)
76+
if err != nil {
77+
return "", err
78+
}
79+
80+
resp, err := e.client.SavePreset(preset.Name, format)
7681
if err != nil {
7782
return "", err
7883
}
@@ -91,7 +96,7 @@ func (e *encodingComProvider) sourceMedia(original string) string {
9196
return original
9297
}
9398

94-
func (e *encodingComProvider) presetToFormat(preset db.Preset) encodingcom.Format {
99+
func (e *encodingComProvider) presetToFormat(preset db.Preset) (encodingcom.Format, error) {
95100
falseYesNoBoolean := encodingcom.YesNoBoolean(false)
96101
format := encodingcom.Format{
97102
Output: []string{preset.Container},
@@ -112,8 +117,18 @@ func (e *encodingComProvider) presetToFormat(preset db.Preset) encodingcom.Forma
112117
format.AudioCodec = e.getNormalizedCodec(preset.Audio.Codec)
113118
format.VideoCodec = e.getNormalizedCodec(preset.Video.Codec)
114119
format.Size = e.getSize(preset.Video.Width, preset.Video.Height)
120+
121+
if preset.Video.BFrames != "" {
122+
bframes, err := strconv.Atoi(preset.Video.BFrames)
123+
if err != nil {
124+
return format, err
125+
}
126+
127+
format.Bframes = bframes
128+
}
115129
}
116-
return format
130+
131+
return format, nil
117132
}
118133

119134
func (e *encodingComProvider) buildStream(preset db.Preset) []encodingcom.Stream {

internal/provider/encodingcom/encodingcom_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,12 @@ func TestPresetToFormat(t *testing.T) {
12161216
}
12171217
var p encodingComProvider
12181218
for _, test := range tests {
1219-
resultingFormat := p.presetToFormat(test.givenPreset)
1219+
resultingFormat, err := p.presetToFormat(test.givenPreset)
1220+
1221+
if err != nil {
1222+
t.Fatalf("Failed to convert preset to format: %#v", test.givenPreset)
1223+
}
1224+
12201225
if !reflect.DeepEqual(resultingFormat, test.expectedFormat) {
12211226
t.Errorf("%s: presetToFormat: wrong value. Want %#v. Got %#v", test.givenTestCase, test.expectedFormat, resultingFormat)
12221227
pretty.Fdiff(os.Stderr, resultingFormat, test.expectedFormat)

internal/provider/mediaconvert/mediaconvert_test.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var (
2828
Bitrate: "400000",
2929
GopSize: "120",
3030
InterlaceMode: "progressive",
31+
BFrames: "3",
3132
},
3233
Audio: db.AudioPreset{
3334
Codec: "aac",
@@ -92,13 +93,14 @@ func Test_mcProvider_CreatePreset(t *testing.T) {
9293
CodecSettings: &mediaconvert.VideoCodecSettings{
9394
Codec: mediaconvert.VideoCodecH264,
9495
H264Settings: &mediaconvert.H264Settings{
95-
Bitrate: aws.Int64(400000),
96-
CodecLevel: mediaconvert.H264CodecLevelLevel41,
97-
CodecProfile: mediaconvert.H264CodecProfileHigh,
98-
InterlaceMode: mediaconvert.H264InterlaceModeProgressive,
99-
QualityTuningLevel: mediaconvert.H264QualityTuningLevelMultiPassHq,
100-
RateControlMode: mediaconvert.H264RateControlModeVbr,
101-
GopSize: aws.Float64(120),
96+
Bitrate: aws.Int64(400000),
97+
CodecLevel: mediaconvert.H264CodecLevelLevel41,
98+
CodecProfile: mediaconvert.H264CodecProfileHigh,
99+
InterlaceMode: mediaconvert.H264InterlaceModeProgressive,
100+
QualityTuningLevel: mediaconvert.H264QualityTuningLevelMultiPassHq,
101+
RateControlMode: mediaconvert.H264RateControlModeVbr,
102+
GopSize: aws.Float64(120),
103+
NumberBFramesBetweenReferenceFrames: aws.Int64(3),
102104
},
103105
},
104106
},

internal/provider/mediaconvert/preset_mapping.go

+18-7
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,27 @@ func videoPresetFrom(preset db.Preset) (*mediaconvert.VideoDescription, error) {
182182
tuning = mediaconvert.H264QualityTuningLevelMultiPassHq
183183
}
184184

185+
var bframes *int64
186+
if preset.Video.BFrames != "" {
187+
b, err := strconv.ParseInt(preset.Video.BFrames, 10, 64)
188+
189+
if err != nil {
190+
return nil, errors.Wrapf(err, "parsing bframes %q to int64", preset.Video.BFrames)
191+
}
192+
bframes = &b
193+
}
194+
185195
videoPreset.CodecSettings = &mediaconvert.VideoCodecSettings{
186196
Codec: mediaconvert.VideoCodecH264,
187197
H264Settings: &mediaconvert.H264Settings{
188-
Bitrate: aws.Int64(bitrate),
189-
GopSize: aws.Float64(gopSize),
190-
RateControlMode: rateControl,
191-
CodecProfile: profile,
192-
CodecLevel: level,
193-
InterlaceMode: interlaceMode,
194-
QualityTuningLevel: tuning,
198+
Bitrate: aws.Int64(bitrate),
199+
GopSize: aws.Float64(gopSize),
200+
RateControlMode: rateControl,
201+
CodecProfile: profile,
202+
CodecLevel: level,
203+
InterlaceMode: interlaceMode,
204+
QualityTuningLevel: tuning,
205+
NumberBFramesBetweenReferenceFrames: bframes,
195206
},
196207
}
197208
default:

internal/provider/zencoder/zencoder.go

+8
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,14 @@ func (z *zencoderProvider) buildOutput(job *db.Job, preset db.Preset, filename s
236236
if preset.Video.Codec == "h264" {
237237
zencoderOutput.H264Profile = strings.ToLower(preset.Video.Profile)
238238
zencoderOutput.H264Level = strings.ToLower(preset.Video.ProfileLevel)
239+
240+
if preset.Video.BFrames != "" {
241+
bframes, err := strconv.ParseInt(preset.Video.BFrames, 10, 32)
242+
if err != nil {
243+
return zencoder.OutputSettings{}, fmt.Errorf("error converting preset bframes (%q): %s ", preset.Video.BFrames, err)
244+
}
245+
zencoderOutput.H264Bframes = int32(bframes)
246+
}
239247
}
240248
if preset.RateControl == "CBR" {
241249
zencoderOutput.ConstantBitrate = true

internal/provider/zencoder/zencoder_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ func TestGetPreset(t *testing.T) {
130130
GopMode: "fixed",
131131
GopSize: "90",
132132
Height: "1080",
133+
BFrames: "4",
133134
},
134135
Audio: db.AudioPreset{
135136
Bitrate: "128000",
@@ -163,6 +164,7 @@ func TestZencoderDeletePreset(t *testing.T) {
163164
GopMode: "fixed",
164165
GopSize: "90",
165166
Height: "1080",
167+
BFrames: "3",
166168
},
167169
Audio: db.AudioPreset{
168170
Bitrate: "128000",

0 commit comments

Comments
 (0)