blob: 119e10fc6ae8ef7b1f2df5b432b3146923db8d2d [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.media;
import androidx.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
class BitrateAdjuster {
@IntDef({Type.NO_ADJUSTMENT, Type.FRAMERATE_ADJUSTMENT})
@Retention(RetentionPolicy.SOURCE)
public @interface Type {
// No adjustment - video encoder has no known bitrate problem.
int NO_ADJUSTMENT = 0;
// Framerate based bitrate adjustment is required - HW encoder does not use frame
// timestamps to calculate frame bitrate budget and instead is relying on initial
// fps configuration assuming that all frames are coming at fixed initial frame rate.
int FRAMERATE_ADJUSTMENT = 1;
}
private static final int FRAMERATE_ADJUSTMENT_BITRATE_ADJUSTMENT_FPS = 30;
// Gets the adjusted bitrate according to the implementation's adjustment policy.
public static int getTargetBitrate(@Type int type, int bps, int frameRate) {
switch (type) {
case Type.NO_ADJUSTMENT:
return bps;
case Type.FRAMERATE_ADJUSTMENT:
return frameRate == 0
? bps
: FRAMERATE_ADJUSTMENT_BITRATE_ADJUSTMENT_FPS * bps / frameRate;
}
return 0;
}
// Gets the initial frame rate of the media. The frameRateHint can be used as a default or a
// constraint.
public static int getInitialFrameRate(@Type int type, int frameRateHint) {
switch (type) {
case Type.NO_ADJUSTMENT:
return Math.min(frameRateHint, 30); // 30 = MAXIMUM_INITIAL_FPS
case Type.FRAMERATE_ADJUSTMENT:
return FRAMERATE_ADJUSTMENT_BITRATE_ADJUSTMENT_FPS;
}
return 0;
}
}