Skip to content

Commit

Permalink
Merge AP3A.240419.007
Browse files Browse the repository at this point in the history
Change-Id: I32ea72f78b2befe8a4d192c3b1d0bb00146d860b
  • Loading branch information
Scott Lobdell committed Apr 26, 2024
2 parents fde9a56 + 5b7ad60 commit e6a43b1
Show file tree
Hide file tree
Showing 37 changed files with 729 additions and 276 deletions.
20 changes: 20 additions & 0 deletions media/aconfig/codec_fwk.aconfig
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,26 @@ flag {
bug: "325549730"
}

flag {
name: "set_callback_stall"
namespace: "codec_fwk"
description: "Bugfix flag for setCallback stall"
bug: "326010604"
metadata {
purpose: PURPOSE_BUGFIX
}
}

flag {
name: "set_state_early"
namespace: "codec_fwk"
description: "Bugfix flag for setting state early to avoid a race condition"
bug: "298613711"
metadata {
purpose: PURPOSE_BUGFIX
}
}

flag {
name: "teamfood"
namespace: "codec_fwk"
Expand Down
80 changes: 80 additions & 0 deletions media/codec2/components/aom/C2SoftAomEnc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@

#include "C2SoftAomEnc.h"

/* Quantization param values defined by the spec */
#define AOM_QP_MIN 0
#define AOM_QP_MAX 63
#define AOM_QP_DEFAULT_MIN AOM_QP_MIN
#define AOM_QP_DEFAULT_MAX AOM_QP_MAX

namespace android {

constexpr char COMPONENT_NAME[] = "c2.android.av1.encoder";
Expand Down Expand Up @@ -175,6 +181,19 @@ C2SoftAomEnc::IntfImpl::IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helpe
.inRange(C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)})
.withSetter(CodedColorAspectsSetter, mColorAspects)
.build());

addParameter(
DefineParam(mPictureQuantization, C2_PARAMKEY_PICTURE_QUANTIZATION)
.withDefault(C2StreamPictureQuantizationTuning::output::AllocShared(
0 /* flexCount */, 0u /* stream */))
.withFields({C2F(mPictureQuantization, m.values[0].type_).oneOf(
{C2Config::I_FRAME, C2Config::P_FRAME}),
C2F(mPictureQuantization, m.values[0].min).inRange(
AOM_QP_DEFAULT_MIN, AOM_QP_DEFAULT_MAX),
C2F(mPictureQuantization, m.values[0].max).inRange(
AOM_QP_DEFAULT_MIN, AOM_QP_DEFAULT_MAX)})
.withSetter(PictureQuantizationSetter)
.build());
}

