Merge changes from topic "inputsurfaceconnection" into main
* changes:
InputSurface: implement InputSurfaceConnection
InputSurface: add FrameQueueThread
InputSurface: input buffer work status config update
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 1a6e5e8..db00a22 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -757,7 +757,8 @@
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_HEVC) ? asString_HEVCProfile(pl.mProfile) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_VP9) ? asString_VP9Profile(pl.mProfile) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_AV1) ? asString_AV1Profile(pl.mProfile) :
- mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_DOLBY_VISION) ? asString_DolbyVisionProfile(pl.mProfile) :"??";
+ mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_DOLBY_VISION) ? asString_DolbyVisionProfile(pl.mProfile) :
+ mediaType.equalsIgnoreCase(MIMETYPE_AUDIO_AC4) ? asString_AC4Profile(pl.mProfile) : "??";
const char *niceLevel =
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_MPEG2) ? asString_MPEG2Level(pl.mLevel) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_H263) ? asString_H263Level(pl.mLevel) :
@@ -768,6 +769,7 @@
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_VP9) ? asString_VP9Level(pl.mLevel) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_AV1) ? asString_AV1Level(pl.mLevel) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_DOLBY_VISION) ? asString_DolbyVisionLevel(pl.mLevel) :
+ mediaType.equalsIgnoreCase(MIMETYPE_AUDIO_AC4) ? asString_AC4Level(pl.mLevel) :
"??";
list.add(AStringPrintf("% 5u/% 5u (%s/%s)",
diff --git a/media/codec2/components/iamf/Android.bp b/media/codec2/components/iamf/Android.bp
index 8b6c8fa..8d5ee6a 100644
--- a/media/codec2/components/iamf/Android.bp
+++ b/media/codec2/components/iamf/Android.bp
@@ -4,10 +4,15 @@
cc_library {
name: "libcodec2_soft_iamfdec",
-
- srcs: [],
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+ srcs: [
+ "C2SoftIamfDec.cpp",
+ ],
shared_libs: [
- // iamf_tools library will need to go here.
+ "iamf_tools",
],
}
diff --git a/media/codec2/components/iamf/C2SoftIamfDec.cpp b/media/codec2/components/iamf/C2SoftIamfDec.cpp
index cfd5369..88d1a25 100644
--- a/media/codec2/components/iamf/C2SoftIamfDec.cpp
+++ b/media/codec2/components/iamf/C2SoftIamfDec.cpp
@@ -17,6 +17,10 @@
#define LOG_TAG "C2SoftIamfDec"
#include <log/log.h>
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+#include "C2SoftIamfDec.h"
+
namespace android {
namespace {
@@ -35,13 +39,12 @@
// Configure (e.g. noPrivateBuffers(), etc.)
// Add parameters.
}
-}
+};
C2SoftIamfDec::C2SoftIamfDec(const char* name, c2_node_id_t id,
const std::shared_ptr<IntfImpl>& intfImpl)
: SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
- mIntf(intfImpl) {
-}
+ mIntf(intfImpl) {}
C2SoftIamfDec::~C2SoftIamfDec() {
onRelease();
@@ -69,11 +72,65 @@
void C2SoftIamfDec::process(const std::unique_ptr<C2Work>& work,
const std::shared_ptr<C2BlockPool>& pool) {
- return;
+ (void)pool; // Temporary solution to suppress unused var.
+ work->result = C2_NO_INIT;
}
c2_status_t C2SoftIamfDec::drain(uint32_t drainMode, const std::shared_ptr<C2BlockPool>& pool) {
- return C2_NO_INIT;
+ (void)pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
}
+class C2SoftIamfDecFactory : public C2ComponentFactory {
+ public:
+ C2SoftIamfDecFactory()
+ : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {}
+
+ virtual c2_status_t createComponent(c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftIamfDec(COMPONENT_NAME, id,
+ std::make_shared<C2SoftIamfDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftIamfDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftIamfDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftIamfDecFactory() override = default;
+
+ private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
} // namespace android
+
+__attribute__((cfi_canonical_jump_table)) extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftIamfDecFactory();
+}
+
+__attribute__((cfi_canonical_jump_table)) extern "C" void DestroyCodec2Factory(
+ ::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/iamf/C2SoftIamfDec.h b/media/codec2/components/iamf/C2SoftIamfDec.h
index 547b3ba..0cc9492 100644
--- a/media/codec2/components/iamf/C2SoftIamfDec.h
+++ b/media/codec2/components/iamf/C2SoftIamfDec.h
@@ -22,10 +22,10 @@
namespace android {
class C2SoftIamfDec : public SimpleC2Component {
+ public:
// Forward declaration of the C2 interface implementation.
class IntfImpl;
- public:
C2SoftIamfDec(const char* name, c2_node_id_t id, const std::shared_ptr<IntfImpl>& intfImpl);
virtual ~C2SoftIamfDec();
@@ -41,7 +41,9 @@
private:
std::shared_ptr<IntfImpl> mIntf;
-}
+
+ C2_DO_NOT_COPY(C2SoftIamfDec);
+};
} // namespace android
diff --git a/media/codec2/core/include/C2Config.h b/media/codec2/core/include/C2Config.h
index 458cfb3..7c206b5 100644
--- a/media/codec2/core/include/C2Config.h
+++ b/media/codec2/core/include/C2Config.h
@@ -29,8 +29,8 @@
* Enumerated boolean.
*/
C2ENUM(c2_bool_t, uint32_t,
- C2_FALSE, ///< true
- C2_TRUE, ///< false
+ C2_FALSE, ///< false
+ C2_TRUE, ///< true
)
typedef C2SimpleValueStruct<c2_bool_t> C2BoolValue;
@@ -447,7 +447,8 @@
_C2_PL_VP8_BASE = 0xA000,
_C2_PL_MPEGH_BASE = 0xB000, // MPEG-H 3D Audio
_C2_PL_APV_BASE = 0xC000, // APV
-
+ _C2_PL_AC4_BASE = 0xD000,
+ _C2_PL_IAMF_START = 0xE000,
C2_PROFILE_LEVEL_VENDOR_START = 0x70000000,
};
@@ -623,6 +624,30 @@
PROFILE_APV_4444_10, ///< APV 4444-10 Profile
PROFILE_APV_4444_12, ///< APV 4444-12 Profile
PROFILE_APV_400_10, ///< APV 400-10 Profile
+
+ // AC-4 profiles
+ // Below profiles are labelled “AC-4 Profile xx.yy” where xx is the bitstream_version
+ // and yy is the presentation_version as described in "The MIME codecs parameter", Annex E.13
+ // found at https://www.etsi.org/deliver/etsi_ts/103100_103199/10319002/01.02.01_60/ts_10319002v010201p.pdf
+ PROFILE_AC4_0_0 = _C2_PL_AC4_BASE, ///< AC-4 Profile 00.00
+ PROFILE_AC4_1_0, ///< AC-4 Profile 01.00
+ PROFILE_AC4_1_1, ///< AC-4 Profile 01.01
+ PROFILE_AC4_2_1, ///< AC-4 Profile 02.01
+ PROFILE_AC4_2_2, ///< AC-4 Profile 02.02
+
+ // IAMF Profiles
+ PROFILE_IAMF_SIMPLE_AAC = _C2_PL_IAMF_START, ///< IAMF Simple Profile with AAC
+ PROFILE_IAMF_SIMPLE_FLAC, ///< IAMF Simple Profile with FLAC
+ PROFILE_IAMF_SIMPLE_OPUS, ///< IAMF Simple Profile with Opus
+ PROFILE_IAMF_SIMPLE_PCM, ///< IAMF Simple Profile with PCM
+ PROFILE_IAMF_BASE_AAC, ///< IAMF Base Profile with AAC
+ PROFILE_IAMF_BASE_FLAC, ///< IAMF Base Profile with FLAC
+ PROFILE_IAMF_BASE_OPUS, ///< IAMF Base Profile with Opus
+ PROFILE_IAMF_BASE_PCM, ///< IAMF Base Profile with PCM
+ PROFILE_IAMF_BASE_ENHANCED_AAC, ///< IAMF Base Enhanced with AAC
+ PROFILE_IAMF_BASE_ENHANCED_FLAC, ///< IAMF Base Enhanced with FLAC
+ PROFILE_IAMF_BASE_ENHANCED_OPUS, ///< IAMF Base Enhanced with Opus
+ PROFILE_IAMF_BASE_ENHANCED_PCM, ///< IAMF Base Enhanced with PCM
};
enum C2Config::level_t : uint32_t {
@@ -840,6 +865,15 @@
LEVEL_APV_7_BAND_3, ///< APV L 7, BAND 3
LEVEL_APV_7_1_BAND_3, ///< APV L 7.1, BAND 3
+ // AC-4 levels
+ // Below levels are labelled “AC-4 Level zz” where zz is the mdcompat as described in
+ // "The MIME codecs parameter", Annex E.13
+ // found at https://www.etsi.org/deliver/etsi_ts/103100_103199/10319002/01.02.01_60/ts_10319002v010201p.pdf
+ LEVEL_AC4_0 = _C2_PL_AC4_BASE, ///< AC-4 Level 00
+ LEVEL_AC4_1, ///< AC-4 Level 01
+ LEVEL_AC4_2, ///< AC-4 Level 02
+ LEVEL_AC4_3, ///< AC-4 Level 03
+ LEVEL_AC4_4, ///< AC-4 Level 04
};
struct C2ProfileLevelStruct {
diff --git a/media/codec2/sfplugin/utils/Codec2Mapper.cpp b/media/codec2/sfplugin/utils/Codec2Mapper.cpp
index 3841831..925a1b37e 100644
--- a/media/codec2/sfplugin/utils/Codec2Mapper.cpp
+++ b/media/codec2/sfplugin/utils/Codec2Mapper.cpp
@@ -547,6 +547,22 @@
{ C2Config::picture_type_t::B_FRAME, PICTURE_TYPE_B },
};
+ALookup<C2Config::profile_t, int32_t> sAc4Profiles = {
+ { C2Config::PROFILE_AC4_0_0, AC4Profile00 },
+ { C2Config::PROFILE_AC4_1_0, AC4Profile10 },
+ { C2Config::PROFILE_AC4_1_1, AC4Profile11 },
+ { C2Config::PROFILE_AC4_2_1, AC4Profile21 },
+ { C2Config::PROFILE_AC4_2_2, AC4Profile22 },
+};
+
+ALookup<C2Config::level_t, int32_t> sAc4Levels = {
+ { C2Config::LEVEL_AC4_0, AC4Level0 },
+ { C2Config::LEVEL_AC4_1, AC4Level1 },
+ { C2Config::LEVEL_AC4_2, AC4Level2 },
+ { C2Config::LEVEL_AC4_3, AC4Level3 },
+ { C2Config::LEVEL_AC4_4, AC4Level4 },
+};
+
/**
* A helper that passes through vendor extension profile and level values.
*/
@@ -831,6 +847,21 @@
bool mIsHdr10Plus;
};
+struct Ac4ProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sAc4Levels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sAc4Levels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sAc4Profiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sAc4Profiles.map(from, to);
+ }
+};
+
} // namespace
// the default mapper is used for media types that do not support HDR
@@ -866,6 +897,8 @@
return std::make_shared<Av1ProfileLevelMapper>();
} else if (mediaType == MIMETYPE_VIDEO_APV) {
return std::make_shared<ApvProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_AUDIO_AC4) {
+ return std::make_shared<Ac4ProfileLevelMapper>();
}
return nullptr;
}
diff --git a/media/codec2/vndk/C2Config.cpp b/media/codec2/vndk/C2Config.cpp
index e9223fb..fa90c5a 100644
--- a/media/codec2/vndk/C2Config.cpp
+++ b/media/codec2/vndk/C2Config.cpp
@@ -150,6 +150,11 @@
{ "mpegh-high", C2Config::PROFILE_MPEGH_HIGH },
{ "mpegh-lc", C2Config::PROFILE_MPEGH_LC },
{ "mpegh-baseline", C2Config::PROFILE_MPEGH_BASELINE },
+ { "ac4-00-00", C2Config::PROFILE_AC4_0_0 },
+ { "ac4-01-00", C2Config::PROFILE_AC4_1_0 },
+ { "ac4-01-01", C2Config::PROFILE_AC4_1_1 },
+ { "ac4-02-01", C2Config::PROFILE_AC4_2_1 },
+ { "ac4-02-02", C2Config::PROFILE_AC4_2_2 },
}))
DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(C2Config::level_t, ({
@@ -261,6 +266,11 @@
{ "mpegh-3", C2Config::LEVEL_MPEGH_3 },
{ "mpegh-4", C2Config::LEVEL_MPEGH_4 },
{ "mpegh-5", C2Config::LEVEL_MPEGH_5 },
+ { "ac4-00", C2Config::LEVEL_AC4_0 },
+ { "ac4-01", C2Config::LEVEL_AC4_1 },
+ { "ac4-02", C2Config::LEVEL_AC4_2 },
+ { "ac4-03", C2Config::LEVEL_AC4_3 },
+ { "ac4-04", C2Config::LEVEL_AC4_4 },
}))
DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(C2BufferData::type_t, ({
diff --git a/media/libaudiohal/impl/Hal2AidlMapper.cpp b/media/libaudiohal/impl/Hal2AidlMapper.cpp
index 0cdf0f2..5642b6e 100644
--- a/media/libaudiohal/impl/Hal2AidlMapper.cpp
+++ b/media/libaudiohal/impl/Hal2AidlMapper.cpp
@@ -1176,7 +1176,8 @@
}
void Hal2AidlMapper::updateDynamicMixPorts() {
- for (int32_t portId : mDynamicMixPortIds) {
+ const auto dynamicMixPortIds = mDynamicMixPortIds;
+ for (int32_t portId : dynamicMixPortIds) {
if (auto it = mPorts.find(portId); it != mPorts.end()) {
updateAudioPort(portId, &it->second);
} else {
diff --git a/media/libaudiohal/impl/StreamHalAidl.cpp b/media/libaudiohal/impl/StreamHalAidl.cpp
index 4e9b547..c0cabe3 100644
--- a/media/libaudiohal/impl/StreamHalAidl.cpp
+++ b/media/libaudiohal/impl/StreamHalAidl.cpp
@@ -428,10 +428,15 @@
AUGMENT_LOG(W, "No position was reported by the HAL");
return INVALID_OPERATION;
}
- int64_t mostRecentResetPoint = std::max(statePositions.hardware.framesAtStandby,
- statePositions.hardware.framesAtFlushOrDrain);
- int64_t aidlFrames = reply.hardware.frames;
- *frames = aidlFrames <= mostRecentResetPoint ? 0 : aidlFrames - mostRecentResetPoint;
+ if (mSupportsCreateMmapBuffer) {
+ // HAL is required to report continuous position. Reset for compatibility.
+ int64_t mostRecentResetPoint = std::max(statePositions.hardware.framesAtStandby,
+ statePositions.hardware.framesAtFlushOrDrain);
+ int64_t aidlFrames = reply.hardware.frames;
+ *frames = aidlFrames <= mostRecentResetPoint ? 0 : aidlFrames - mostRecentResetPoint;
+ } else {
+ *frames = reply.hardware.frames;
+ }
*timestamp = reply.hardware.timeNs;
return OK;
}
@@ -771,13 +776,13 @@
} else if (command.getTag() == StreamDescriptor::Command::flush &&
reply->state == StreamDescriptor::State::IDLE) {
mStatePositions.observable.framesAtFlushOrDrain = reply->observable.frames;
- mStatePositions.hardware.framesAtFlushOrDrain = reply->observable.frames;
+ mStatePositions.hardware.framesAtFlushOrDrain = reply->hardware.frames;
} else if (!mContext.isAsynchronous() &&
command.getTag() == StreamDescriptor::Command::drain &&
(reply->state == StreamDescriptor::State::IDLE ||
reply->state == StreamDescriptor::State::DRAINING)) {
mStatePositions.observable.framesAtFlushOrDrain = reply->observable.frames;
- mStatePositions.hardware.framesAtFlushOrDrain = reply->observable.frames;
+ mStatePositions.hardware.framesAtFlushOrDrain = reply->hardware.frames;
} // for asynchronous drain, the frame count is saved in 'onAsyncDrainReady'
}
if (mContext.isAsynchronous() &&
diff --git a/media/libeffects/preprocessing/aidl/PreProcessingContext.cpp b/media/libeffects/preprocessing/aidl/PreProcessingContext.cpp
index 2d549ef..613196d 100644
--- a/media/libeffects/preprocessing/aidl/PreProcessingContext.cpp
+++ b/media/libeffects/preprocessing/aidl/PreProcessingContext.cpp
@@ -16,6 +16,7 @@
#include <cstddef>
#define LOG_TAG "PreProcessingContext"
+#include <audio_utils/primitives.h>
#include <Utils.h>
#include "PreProcessingContext.h"
@@ -137,7 +138,7 @@
}
RetCode PreProcessingContext::setCommon(const Parameter::Common& common) {
- if(auto ret = updateIOFrameSize(common); ret != RetCode::SUCCESS) {
+ if (auto ret = updateIOFrameSize(common); ret != RetCode::SUCCESS) {
return ret;
}
mCommon = common;
@@ -148,10 +149,10 @@
void PreProcessingContext::updateConfigs(const Parameter::Common& common) {
mInputConfig.set_sample_rate_hz(common.input.base.sampleRate);
mInputConfig.set_num_channels(::aidl::android::hardware::audio::common::getChannelCount(
- common.input.base.channelMask));
+ common.input.base.channelMask));
mOutputConfig.set_sample_rate_hz(common.input.base.sampleRate);
mOutputConfig.set_num_channels(::aidl::android::hardware::audio::common::getChannelCount(
- common.output.base.channelMask));
+ common.output.base.channelMask));
}
RetCode PreProcessingContext::setAcousticEchoCancelerEchoDelay(int echoDelayUs) {
@@ -267,33 +268,41 @@
RETURN_VALUE_IF(inputFrameCount != outputFrameCount, status, "FrameCountMismatch");
RETURN_VALUE_IF(0 == getInputFrameSize(), status, "zeroFrameSize");
- mProcessedMsk |= (1 << int(mType));
// webrtc implementation clear out was_stream_delay_set every time after ProcessStream() call
mAudioProcessingModule->set_stream_delay_ms(mEchoDelayUs / 1000);
+ std::vector<int16_t> in16(samples);
+ std::vector<int16_t> out16(samples, 0);
+ memcpy_to_i16_from_float(in16.data(), in, samples);
+
+ mProcessedMsk |= (1 << int(mType));
+
if ((mProcessedMsk & mEnabledMsk) == mEnabledMsk) {
mProcessedMsk = 0;
- int processStatus = mAudioProcessingModule->ProcessStream(
- (const int16_t* const)in, mInputConfig, mOutputConfig, (int16_t* const)out);
+ int processStatus = mAudioProcessingModule->ProcessStream(in16.data(), mInputConfig,
+ mOutputConfig, out16.data());
if (processStatus != 0) {
LOG(ERROR) << "Process stream failed with error " << processStatus;
return status;
}
}
- mRevProcessedMsk |= (1 << int(mType));
-
- if ((mRevProcessedMsk & mRevEnabledMsk) == mRevEnabledMsk) {
- mRevProcessedMsk = 0;
- int revProcessStatus = mAudioProcessingModule->ProcessReverseStream(
- (const int16_t* const)in, mInputConfig, mInputConfig, (int16_t* const)out);
- if (revProcessStatus != 0) {
- LOG(ERROR) << "Process reverse stream failed with error " << revProcessStatus;
- return status;
+ if (mType == PreProcessingEffectType::ACOUSTIC_ECHO_CANCELLATION) {
+ mRevProcessedMsk |= (1 << int(mType));
+ if ((mRevProcessedMsk & mRevEnabledMsk) == mRevEnabledMsk) {
+ mRevProcessedMsk = 0;
+ int revProcessStatus = mAudioProcessingModule->ProcessReverseStream(
+ in16.data(), mInputConfig, mInputConfig, out16.data());
+ if (revProcessStatus != 0) {
+ LOG(ERROR) << "Process reverse stream failed with error " << revProcessStatus;
+ return status;
+ }
}
}
+ memcpy_to_float_from_i16(out, out16.data(), samples);
+
return {STATUS_OK, samples, samples};
}
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 0067344..de9c93b 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -390,7 +390,9 @@
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_AV1)
? asString_AV1Profile(pl.mProfile) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_DOLBY_VISION)
- ? asString_DolbyVisionProfile(pl.mProfile) : "??";
+ ? asString_DolbyVisionProfile(pl.mProfile) :
+ mediaType.equalsIgnoreCase(MIMETYPE_AUDIO_AC4)
+ ? asString_AC4Profile(pl.mProfile) : "??";
const char *niceLevel =
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_MPEG2)
? asString_MPEG2Level(pl.mLevel) :
@@ -409,7 +411,9 @@
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_AV1)
? asString_AV1Level(pl.mLevel) :
mediaType.equalsIgnoreCase(MIMETYPE_VIDEO_DOLBY_VISION)
- ? asString_DolbyVisionLevel(pl.mLevel) : "??";
+ ? asString_DolbyVisionLevel(pl.mLevel) :
+ mediaType.equalsIgnoreCase(MIMETYPE_AUDIO_AC4)
+ ? asString_AC4Level(pl.mLevel) : "??";
list.add(AStringPrintf("% 5u/% 5u (%s/%s)",
pl.mProfile, pl.mLevel, niceProfile, niceLevel));
diff --git a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
index 85d4376..d1f9da2 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
@@ -719,6 +719,54 @@
}
}
+// Profiles and levels for AC-4 Codec, corresponding to the definitions in
+// "The MIME codecs parameter", Annex E.13
+// found at https://www.etsi.org/deliver/etsi_ts/103100_103199/10319002/01.02.01_60/ts_10319002v010201p.pdf
+// profile = ((1 << bitstream_version) << 8) | (1 << presentation_version);
+// level = 1 << mdcompat;
+
+inline constexpr int32_t AC4BitstreamVersion0 = 0x01;
+inline constexpr int32_t AC4BitstreamVersion1 = 0x02;
+inline constexpr int32_t AC4BitstreamVersion2 = 0x04;
+
+inline constexpr int32_t AC4PresentationVersion0 = 0x01;
+inline constexpr int32_t AC4PresentationVersion1 = 0x02;
+inline constexpr int32_t AC4PresentationVersion2 = 0x04;
+
+inline constexpr int32_t AC4Profile00 = AC4BitstreamVersion0 << 8 | AC4PresentationVersion0;
+inline constexpr int32_t AC4Profile10 = AC4BitstreamVersion1 << 8 | AC4PresentationVersion0;
+inline constexpr int32_t AC4Profile11 = AC4BitstreamVersion1 << 8 | AC4PresentationVersion1;
+inline constexpr int32_t AC4Profile21 = AC4BitstreamVersion2 << 8 | AC4PresentationVersion1;
+inline constexpr int32_t AC4Profile22 = AC4BitstreamVersion2 << 8 | AC4PresentationVersion2;
+
+inline static const char *asString_AC4Profile(int32_t profile, const char *def = "??") {
+ switch (profile) {
+ case AC4Profile00: return "00.00";
+ case AC4Profile10: return "01.00";
+ case AC4Profile11: return "01.01";
+ case AC4Profile21: return "02.01";
+ case AC4Profile22: return "02.02";
+ default: return def;
+ }
+}
+
+inline constexpr int32_t AC4Level0 = 0x01;
+inline constexpr int32_t AC4Level1 = 0x02;
+inline constexpr int32_t AC4Level2 = 0x04;
+inline constexpr int32_t AC4Level3 = 0x08;
+inline constexpr int32_t AC4Level4 = 0x10;
+
+inline static const char *asString_AC4Level(int32_t level, const char *def = "??") {
+ switch (level) {
+ case AC4Level0: return "00";
+ case AC4Level1: return "01";
+ case AC4Level2: return "02";
+ case AC4Level3: return "03";
+ case AC4Level4: return "04";
+ default: return def;
+ }
+}
+
inline constexpr int32_t BITRATE_MODE_CBR = 2;
inline constexpr int32_t BITRATE_MODE_CBR_FD = 3;
inline constexpr int32_t BITRATE_MODE_CQ = 0;
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index 6d5f684..e526c0d 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -3394,7 +3394,7 @@
if (t == nullptr) {
return;
}
- t->onEffectDisable();
+ t->onEffectDisable(effect->asEffectModule());
}
bool EffectChain::EffectCallback::disconnectEffectHandle(IAfEffectHandle *handle,
diff --git a/services/audioflinger/IAfThread.h b/services/audioflinger/IAfThread.h
index 3962d73..4ba95ab 100644
--- a/services/audioflinger/IAfThread.h
+++ b/services/audioflinger/IAfThread.h
@@ -378,7 +378,7 @@
RETURN_CAPABILITY(audio_utils::ThreadBase_Mutex) = 0;
virtual void onEffectEnable(const sp<IAfEffectModule>& effect) EXCLUDES_ThreadBase_Mutex = 0;
- virtual void onEffectDisable() EXCLUDES_ThreadBase_Mutex = 0;
+ virtual void onEffectDisable(const sp<IAfEffectModule>& effect) EXCLUDES_ThreadBase_Mutex = 0;
// invalidateTracksForAudioSession_l must be called with holding mLock.
virtual void invalidateTracksForAudioSession_l(audio_session_t sessionId) const
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index fcd9a7d..0085b81 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -1800,7 +1800,7 @@
}
}
-void ThreadBase::onEffectDisable() {
+void ThreadBase::onEffectDisable([[maybe_unused]] const sp<IAfEffectModule>& effect) {
if (isOffloadOrMmap()) {
audio_utils::lock_guard _l(mutex());
broadcast_l();
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index e8d0c7f..50b08cb 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -545,7 +545,7 @@
mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kThreadBase_Mutex};
void onEffectEnable(const sp<IAfEffectModule>& effect) final EXCLUDES_ThreadBase_Mutex;
- void onEffectDisable() final EXCLUDES_ThreadBase_Mutex;
+ void onEffectDisable(const sp<IAfEffectModule>& effect) final EXCLUDES_ThreadBase_Mutex;
// invalidateTracksForAudioSession_l must be called with holding mutex().
void invalidateTracksForAudioSession_l(audio_session_t /* sessionId */) const override
diff --git a/services/camera/libcameraservice/device3/Camera3DeviceInjectionMethods.cpp b/services/camera/libcameraservice/device3/Camera3DeviceInjectionMethods.cpp
index b0e4ca3..81b60d1 100644
--- a/services/camera/libcameraservice/device3/Camera3DeviceInjectionMethods.cpp
+++ b/services/camera/libcameraservice/device3/Camera3DeviceInjectionMethods.cpp
@@ -127,6 +127,13 @@
wasActive = true;
}
+ res = parent->mRequestThread->setHalInterface(mBackupHalInterface);
+ if (res != OK) {
+ ALOGE("%s: Failed to restore the HalInterface in RequestThread!", __FUNCTION__);
+ injectionDisconnectImpl();
+ return res;
+ }
+
res = replaceHalInterface(mBackupHalInterface, false);
if (res != OK) {
ALOGE("%s: Failed to restore the backup HalInterface!", __FUNCTION__);