blob: a9654bb8a8b75ee599e079fd180d62c2b88e6128 [file] [log] [blame]
/*
* Copyright 2024, The Android Open Source Project
*
* 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.
*/
#ifndef ENCODER_CAPABILITIES_H_
#define ENCODER_CAPABILITIES_H_
#include <media/CodecCapabilitiesUtils.h>
#include <media/stagefright/foundation/AMessage.h>
#include <utils/StrongPointer.h>
namespace android {
/**
* A class that supports querying the encoding capabilities of a codec.
*/
struct EncoderCapabilities {
/**
* Returns the supported range of quality values.
*
* Quality is implementation-specific. As a general rule, a higher quality
* setting results in a better image quality and a lower compression ratio.
*/
const Range<int>& getQualityRange();
/**
* Returns the supported range of encoder complexity values.
* <p>
* Some codecs may support multiple complexity levels, where higher
* complexity values use more encoder tools (e.g. perform more
* intensive calculations) to improve the quality or the compression
* ratio. Use a lower value to save power and/or time.
*/
const Range<int>& getComplexityRange();
/** Constant quality mode */
inline static constexpr int BITRATE_MODE_CQ = 0;
/** Variable bitrate mode */
inline static constexpr int BITRATE_MODE_VBR = 1;
/** Constant bitrate mode */
inline static constexpr int BITRATE_MODE_CBR = 2;
/** Constant bitrate mode with frame drops */
inline static constexpr int BITRATE_MODE_CBR_FD = 3;
/**
* Query whether a bitrate mode is supported.
*/
bool isBitrateModeSupported(int mode);
/** @hide */
static std::shared_ptr<EncoderCapabilities> Create(std::string mediaType,
std::vector<ProfileLevel> profLevs, const sp<AMessage> &format);
/** @hide */
void getDefaultFormat(sp<AMessage> &format);
/** @hide */
bool supportsFormat(const sp<AMessage> &format);
private:
inline static const Feature sBitrateModes[] = {
Feature("VBR", BITRATE_MODE_VBR, true),
Feature("CBR", BITRATE_MODE_CBR, false),
Feature("CQ", BITRATE_MODE_CQ, false),
Feature("CBR-FD", BITRATE_MODE_CBR_FD, false)
};
static int ParseBitrateMode(std::string mode);
std::string mMediaType;
std::vector<ProfileLevel> mProfileLevels;
Range<int> mQualityRange;
Range<int> mComplexityRange;
int mBitControl;
int mDefaultComplexity;
int mDefaultQuality;
std::string mQualityScale;
/* no public constructor */
EncoderCapabilities() {}
void init(std::string mediaType, std::vector<ProfileLevel> profLevs,
const sp<AMessage> &format);
void applyLevelLimits();
void parseFromInfo(const sp<AMessage> &format);
bool supports(std::optional<int> complexity, std::optional<int> quality,
std::optional<int> profile);
};
} // namespace android
#endif // ENCODER_CAPABILITIES_H_