C2R C2SoftAomEnc::IntfImpl::BitrateSetter(bool mayBlock, C2P<C2StreamBitrateInfo::output>& me) {
Expand Down Expand Up @@ -307,6 +326,54 @@ C2R C2SoftAomEnc::IntfImpl::CodedColorAspectsSetter(
return C2R::Ok();
}

C2R C2SoftAomEnc::IntfImpl::PictureQuantizationSetter(
bool mayBlock, C2P<C2StreamPictureQuantizationTuning::output>& me) {
(void)mayBlock;
int32_t iMin = AOM_QP_DEFAULT_MIN, pMin = AOM_QP_DEFAULT_MIN;
int32_t iMax = AOM_QP_DEFAULT_MAX, pMax = AOM_QP_DEFAULT_MAX;
for (size_t i = 0; i < me.v.flexCount(); ++i) {
const C2PictureQuantizationStruct &layer = me.v.m.values[i];
// layerMin is clamped to [AOM_QP_MIN, layerMax] to avoid error
// cases where layer.min > layer.max
int32_t layerMax = std::clamp(layer.max, AOM_QP_MIN, AOM_QP_MAX);
int32_t layerMin = std::clamp(layer.min, AOM_QP_MIN, layerMax);
if (layer.type_ == C2Config::picture_type_t(I_FRAME)) {
iMax = layerMax;
iMin = layerMin;
ALOGV("iMin %d iMax %d", iMin, iMax);
} else if (layer.type_ == C2Config::picture_type_t(P_FRAME)) {
pMax = layerMax;
pMin = layerMin;
ALOGV("pMin %d pMax %d", pMin, pMax);
}
}
ALOGV("PictureQuantizationSetter(entry): i %d-%d p %d-%d",
iMin, iMax, pMin, pMax);

// aom library takes same range for I/P picture type
int32_t maxFrameQP = std::min(iMax, pMax);
int32_t minFrameQP = std::max(iMin, pMin);
if (minFrameQP > maxFrameQP) {
minFrameQP = maxFrameQP;
}
// put them back into the structure
for (size_t i = 0; i < me.v.flexCount(); ++i) {
const C2PictureQuantizationStruct &layer = me.v.m.values[i];

if (layer.type_ == C2Config::picture_type_t(I_FRAME)) {
me.set().m.values[i].max = maxFrameQP;
me.set().m.values[i].min = minFrameQP;
}
else if (layer.type_ == C2Config::picture_type_t(P_FRAME)) {
me.set().m.values[i].max = maxFrameQP;
me.set().m.values[i].min = minFrameQP;
}
}
ALOGV("PictureQuantizationSetter(exit): minFrameQP = %d maxFrameQP = %d",
minFrameQP, maxFrameQP);
return C2R::Ok();
}

uint32_t C2SoftAomEnc::IntfImpl::getLevel_l() const {
return mProfileLevel->level - LEVEL_AV1_2;
}
Expand Down Expand Up @@ -558,6 +625,7 @@ status_t C2SoftAomEnc::initEncoder() {
mQuality = mIntf->getQuality_l();
mComplexity = mIntf->getComplexity_l();
mAV1EncLevel = mIntf->getLevel_l();
mQpBounds = mIntf->getPictureQuantization_l();
}


Expand All @@ -575,6 +643,18 @@ status_t C2SoftAomEnc::initEncoder() {
break;
}

if (mQpBounds->flexCount() > 0) {
// read min max qp for sequence
for (size_t i = 0; i < mQpBounds->flexCount(); ++i) {
const C2PictureQuantizationStruct &layer = mQpBounds->m.values[i];
if (layer.type_ == C2Config::picture_type_t(I_FRAME)) {
mMaxQuantizer = layer.max;
mMinQuantizer = layer.min;
break;
}
}
}

mCodecInterface = aom_codec_av1_cx();
if (!mCodecInterface) goto CleanUp;

Expand Down
7 changes: 7 additions & 0 deletions media/codec2/components/aom/C2SoftAomEnc.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ struct C2SoftAomEnc : public SimpleC2Component {
std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
std::shared_ptr<C2StreamPictureQuantizationTuning::output> mQpBounds;

aom_codec_err_t setupCodecParameters();
};
Expand All @@ -126,6 +127,8 @@ class C2SoftAomEnc::IntfImpl : public SimpleInterface<void>::BaseParams {
const C2P<C2StreamPictureSizeInfo::input>& size,
const C2P<C2StreamFrameRateInfo::output>& frameRate,
const C2P<C2StreamBitrateInfo::output>& bitrate);
static C2R PictureQuantizationSetter(bool mayBlock,
C2P<C2StreamPictureQuantizationTuning::output> &me);

// unsafe getters
std::shared_ptr<C2StreamPictureSizeInfo::input> getSize_l() const { return mSize; }
Expand All @@ -150,6 +153,9 @@ class C2SoftAomEnc::IntfImpl : public SimpleInterface<void>::BaseParams {
std::shared_ptr<C2StreamPixelFormatInfo::input> getPixelFormat_l() const {
return mPixelFormat;
}
std::shared_ptr<C2StreamPictureQuantizationTuning::output> getPictureQuantization_l() const {
return mPictureQuantization;
}
uint32_t getSyncFramePeriod() const;
static C2R ColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::input>& me);
static C2R CodedColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::output>& me,
Expand All @@ -171,6 +177,7 @@ class C2SoftAomEnc::IntfImpl : public SimpleInterface<void>::BaseParams {
std::shared_ptr<C2StreamColorAspectsInfo::input> mColorAspects;
std::shared_ptr<C2StreamColorAspectsInfo::output> mCodedColorAspects;
std::shared_ptr<C2StreamPixelFormatInfo::input> mPixelFormat;
std::shared_ptr<C2StreamPictureQuantizationTuning::output> mPictureQuantization;

};

Expand Down
11 changes: 4 additions & 7 deletions media/codec2/components/vpx/C2SoftVpxEnc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,12 +354,9 @@ uint32_t C2SoftVpxEnc::IntfImpl::getSyncFramePeriod() const {
return (uint32_t)c2_max(c2_min(period + 0.5, double(UINT32_MAX)), 1.);
}

C2R C2SoftVpxEnc::IntfImpl::PictureQuantizationSetter(bool mayBlock,
C2P<C2StreamPictureQuantizationTuning::output>
&me) {
C2R C2SoftVpxEnc::IntfImpl::PictureQuantizationSetter(
bool mayBlock, C2P<C2StreamPictureQuantizationTuning::output>& me) {
(void)mayBlock;
// these are the ones we're going to set, so want them to default
// to the DEFAULT values for the codec
int32_t iMin = VPX_QP_DEFAULT_MIN, pMin = VPX_QP_DEFAULT_MIN;
int32_t iMax = VPX_QP_DEFAULT_MAX, pMax = VPX_QP_DEFAULT_MAX;
for (size_t i = 0; i < me.v.flexCount(); ++i) {
Expand All @@ -382,8 +379,8 @@ C2R C2SoftVpxEnc::IntfImpl::PictureQuantizationSetter(bool mayBlock,
iMin, iMax, pMin, pMax);

// vpx library takes same range for I/P picture type
int32_t maxFrameQP = std::min({iMax, pMax});
int32_t minFrameQP = std::max({iMin, pMin});
int32_t maxFrameQP = std::min(iMax, pMax);
int32_t minFrameQP = std::max(iMin, pMin);
if (minFrameQP > maxFrameQP) {
minFrameQP = maxFrameQP;
}
Expand Down
6 changes: 3 additions & 3 deletions media/codec2/sfplugin/Codec2Buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1184,7 +1184,7 @@ c2_status_t GetHdrMetadataFromGralloc4Handle(

std::optional<Smpte2086> smpte2086;
status_t status = mapper.getSmpte2086(buffer.get(), &smpte2086);
if (status != OK) {
if (status != OK || !smpte2086) {
err = C2_CORRUPTED;
} else {
if (smpte2086) {
Expand All @@ -1204,7 +1204,7 @@ c2_status_t GetHdrMetadataFromGralloc4Handle(

std::optional<Cta861_3> cta861_3;
status = mapper.getCta861_3(buffer.get(), &cta861_3);
if (status != OK) {
if (status != OK || !cta861_3) {
err = C2_CORRUPTED;
} else {
if (cta861_3) {
Expand All @@ -1223,7 +1223,7 @@ c2_status_t GetHdrMetadataFromGralloc4Handle(
dynamicInfo->reset();
std::optional<std::vector<uint8_t>> vec;
status_t status = mapper.getSmpte2094_40(buffer.get(), &vec);
if (status != OK) {
if (status != OK || !vec) {
dynamicInfo->reset();
err = C2_CORRUPTED;
} else {
Expand Down
60 changes: 32 additions & 28 deletions media/libaudioclient/aidl/fuzzer/audioflinger_aidl_fuzzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ using android::fuzzService;

[[clang::no_destroy]] static std::once_flag gSmOnce;
sp<FakeServiceManager> gFakeServiceManager;
sp<AudioFlingerServerAdapter> gAudioFlingerServerAdapter;

bool addService(const String16& serviceName, const sp<FakeServiceManager>& fakeServiceManager,
FuzzedDataProvider& fdp) {
Expand All @@ -47,22 +48,10 @@ bool addService(const String16& serviceName, const sp<FakeServiceManager>& fakeS
return true;
}

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
FuzzedDataProvider fdp(data, size);

std::call_once(gSmOnce, [&] {
/* Create a FakeServiceManager instance and add required services */
gFakeServiceManager = sp<FakeServiceManager>::make();
setDefaultServiceManager(gFakeServiceManager);
});
gFakeServiceManager->clear();

for (const char* service : {"activity", "sensor_privacy", "permission", "scheduling_policy",
"batterystats", "media.metrics"}) {
if (!addService(String16(service), gFakeServiceManager, fdp)) {
return 0;
}
}
extern "C" int LLVMFuzzerInitialize(int* /*argc*/, char*** /*argv*/) {
/* Create a FakeServiceManager instance and add required services */
gFakeServiceManager = sp<FakeServiceManager>::make();
setDefaultServiceManager(gFakeServiceManager);

auto configService = ndk::SharedRefBase::make<ConfigMock>();
CHECK_EQ(NO_ERROR, AServiceManager_addService(configService.get()->asBinder().get(),
Expand All @@ -80,22 +69,37 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// Disable creating thread pool for fuzzer instance of audio flinger and audio policy services
AudioSystem::disableThreadPool();

const auto audioFlinger = sp<AudioFlinger>::make();
const auto afAdapter = sp<AudioFlingerServerAdapter>::make(audioFlinger);
return 0;
}

CHECK_EQ(NO_ERROR,
gFakeServiceManager->addService(
String16(IAudioFlinger::DEFAULT_SERVICE_NAME), IInterface::asBinder(afAdapter),
false /* allowIsolated */, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT));
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
FuzzedDataProvider fdp(data, size);

const auto audioPolicyService = sp<AudioPolicyService>::make();
for (const char* service : {"activity", "sensor_privacy", "permission", "scheduling_policy",
"batterystats", "media.metrics"}) {
if (!addService(String16(service), gFakeServiceManager, fdp)) {
return 0;
}
}

CHECK_EQ(NO_ERROR,
gFakeServiceManager->addService(String16("media.audio_policy"), audioPolicyService,
false /* allowIsolated */,
IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT));
// TODO(330882064) : Initialise Audio Flinger and Audio Policy services every time
std::call_once(gSmOnce, [&] {
const auto audioFlinger = sp<AudioFlinger>::make();
gAudioFlingerServerAdapter = sp<AudioFlingerServerAdapter>::make(audioFlinger);
CHECK_EQ(NO_ERROR,
gFakeServiceManager->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME),
IInterface::asBinder(gAudioFlingerServerAdapter),
false /* allowIsolated */,
IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT));

const auto audioPolicyService = sp<AudioPolicyService>::make();
CHECK_EQ(NO_ERROR,
gFakeServiceManager->addService(String16("media.audio_policy"), audioPolicyService,
false /* allowIsolated */,
IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT));
});

fuzzService(media::IAudioFlingerService::asBinder(afAdapter), std::move(fdp));
fuzzService(media::IAudioFlingerService::asBinder(gAudioFlingerServerAdapter), std::move(fdp));

return 0;
}
5 changes: 4 additions & 1 deletion media/libaudiohal/impl/DeviceHalAidl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ using aidl::android::media::audio::common::MicrophoneInfo;
using aidl::android::media::audio::IHalAdapterVendorExtension;
using aidl::android::hardware::audio::common::getFrameSizeInBytes;
using aidl::android::hardware::audio::common::isBitPositionFlagSet;
using aidl::android::hardware::audio::common::kDumpFromAudioServerArgument;
using aidl::android::hardware::audio::common::RecordTrackMetadata;
using aidl::android::hardware::audio::core::sounddose::ISoundDose;
using aidl::android::hardware::audio::core::AudioPatch;
Expand Down Expand Up @@ -913,7 +914,9 @@ error::Result<audio_hw_sync_t> DeviceHalAidl::getHwAvSync() {
status_t DeviceHalAidl::dump(int fd, const Vector<String16>& args) {
TIME_CHECK();
if (mModule == nullptr) return NO_INIT;
return mModule->dump(fd, Args(args).args(), args.size());
Vector<String16> newArgs = args;
newArgs.push(String16(kDumpFromAudioServerArgument));
return mModule->dump(fd, Args(newArgs).args(), newArgs.size());
}

status_t DeviceHalAidl::supportsBluetoothVariableLatency(bool* supports) {
Expand Down
2 changes: 1 addition & 1 deletion media/libaudiohal/impl/DeviceHalAidl.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ class DeviceHalAidl : public DeviceHalInterface, public ConversionHelperAidl,
status_t getAudioMixPort(const struct audio_port_v7* devicePort,
struct audio_port_v7* mixPort) override;

status_t dump(int __unused, const Vector<String16>& __unused) override;
status_t dump(int fd, const Vector<String16>& args) override;

private:
friend class sp<DeviceHalAidl>;
Expand Down
Loading

0 comments on commit e6a43b1

Please sign in to comment.