Merge "Convert libaudioflinger to Android.bp"
diff --git a/media/codec2/components/hevc/C2SoftHevcEnc.cpp b/media/codec2/components/hevc/C2SoftHevcEnc.cpp
index 7045b6a..402d9aa 100644
--- a/media/codec2/components/hevc/C2SoftHevcEnc.cpp
+++ b/media/codec2/components/hevc/C2SoftHevcEnc.cpp
@@ -94,6 +94,20 @@
// matches limits in codec library
addParameter(
+ DefineParam(mBitrateMode, C2_PARAMKEY_BITRATE_MODE)
+ .withDefault(new C2StreamBitrateModeTuning::output(
+ 0u, C2Config::BITRATE_VARIABLE))
+ .withFields({
+ C2F(mBitrateMode, value).oneOf({
+ C2Config::BITRATE_CONST,
+ C2Config::BITRATE_VARIABLE,
+ C2Config::BITRATE_IGNORE})
+ })
+ .withSetter(
+ Setter<decltype(*mBitrateMode)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
DefineParam(mBitrate, C2_PARAMKEY_BITRATE)
.withDefault(new C2StreamBitrateInfo::output(0u, 64000))
.withFields({C2F(mBitrate, value).inRange(4096, 12000000)})
@@ -102,6 +116,20 @@
// matches levels allowed within codec library
addParameter(
+ DefineParam(mComplexity, C2_PARAMKEY_COMPLEXITY)
+ .withDefault(new C2StreamComplexityTuning::output(0u, 0))
+ .withFields({C2F(mComplexity, value).inRange(0, 10)})
+ .withSetter(Setter<decltype(*mComplexity)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mQuality, C2_PARAMKEY_QUALITY)
+ .withDefault(new C2StreamQualityTuning::output(0u, 80))
+ .withFields({C2F(mQuality, value).inRange(0, 100)})
+ .withSetter(Setter<decltype(*mQuality)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
.withDefault(new C2StreamProfileLevelInfo::output(
0u, PROFILE_HEVC_MAIN, LEVEL_HEVC_MAIN_1))
@@ -287,12 +315,21 @@
std::shared_ptr<C2StreamFrameRateInfo::output> getFrameRate_l() const {
return mFrameRate;
}
+ std::shared_ptr<C2StreamBitrateModeTuning::output> getBitrateMode_l() const {
+ return mBitrateMode;
+ }
std::shared_ptr<C2StreamBitrateInfo::output> getBitrate_l() const {
return mBitrate;
}
std::shared_ptr<C2StreamRequestSyncFrameTuning::output> getRequestSync_l() const {
return mRequestSync;
}
+ std::shared_ptr<C2StreamComplexityTuning::output> getComplexity_l() const {
+ return mComplexity;
+ }
+ std::shared_ptr<C2StreamQualityTuning::output> getQuality_l() const {
+ return mQuality;
+ }
private:
std::shared_ptr<C2StreamBufferTypeSetting::input> mInputFormat;
@@ -304,6 +341,9 @@
std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
+ std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
+ std::shared_ptr<C2StreamComplexityTuning::output> mComplexity;
+ std::shared_ptr<C2StreamQualityTuning::output> mQuality;
std::shared_ptr<C2StreamProfileLevelInfo::output> mProfileLevel;
std::shared_ptr<C2StreamSyncFrameIntervalTuning::output> mSyncFramePeriod;
};
@@ -387,6 +427,19 @@
work->workletsProcessed = 1u;
}
+static int getQpFromQuality(int quality) {
+ int qp;
+#define MIN_QP 4
+#define MAX_QP 50
+ /* Quality: 100 -> Qp : MIN_QP
+ * Quality: 0 -> Qp : MAX_QP
+ * Qp = ((MIN_QP - MAX_QP) * quality / 100) + MAX_QP;
+ */
+ qp = ((MIN_QP - MAX_QP) * quality / 100) + MAX_QP;
+ qp = std::min(qp, MAX_QP);
+ qp = std::max(qp, MIN_QP);
+ return qp;
+}
c2_status_t C2SoftHevcEnc::initEncParams() {
mCodecCtx = nullptr;
mNumCores = std::min(GetCPUCoreCount(), (size_t) CODEC_MAX_CORES);
@@ -416,9 +469,37 @@
mIvVideoColorFormat = IV_YUV_420P;
mEncParams.s_multi_thrd_prms.i4_max_num_cores = mNumCores;
mEncParams.s_out_strm_prms.i4_codec_profile = mHevcEncProfile;
- mEncParams.s_config_prms.i4_rate_control_mode = 2;
mEncParams.s_lap_prms.i4_rc_look_ahead_pics = 0;
+ switch (mBitrateMode->value) {
+ case C2Config::BITRATE_IGNORE:
+ mEncParams.s_config_prms.i4_rate_control_mode = 3;
+ mEncParams.s_tgt_lyr_prms.as_tgt_params[0].ai4_frame_qp[0] =
+ getQpFromQuality(mQuality->value);
+ break;
+ case C2Config::BITRATE_CONST:
+ mEncParams.s_config_prms.i4_rate_control_mode = 5;
+ break;
+ case C2Config::BITRATE_VARIABLE:
+ [[fallthrough]];
+ default:
+ mEncParams.s_config_prms.i4_rate_control_mode = 2;
+ break;
+ break;
+ }
+
+ if (mComplexity->value == 10) {
+ mEncParams.s_tgt_lyr_prms.as_tgt_params[0].i4_quality_preset = IHEVCE_QUALITY_P0;
+ } else if (mComplexity->value >= 8) {
+ mEncParams.s_tgt_lyr_prms.as_tgt_params[0].i4_quality_preset = IHEVCE_QUALITY_P2;
+ } else if (mComplexity->value >= 7) {
+ mEncParams.s_tgt_lyr_prms.as_tgt_params[0].i4_quality_preset = IHEVCE_QUALITY_P3;
+ } else if (mComplexity->value >= 5) {
+ mEncParams.s_tgt_lyr_prms.as_tgt_params[0].i4_quality_preset = IHEVCE_QUALITY_P4;
+ } else {
+ mEncParams.s_tgt_lyr_prms.as_tgt_params[0].i4_quality_preset = IHEVCE_QUALITY_P5;
+ }
+
return C2_OK;
}
@@ -447,11 +528,14 @@
{
IntfImpl::Lock lock = mIntf->lock();
mSize = mIntf->getSize_l();
+ mBitrateMode = mIntf->getBitrateMode_l();
mBitrate = mIntf->getBitrate_l();
mFrameRate = mIntf->getFrameRate_l();
mHevcEncProfile = mIntf->getProfile_l();
mHevcEncLevel = mIntf->getLevel_l();
mIDRInterval = mIntf->getSyncFramePeriod_l();
+ mComplexity = mIntf->getComplexity_l();
+ mQuality = mIntf->getQuality_l();
}
c2_status_t status = initEncParams();
diff --git a/media/codec2/components/hevc/C2SoftHevcEnc.h b/media/codec2/components/hevc/C2SoftHevcEnc.h
index 9d90b95..8569a3e 100644
--- a/media/codec2/components/hevc/C2SoftHevcEnc.h
+++ b/media/codec2/components/hevc/C2SoftHevcEnc.h
@@ -77,6 +77,9 @@
std::shared_ptr<C2StreamPictureSizeInfo::input> mSize;
std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
+ std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
+ std::shared_ptr<C2StreamComplexityTuning::output> mComplexity;
+ std::shared_ptr<C2StreamQualityTuning::output> mQuality;
#ifdef FILE_DUMP_ENABLE
char mInFile[200];
diff --git a/media/codec2/sfplugin/C2OMXNode.cpp b/media/codec2/sfplugin/C2OMXNode.cpp
index 03d859a..962df0f 100644
--- a/media/codec2/sfplugin/C2OMXNode.cpp
+++ b/media/codec2/sfplugin/C2OMXNode.cpp
@@ -272,19 +272,14 @@
work->input.buffers.clear();
if (block) {
std::shared_ptr<C2Buffer> c2Buffer(
- // TODO: fence
new Buffer2D(block->share(
- C2Rect(block->width(), block->height()), ::C2Fence())),
- [buffer, source = getSource()](C2Buffer *ptr) {
- delete ptr;
- // TODO: fence
- (void)source->onInputBufferEmptied(buffer, -1);
- });
+ C2Rect(block->width(), block->height()), ::C2Fence())));
work->input.buffers.push_back(c2Buffer);
}
work->worklets.clear();
work->worklets.emplace_back(new C2Worklet);
std::list<std::unique_ptr<C2Work>> items;
+ uint64_t index = work->input.ordinal.frameIndex.peeku();
items.push_back(std::move(work));
c2_status_t err = comp->queue(&items);
@@ -292,6 +287,7 @@
return UNKNOWN_ERROR;
}
+ (void)mBufferIdsInUse.emplace(index, buffer);
return OK;
}
@@ -326,4 +322,18 @@
mHeight = height;
}
+void C2OMXNode::onInputBufferDone(c2_cntr64_t index) {
+ if (!mBufferSource) {
+ ALOGD("Buffer source not set (index=%llu)", index.peekull());
+ return;
+ }
+ auto it = mBufferIdsInUse.find(index.peeku());
+ if (it == mBufferIdsInUse.end()) {
+ ALOGV("Untracked input index %llu (maybe already removed)", index.peekull());
+ return;
+ }
+ (void)mBufferSource->onInputBufferEmptied(it->second, -1);
+ (void)mBufferIdsInUse.erase(it);
+}
+
} // namespace android
diff --git a/media/codec2/sfplugin/C2OMXNode.h b/media/codec2/sfplugin/C2OMXNode.h
index b5a815e..b7bd696 100644
--- a/media/codec2/sfplugin/C2OMXNode.h
+++ b/media/codec2/sfplugin/C2OMXNode.h
@@ -75,9 +75,23 @@
OMX_INDEXTYPE *index) override;
status_t dispatchMessage(const omx_message &msg) override;
+ /**
+ * Returns underlying IOMXBufferSource object.
+ */
sp<IOMXBufferSource> getSource();
+
+ /**
+ * Configure the frame size.
+ */
void setFrameSize(uint32_t width, uint32_t height);
+ /**
+ * Clean up work item reference.
+ *
+ * \param index input work index
+ */
+ void onInputBufferDone(c2_cntr64_t index);
+
private:
std::weak_ptr<Codec2Client::Component> mComp;
sp<IOMXBufferSource> mBufferSource;
@@ -96,6 +110,8 @@
bool mFirstInputFrame; // true for first input
c2_cntr64_t mPrevInputTimestamp; // input timestamp for previous frame
c2_cntr64_t mPrevCodecTimestamp; // adjusted (codec) timestamp for previous frame
+
+ std::map<uint64_t, buffer_id> mBufferIdsInUse;
};
} // namespace android
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index 5f60378..8474ce8 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -370,6 +370,10 @@
return err;
}
+ void onInputBufferDone(c2_cntr64_t index) override {
+ mNode->onInputBufferDone(index);
+ }
+
private:
sp<BGraphicBufferSource> mSource;
sp<C2OMXNode> mNode;
@@ -742,10 +746,21 @@
return BAD_VALUE;
}
if ((config->mDomain & Config::IS_ENCODER) && (config->mDomain & Config::IS_VIDEO)) {
- if (!msg->findInt32(KEY_BIT_RATE, &i32)
- && !msg->findFloat(KEY_BIT_RATE, &flt)) {
- ALOGD("bitrate is missing, which is required for video encoders.");
- return BAD_VALUE;
+ C2Config::bitrate_mode_t mode = C2Config::BITRATE_VARIABLE;
+ if (msg->findInt32(KEY_BITRATE_MODE, &i32)) {
+ mode = (C2Config::bitrate_mode_t) i32;
+ }
+ if (mode == BITRATE_MODE_CQ) {
+ if (!msg->findInt32(KEY_QUALITY, &i32)) {
+ ALOGD("quality is missing, which is required for video encoders in CQ.");
+ return BAD_VALUE;
+ }
+ } else {
+ if (!msg->findInt32(KEY_BIT_RATE, &i32)
+ && !msg->findFloat(KEY_BIT_RATE, &flt)) {
+ ALOGD("bitrate is missing, which is required for video encoders.");
+ return BAD_VALUE;
+ }
}
if (!msg->findInt32(KEY_I_FRAME_INTERVAL, &i32)
&& !msg->findFloat(KEY_I_FRAME_INTERVAL, &flt)) {
@@ -1572,6 +1587,13 @@
void CCodec::onInputBufferDone(uint64_t frameIndex, size_t arrayIndex) {
mChannel->onInputBufferDone(frameIndex, arrayIndex);
+ if (arrayIndex == 0) {
+ // We always put no more than one buffer per work, if we use an input surface.
+ Mutexed<Config>::Locked config(mConfig);
+ if (config->mInputSurface) {
+ config->mInputSurface->onInputBufferDone(frameIndex);
+ }
+ }
}
void CCodec::onMessageReceived(const sp<AMessage> &msg) {
@@ -1704,6 +1726,9 @@
++stream;
}
}
+ if (config->mInputSurface) {
+ config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex);
+ }
mChannel->onWorkDone(
std::move(work), changed ? config->mOutputFormat : nullptr,
initData.hasChanged() ? initData.update().get() : nullptr);
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index 55a525e..d1fa920 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -1525,6 +1525,7 @@
mPending.splice(mPending.end(), mStash);
mDepth = depth;
}
+
void CCodecBufferChannel::ReorderStash::setKey(C2Config::ordinal_key_t key) {
mPending.splice(mPending.end(), mStash);
mKey = key;
@@ -1547,13 +1548,25 @@
int64_t timestamp,
int32_t flags,
const C2WorkOrdinalStruct &ordinal) {
- auto it = mStash.begin();
- for (; it != mStash.end(); ++it) {
- if (less(ordinal, it->ordinal)) {
- break;
+ bool eos = flags & MediaCodec::BUFFER_FLAG_EOS;
+ if (!buffer && eos) {
+ // TRICKY: we may be violating ordering of the stash here. Because we
+ // don't expect any more emplace() calls after this, the ordering should
+ // not matter.
+ mStash.emplace_back(buffer, timestamp, flags, ordinal);
+ } else {
+ flags = flags & ~MediaCodec::BUFFER_FLAG_EOS;
+ auto it = mStash.begin();
+ for (; it != mStash.end(); ++it) {
+ if (less(ordinal, it->ordinal)) {
+ break;
+ }
+ }
+ mStash.emplace(it, buffer, timestamp, flags, ordinal);
+ if (eos) {
+ mStash.back().flags = mStash.back().flags | MediaCodec::BUFFER_FLAG_EOS;
}
}
- mStash.emplace(it, buffer, timestamp, flags, ordinal);
while (!mStash.empty() && mStash.size() > mDepth) {
mPending.push_back(mStash.front());
mStash.pop_front();
@@ -2815,8 +2828,9 @@
outBuffer->meta()->setInt64("timeUs", entry.timestamp);
outBuffer->meta()->setInt32("flags", entry.flags);
- ALOGV("[%s] sendOutputBuffers: out buffer index = %zu [%p] => %p + %zu",
- mName, index, outBuffer.get(), outBuffer->data(), outBuffer->size());
+ ALOGV("[%s] sendOutputBuffers: out buffer index = %zu [%p] => %p + %zu (%lld)",
+ mName, index, outBuffer.get(), outBuffer->data(), outBuffer->size(),
+ (long long)entry.timestamp);
mCallback->onOutputBufferAvailable(index, outBuffer);
}
}
diff --git a/media/codec2/sfplugin/InputSurfaceWrapper.h b/media/codec2/sfplugin/InputSurfaceWrapper.h
index d9c4eec..8341fd5 100644
--- a/media/codec2/sfplugin/InputSurfaceWrapper.h
+++ b/media/codec2/sfplugin/InputSurfaceWrapper.h
@@ -98,6 +98,13 @@
mDataSpace = dataSpace;
}
+ /**
+ * Clean up C2Work related references if necessary. No-op by default.
+ *
+ * \param index index of input work.
+ */
+ virtual void onInputBufferDone(c2_cntr64_t /* index */) {}
+
protected:
android_dataspace mDataSpace;
};
diff --git a/media/libaudioclient/AudioPolicy.cpp b/media/libaudioclient/AudioPolicy.cpp
index 3ab38cd..65e797f 100644
--- a/media/libaudioclient/AudioPolicy.cpp
+++ b/media/libaudioclient/AudioPolicy.cpp
@@ -97,6 +97,7 @@
mDeviceType = (audio_devices_t) parcel->readInt32();
mDeviceAddress = parcel->readString8();
mCbFlags = (uint32_t)parcel->readInt32();
+ mAllowPrivilegedPlaybackCapture = parcel->readBool();
size_t size = (size_t)parcel->readInt32();
if (size > MAX_CRITERIA_PER_MIX) {
size = MAX_CRITERIA_PER_MIX;
@@ -120,6 +121,7 @@
parcel->writeInt32(mDeviceType);
parcel->writeString8(mDeviceAddress);
parcel->writeInt32(mCbFlags);
+ parcel->writeBool(mAllowPrivilegedPlaybackCapture);
size_t size = mCriteria.size();
if (size > MAX_CRITERIA_PER_MIX) {
size = MAX_CRITERIA_PER_MIX;
diff --git a/media/libaudioclient/include/media/AudioPolicy.h b/media/libaudioclient/include/media/AudioPolicy.h
index bf8d627..4b94c12 100644
--- a/media/libaudioclient/include/media/AudioPolicy.h
+++ b/media/libaudioclient/include/media/AudioPolicy.h
@@ -114,6 +114,8 @@
audio_devices_t mDeviceType;
String8 mDeviceAddress;
uint32_t mCbFlags; // flags indicating which callbacks to use, see kCbFlag*
+ /** Ignore the AUDIO_FLAG_NO_MEDIA_PROJECTION */
+ bool mAllowPrivilegedPlaybackCapture = false;
};
diff --git a/media/libmedia/TypeConverter.cpp b/media/libmedia/TypeConverter.cpp
index 469c5b6..5be78d1 100644
--- a/media/libmedia/TypeConverter.cpp
+++ b/media/libmedia/TypeConverter.cpp
@@ -392,7 +392,8 @@
MAKE_STRING_FROM_ENUM(AUDIO_FLAG_BYPASS_MUTE),
MAKE_STRING_FROM_ENUM(AUDIO_FLAG_LOW_LATENCY),
MAKE_STRING_FROM_ENUM(AUDIO_FLAG_DEEP_BUFFER),
- MAKE_STRING_FROM_ENUM(AUDIO_FLAG_NO_CAPTURE),
+ MAKE_STRING_FROM_ENUM(AUDIO_FLAG_NO_MEDIA_PROJECTION),
+ MAKE_STRING_FROM_ENUM(AUDIO_FLAG_NO_SYSTEM_CAPTURE),
TERMINATOR
};
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index f00c895..cf1a6f1 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -569,7 +569,6 @@
mFps(-1.0),
mCaptureFps(-1.0),
mCreateInputBuffersSuspended(false),
- mLatency(0),
mTunneled(false),
mDescribeColorAspectsIndex((OMX_INDEXTYPE)0),
mDescribeHDRStaticInfoIndex((OMX_INDEXTYPE)0),
@@ -4425,12 +4424,13 @@
h264type.eProfile == OMX_VIDEO_AVCProfileHigh) {
h264type.nSliceHeaderSpacing = 0;
h264type.bUseHadamard = OMX_TRUE;
- h264type.nRefFrames = 2;
- h264type.nBFrames = mLatency == 0 ? 1 : std::min(1U, mLatency - 1);
-
- // disable B-frames until we have explicit settings for enabling the feature.
- h264type.nRefFrames = 1;
- h264type.nBFrames = 0;
+ int32_t maxBframes = 0;
+ (void)msg->findInt32(KEY_MAX_B_FRAMES, &maxBframes);
+ h264type.nBFrames = uint32_t(maxBframes);
+ if (mLatency && h264type.nBFrames > *mLatency) {
+ h264type.nBFrames = *mLatency;
+ }
+ h264type.nRefFrames = h264type.nBFrames == 0 ? 1 : 2;
h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate, h264type.nBFrames);
h264type.nAllowedPictureTypes =
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index dc51b16..da35889 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -181,6 +181,7 @@
"libcamera_client",
"libcutils",
"libdl",
+ "libdl_android",
"libdrmframework",
"libgui",
"liblog",
diff --git a/media/libstagefright/codecs/aacdec/Android.bp b/media/libstagefright/codecs/aacdec/Android.bp
index 25628a2..e0bb5cd 100644
--- a/media/libstagefright/codecs/aacdec/Android.bp
+++ b/media/libstagefright/codecs/aacdec/Android.bp
@@ -29,12 +29,10 @@
static_libs: ["libFraunhoferAAC"],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
"libcutils",
- "liblog",
],
compile_multilib: "32",
}
diff --git a/media/libstagefright/codecs/aacenc/Android.bp b/media/libstagefright/codecs/aacenc/Android.bp
index ec1151b..0d677fe 100644
--- a/media/libstagefright/codecs/aacenc/Android.bp
+++ b/media/libstagefright/codecs/aacenc/Android.bp
@@ -26,11 +26,7 @@
static_libs: ["libFraunhoferAAC"],
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
+
compile_multilib: "32",
}
diff --git a/media/libstagefright/codecs/amrnb/dec/Android.bp b/media/libstagefright/codecs/amrnb/dec/Android.bp
index 880f161..f3b272b 100644
--- a/media/libstagefright/codecs/amrnb/dec/Android.bp
+++ b/media/libstagefright/codecs/amrnb/dec/Android.bp
@@ -101,11 +101,9 @@
"libstagefright_amrwbdec",
],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
"libstagefright_amrnb_common",
],
compile_multilib: "32",
diff --git a/media/libstagefright/codecs/amrnb/enc/Android.bp b/media/libstagefright/codecs/amrnb/enc/Android.bp
index 19fd4a8..1c8b511 100644
--- a/media/libstagefright/codecs/amrnb/enc/Android.bp
+++ b/media/libstagefright/codecs/amrnb/enc/Android.bp
@@ -110,11 +110,9 @@
static_libs: ["libstagefright_amrnbenc"],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
"libstagefright_amrnb_common",
],
compile_multilib: "32",
diff --git a/media/libstagefright/codecs/amrwbenc/Android.bp b/media/libstagefright/codecs/amrwbenc/Android.bp
index b9d45c1..8327500 100644
--- a/media/libstagefright/codecs/amrwbenc/Android.bp
+++ b/media/libstagefright/codecs/amrwbenc/Android.bp
@@ -167,11 +167,9 @@
static_libs: ["libstagefright_amrwbenc"],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
"libstagefright_enc_common",
],
compile_multilib: "32",
diff --git a/media/libstagefright/codecs/avcdec/Android.bp b/media/libstagefright/codecs/avcdec/Android.bp
index 8a34845..567bcca 100644
--- a/media/libstagefright/codecs/avcdec/Android.bp
+++ b/media/libstagefright/codecs/avcdec/Android.bp
@@ -22,12 +22,7 @@
"frameworks/native/include/media/openmax",
],
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
sanitize: {
misc_undefined: [
diff --git a/media/libstagefright/codecs/avcenc/Android.bp b/media/libstagefright/codecs/avcenc/Android.bp
index 6371828..0cd39e1 100644
--- a/media/libstagefright/codecs/avcenc/Android.bp
+++ b/media/libstagefright/codecs/avcenc/Android.bp
@@ -16,12 +16,7 @@
"frameworks/native/include/media/openmax",
],
- shared_libs: [
- "libstagefright_foundation",
- "libstagefright_omx",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
sanitize: {
misc_undefined: [
diff --git a/media/libstagefright/codecs/flac/dec/Android.bp b/media/libstagefright/codecs/flac/dec/Android.bp
index 3d4a44f..18a3f6b 100644
--- a/media/libstagefright/codecs/flac/dec/Android.bp
+++ b/media/libstagefright/codecs/flac/dec/Android.bp
@@ -28,12 +28,10 @@
cfi: true,
},
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
- "liblog",
"libstagefright_flacdec",
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
],
compile_multilib: "32",
}
diff --git a/media/libstagefright/codecs/flac/enc/Android.bp b/media/libstagefright/codecs/flac/enc/Android.bp
index b32ab08..4149ccd 100644
--- a/media/libstagefright/codecs/flac/enc/Android.bp
+++ b/media/libstagefright/codecs/flac/enc/Android.bp
@@ -19,13 +19,7 @@
],
cfi: true,
},
-
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
header_libs: ["libbase_headers"],
static_libs: [
diff --git a/media/libstagefright/codecs/g711/dec/Android.bp b/media/libstagefright/codecs/g711/dec/Android.bp
index 7097688..c273179 100644
--- a/media/libstagefright/codecs/g711/dec/Android.bp
+++ b/media/libstagefright/codecs/g711/dec/Android.bp
@@ -12,12 +12,7 @@
"frameworks/native/include/media/openmax",
],
- shared_libs: [
- "libstagefright_foundation",
- "libstagefright_omx",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
cflags: ["-Werror"],
diff --git a/media/libstagefright/codecs/gsm/dec/Android.bp b/media/libstagefright/codecs/gsm/dec/Android.bp
index a973f70..3c5ebfe 100644
--- a/media/libstagefright/codecs/gsm/dec/Android.bp
+++ b/media/libstagefright/codecs/gsm/dec/Android.bp
@@ -25,12 +25,7 @@
cfi: true,
},
- shared_libs: [
- "libstagefright_foundation",
- "libstagefright_omx",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
static_libs: ["libgsm"],
compile_multilib: "32",
diff --git a/media/libstagefright/codecs/hevcdec/Android.bp b/media/libstagefright/codecs/hevcdec/Android.bp
index 60fc446..cc91d53 100644
--- a/media/libstagefright/codecs/hevcdec/Android.bp
+++ b/media/libstagefright/codecs/hevcdec/Android.bp
@@ -30,12 +30,7 @@
cfi: true,
},
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
// We need this because the current asm generates the following link error:
// requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
diff --git a/media/libstagefright/codecs/m4v_h263/dec/Android.bp b/media/libstagefright/codecs/m4v_h263/dec/Android.bp
index 41141b1..0523143 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/Android.bp
+++ b/media/libstagefright/codecs/m4v_h263/dec/Android.bp
@@ -91,12 +91,7 @@
static_libs: ["libstagefright_m4vh263dec"],
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
sanitize: {
misc_undefined: [
diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
index a8fcdd1..9893c6f 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -24,7 +24,6 @@
#include <media/stagefright/foundation/AUtils.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
-#include <media/IOMX.h>
#include "mp4dec_api.h"
diff --git a/media/libstagefright/codecs/m4v_h263/enc/Android.bp b/media/libstagefright/codecs/m4v_h263/enc/Android.bp
index d4f7d50..d38f4b1 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/Android.bp
+++ b/media/libstagefright/codecs/m4v_h263/enc/Android.bp
@@ -77,12 +77,7 @@
static_libs: ["libstagefright_m4vh263enc"],
- shared_libs: [
- "libstagefright_foundation",
- "libstagefright_omx",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
sanitize: {
misc_undefined: [
diff --git a/media/libstagefright/codecs/mp3dec/Android.bp b/media/libstagefright/codecs/mp3dec/Android.bp
index 2154f84..9173ed6 100644
--- a/media/libstagefright/codecs/mp3dec/Android.bp
+++ b/media/libstagefright/codecs/mp3dec/Android.bp
@@ -105,12 +105,7 @@
cfi: true,
},
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
static_libs: ["libstagefright_mp3dec"],
compile_multilib: "32",
diff --git a/media/libstagefright/codecs/mpeg2dec/Android.bp b/media/libstagefright/codecs/mpeg2dec/Android.bp
index c655544..26e786e 100644
--- a/media/libstagefright/codecs/mpeg2dec/Android.bp
+++ b/media/libstagefright/codecs/mpeg2dec/Android.bp
@@ -20,12 +20,7 @@
"frameworks/native/include/media/openmax",
],
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
ldflags: ["-Wl,-Bsymbolic"],
diff --git a/media/libstagefright/codecs/on2/dec/Android.bp b/media/libstagefright/codecs/on2/dec/Android.bp
index 174f183..abd21d7 100644
--- a/media/libstagefright/codecs/on2/dec/Android.bp
+++ b/media/libstagefright/codecs/on2/dec/Android.bp
@@ -14,12 +14,7 @@
static_libs: ["libvpx"],
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
cflags: ["-Werror"],
diff --git a/media/libstagefright/codecs/on2/enc/Android.bp b/media/libstagefright/codecs/on2/enc/Android.bp
index 891a771..ea46bad 100644
--- a/media/libstagefright/codecs/on2/enc/Android.bp
+++ b/media/libstagefright/codecs/on2/enc/Android.bp
@@ -30,11 +30,7 @@
static_libs: ["libvpx"],
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
+
compile_multilib: "32",
}
diff --git a/media/libstagefright/codecs/on2/enc/SoftVP8Encoder.h b/media/libstagefright/codecs/on2/enc/SoftVP8Encoder.h
index b4904bf..c5c2abf 100644
--- a/media/libstagefright/codecs/on2/enc/SoftVP8Encoder.h
+++ b/media/libstagefright/codecs/on2/enc/SoftVP8Encoder.h
@@ -23,8 +23,6 @@
#include <OMX_VideoExt.h>
#include <OMX_IndexExt.h>
-#include <hardware/gralloc.h>
-
#include "vpx/vpx_encoder.h"
#include "vpx/vpx_codec.h"
#include "vpx/vp8cx.h"
diff --git a/media/libstagefright/codecs/on2/enc/SoftVP9Encoder.h b/media/libstagefright/codecs/on2/enc/SoftVP9Encoder.h
index 85df69a..308a9ac 100644
--- a/media/libstagefright/codecs/on2/enc/SoftVP9Encoder.h
+++ b/media/libstagefright/codecs/on2/enc/SoftVP9Encoder.h
@@ -23,8 +23,6 @@
#include <OMX_VideoExt.h>
#include <OMX_IndexExt.h>
-#include <hardware/gralloc.h>
-
#include "vpx/vpx_encoder.h"
#include "vpx/vpx_codec.h"
#include "vpx/vp8cx.h"
diff --git a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
index 263d134..7208d69 100644
--- a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
+++ b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
@@ -23,8 +23,6 @@
#include <OMX_VideoExt.h>
#include <OMX_IndexExt.h>
-#include <hardware/gralloc.h>
-
#include "vpx/vpx_encoder.h"
#include "vpx/vpx_codec.h"
#include "vpx/vp8cx.h"
diff --git a/media/libstagefright/codecs/opus/dec/Android.bp b/media/libstagefright/codecs/opus/dec/Android.bp
index afe459d..bfcae07 100644
--- a/media/libstagefright/codecs/opus/dec/Android.bp
+++ b/media/libstagefright/codecs/opus/dec/Android.bp
@@ -12,12 +12,10 @@
"frameworks/native/include/media/openmax",
],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
"libopus",
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
],
cflags: ["-Werror"],
diff --git a/media/libstagefright/codecs/raw/Android.bp b/media/libstagefright/codecs/raw/Android.bp
index f822445..1c23bad 100644
--- a/media/libstagefright/codecs/raw/Android.bp
+++ b/media/libstagefright/codecs/raw/Android.bp
@@ -24,11 +24,7 @@
cfi: true,
},
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- ],
+ defaults: ["omx_soft_libs"],
+
compile_multilib: "32",
}
diff --git a/media/libstagefright/codecs/vorbis/dec/Android.bp b/media/libstagefright/codecs/vorbis/dec/Android.bp
index a9265cb..2d1a922 100644
--- a/media/libstagefright/codecs/vorbis/dec/Android.bp
+++ b/media/libstagefright/codecs/vorbis/dec/Android.bp
@@ -12,12 +12,10 @@
"frameworks/native/include/media/openmax",
],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
"libvorbisidec",
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
],
cflags: ["-Werror"],
diff --git a/media/libstagefright/codecs/xaacdec/Android.bp b/media/libstagefright/codecs/xaacdec/Android.bp
index 7392f1e..e49eb8f 100644
--- a/media/libstagefright/codecs/xaacdec/Android.bp
+++ b/media/libstagefright/codecs/xaacdec/Android.bp
@@ -24,12 +24,10 @@
static_libs: ["libxaacdec"],
+ defaults: ["omx_soft_libs"],
+
shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
"libcutils",
- "liblog",
],
compile_multilib: "32",
diff --git a/media/libstagefright/data/media_codecs_google_c2_video.xml b/media/libstagefright/data/media_codecs_google_c2_video.xml
index e20174f..f785bfa 100644
--- a/media/libstagefright/data/media_codecs_google_c2_video.xml
+++ b/media/libstagefright/data/media_codecs_google_c2_video.xml
@@ -115,6 +115,9 @@
<Limit name="block-count" range="1-4096" /> <!-- max 512x512 -->
<Limit name="blocks-per-second" range="1-122880" />
<Limit name="bitrate" range="1-10000000" />
+ <Limit name="complexity" range="0-10" default="0" />
+ <Limit name="quality" range="0-100" default="80" />
+ <Feature name="bitrate-modes" value="VBR,CBR,CQ" />
</MediaCodec>
<MediaCodec name="c2.android.mpeg4.encoder" type="video/mp4v-es">
<Alias name="OMX.google.mpeg4.encoder" />
diff --git a/media/libstagefright/include/media/stagefright/ACodec.h b/media/libstagefright/include/media/stagefright/ACodec.h
index 9d46d2d..784fd36 100644
--- a/media/libstagefright/include/media/stagefright/ACodec.h
+++ b/media/libstagefright/include/media/stagefright/ACodec.h
@@ -286,7 +286,7 @@
double mFps;
double mCaptureFps;
bool mCreateInputBuffersSuspended;
- uint32_t mLatency;
+ std::optional<uint32_t> mLatency;
bool mTunneled;
diff --git a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
index 2dca5c3..8b6944b 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
@@ -772,6 +772,7 @@
constexpr char KEY_LANGUAGE[] = "language";
constexpr char KEY_LATENCY[] = "latency";
constexpr char KEY_LEVEL[] = "level";
+constexpr char KEY_MAX_B_FRAMES[] = "max-bframes";
constexpr char KEY_MAX_BIT_RATE[] = "max-bitrate";
constexpr char KEY_MAX_FPS_TO_ENCODER[] = "max-fps-to-encoder";
constexpr char KEY_MAX_HEIGHT[] = "max-height";
diff --git a/media/libstagefright/omx/Android.bp b/media/libstagefright/omx/Android.bp
index 4383004..b8f9aea 100644
--- a/media/libstagefright/omx/Android.bp
+++ b/media/libstagefright/omx/Android.bp
@@ -11,6 +11,8 @@
"OMXNodeInstance.cpp",
"OMXUtils.cpp",
"OmxGraphicBufferSource.cpp",
+ //TODO: remove the soft component code here and use
+ //libstagefright_omx_soft, once partner build is fixed
"SimpleSoftOMXComponent.cpp",
"SoftOMXComponent.cpp",
"SoftOMXPlugin.cpp",
@@ -56,6 +58,7 @@
"libvndksupport",
"android.hardware.media.omx@1.0",
"android.hardware.graphics.bufferqueue@1.0",
+ //"libstagefright_omx_soft",
],
export_shared_lib_headers: [
@@ -81,6 +84,64 @@
},
}
+cc_defaults {
+ name: "omx_soft_libs",
+ shared_libs: [
+ "libutils",
+ "liblog",
+ "libstagefright_foundation",
+ "libstagefright_omx_soft",
+ ],
+}
+
+cc_library_shared {
+ name: "libstagefright_omx_soft",
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ },
+
+ srcs: [
+ "SimpleSoftOMXComponent.cpp",
+ "SoftOMXComponent.cpp",
+ "SoftOMXPlugin.cpp",
+ "SoftVideoDecoderOMXComponent.cpp",
+ "SoftVideoEncoderOMXComponent.cpp",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ shared_libs: [
+ "libutils",
+ "liblog",
+ "libui",
+ "libstagefright_foundation",
+ ],
+
+ export_shared_lib_headers: [
+ "libstagefright_foundation",
+ "libutils",
+ "liblog",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ "-Wno-unused-parameter",
+ "-Wno-documentation",
+ ],
+
+ sanitize: {
+ misc_undefined: [
+ "signed-integer-overflow",
+ "unsigned-integer-overflow",
+ ],
+ cfi: true,
+ },
+}
+
cc_library_shared {
name: "libstagefright_omx_utils",
vendor_available: true,
diff --git a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp
index 2fbbb44..d75acda 100644
--- a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp
+++ b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp
@@ -559,7 +559,7 @@
if (nativeMeta.nFenceFd >= 0) {
sp<Fence> fence = new Fence(nativeMeta.nFenceFd);
nativeMeta.nFenceFd = -1;
- status_t err = fence->wait(IOMX::kFenceTimeoutMs);
+ status_t err = fence->wait(kFenceTimeoutMs);
if (err != OK) {
ALOGE("Timed out waiting on input fence");
return NULL;
diff --git a/media/libstagefright/omx/include/media/stagefright/omx/SoftOMXComponent.h b/media/libstagefright/omx/include/media/stagefright/omx/SoftOMXComponent.h
index 3ab6f88..79f0c77 100644
--- a/media/libstagefright/omx/include/media/stagefright/omx/SoftOMXComponent.h
+++ b/media/libstagefright/omx/include/media/stagefright/omx/SoftOMXComponent.h
@@ -21,12 +21,15 @@
#include <media/stagefright/foundation/ABase.h>
#include <media/stagefright/foundation/AString.h>
#include <utils/RefBase.h>
-
+#include <utils/Log.h>
#include <OMX_Component.h>
namespace android {
struct SoftOMXComponent : public RefBase {
+ enum {
+ kFenceTimeoutMs = 1000
+ };
SoftOMXComponent(
const char *name,
const OMX_CALLBACKTYPE *callbacks,
diff --git a/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoDecoderOMXComponent.h b/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoDecoderOMXComponent.h
index 3b381ce..d7c1658 100644
--- a/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoDecoderOMXComponent.h
+++ b/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoDecoderOMXComponent.h
@@ -23,7 +23,10 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AHandlerReflector.h>
#include <media/stagefright/foundation/ColorUtils.h>
-#include <media/IOMX.h>
+#include <media/openmax/OMX_Core.h>
+#include <media/openmax/OMX_Video.h>
+#include <media/openmax/OMX_VideoExt.h>
+
#include <media/hardware/HardwareAPI.h>
#include <utils/RefBase.h>
diff --git a/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h b/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h
index 2d6f31b..9cb72dd 100644
--- a/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h
+++ b/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h
@@ -18,7 +18,9 @@
#define SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_
-#include <media/IOMX.h>
+#include <media/openmax/OMX_Core.h>
+#include <media/openmax/OMX_Video.h>
+#include <media/openmax/OMX_VideoExt.h>
#include "SimpleSoftOMXComponent.h"
diff --git a/media/ndk/Android.bp b/media/ndk/Android.bp
index f4cc704..a4f5730 100644
--- a/media/ndk/Android.bp
+++ b/media/ndk/Android.bp
@@ -73,6 +73,7 @@
shared_libs: [
"android.hardware.graphics.bufferqueue@1.0",
"android.hidl.token@1.0-utils",
+ "libandroid_runtime_lazy",
"libbinder",
"libmedia",
"libmedia_omx",
@@ -93,12 +94,6 @@
"libmediandk_utils",
],
- required: [
- // libmediandk may be used by Java and non-Java things. When lower-level things use it,
- // they shouldn't have to take on the cost of loading libandroid_runtime.
- "libandroid_runtime",
- ],
-
export_include_dirs: ["include"],
export_shared_lib_headers: [
diff --git a/media/ndk/NdkMediaDataSource.cpp b/media/ndk/NdkMediaDataSource.cpp
index 0891f2a..7979c2f 100644
--- a/media/ndk/NdkMediaDataSource.cpp
+++ b/media/ndk/NdkMediaDataSource.cpp
@@ -23,7 +23,8 @@
#include <jni.h>
#include <unistd.h>
-#include <binder/IBinder.h>
+#include <android_runtime/AndroidRuntime.h>
+#include <android_util_Binder.h>
#include <cutils/properties.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
@@ -39,67 +40,9 @@
#include "../../libstagefright/include/NuCachedSource2.h"
#include "NdkMediaDataSourceCallbacksPriv.h"
-#include <mutex> // std::call_once,once_flag
-#include <dlfcn.h> // dlopen
using namespace android;
-// load libandroid_runtime.so lazily.
-// A vendor process may use libmediandk but should not depend on libandroid_runtime.
-// TODO(jooyung): remove duplicate (b/125550121)
-// frameworks/native/libs/binder/ndk/ibinder_jni.cpp
-namespace {
-
-typedef JNIEnv* (*getJNIEnv_t)();
-typedef sp<IBinder> (*ibinderForJavaObject_t)(JNIEnv* env, jobject obj);
-
-getJNIEnv_t getJNIEnv_;
-ibinderForJavaObject_t ibinderForJavaObject_;
-
-std::once_flag mLoadFlag;
-
-void load() {
- std::call_once(mLoadFlag, []() {
- void* handle = dlopen("libandroid_runtime.so", RTLD_LAZY);
- if (handle == nullptr) {
- ALOGE("Could not open libandroid_runtime.");
- return;
- }
-
- getJNIEnv_ = reinterpret_cast<getJNIEnv_t>(
- dlsym(handle, "_ZN7android14AndroidRuntime9getJNIEnvEv"));
- if (getJNIEnv_ == nullptr) {
- ALOGE("Could not find AndroidRuntime::getJNIEnv.");
- // no return
- }
-
- ibinderForJavaObject_ = reinterpret_cast<ibinderForJavaObject_t>(
- dlsym(handle, "_ZN7android20ibinderForJavaObjectEP7_JNIEnvP8_jobject"));
- if (ibinderForJavaObject_ == nullptr) {
- ALOGE("Could not find ibinderForJavaObject.");
- // no return
- }
- });
-}
-
-JNIEnv* getJNIEnv() {
- load();
- if (getJNIEnv_ == nullptr) {
- return nullptr;
- }
- return (getJNIEnv_)();
-}
-
-sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) {
- load();
- if (ibinderForJavaObject_ == nullptr) {
- return nullptr;
- }
- return (ibinderForJavaObject_)(env, obj);
-}
-
-} // namespace
-
struct AMediaDataSource {
void *userdata;
AMediaDataSourceReadAt readAt;
@@ -181,14 +124,9 @@
if (obj == NULL) {
return NULL;
}
- sp<IBinder> binder;
switch (version) {
case 1:
- binder = ibinderForJavaObject(env, obj);
- if (binder == NULL) {
- return NULL;
- }
- return interface_cast<IMediaHTTPService>(binder);
+ return interface_cast<IMediaHTTPService>(ibinderForJavaObject(env, obj));
case 2:
return new JMedia2HTTPService(env, obj);
default:
@@ -241,7 +179,7 @@
switch (version) {
case 1:
- env = getJNIEnv();
+ env = AndroidRuntime::getJNIEnv();
clazz = "android/media/MediaHTTPService";
method = "createHttpServiceBinderIfNecessary";
signature = "(Ljava/lang/String;)Landroid/os/IBinder;";
diff --git a/media/utils/ServiceUtilities.cpp b/media/utils/ServiceUtilities.cpp
index 2fb24f5..cb681e0 100644
--- a/media/utils/ServiceUtilities.cpp
+++ b/media/utils/ServiceUtilities.cpp
@@ -130,6 +130,14 @@
return ok;
}
+bool captureMediaOutputAllowed(pid_t pid, uid_t uid) {
+ if (isAudioServerOrRootUid(uid)) return true;
+ static const String16 sCaptureMediaOutput("android.permission.CAPTURE_MEDIA_OUTPUT");
+ bool ok = PermissionCache::checkPermission(sCaptureMediaOutput, pid, uid);
+ if (!ok) ALOGE("Request requires android.permission.CAPTURE_MEDIA_OUTPUT");
+ return ok;
+}
+
bool captureHotwordAllowed(pid_t pid, uid_t uid) {
// CAPTURE_AUDIO_HOTWORD permission implies RECORD_AUDIO permission
bool ok = recordingAllowed(String16(""), pid, uid);
diff --git a/media/utils/include/mediautils/ServiceUtilities.h b/media/utils/include/mediautils/ServiceUtilities.h
index 94370ee..9377ff3 100644
--- a/media/utils/include/mediautils/ServiceUtilities.h
+++ b/media/utils/include/mediautils/ServiceUtilities.h
@@ -74,6 +74,7 @@
bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid);
void finishRecording(const String16& opPackageName, uid_t uid);
bool captureAudioOutputAllowed(pid_t pid, uid_t uid);
+bool captureMediaOutputAllowed(pid_t pid, uid_t uid);
bool captureHotwordAllowed(pid_t pid, uid_t uid);
bool settingsAllowed();
bool modifyAudioRoutingAllowed();
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
index f7289ca..f02db6a9 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
@@ -180,7 +180,12 @@
// Loopback render mixes are created from a public API and thus restricted
// to non sensible audio that have not opted out.
if (is_mix_loopback_render(mix->mRouteFlags)) {
- if ((attributes.flags & AUDIO_FLAG_NO_CAPTURE) == AUDIO_FLAG_NO_CAPTURE) {
+ auto hasFlag = [](auto flags, auto flag) { return (flags & flag) == flag; };
+ if (hasFlag(attributes.flags, AUDIO_FLAG_NO_SYSTEM_CAPTURE)) {
+ return MixMatchStatus::NO_MATCH;
+ }
+ if (!mix->mAllowPrivilegedPlaybackCapture &&
+ hasFlag(attributes.flags, AUDIO_FLAG_NO_MEDIA_PROJECTION)) {
return MixMatchStatus::NO_MATCH;
}
if (!(attributes.usage == AUDIO_USAGE_UNKNOWN ||
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 93e3c44..17c6450 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -192,7 +192,7 @@
}
audio_attributes_t attr = *originalAttr;
if (!mPackageManager.allowPlaybackCapture(uid)) {
- attr.flags |= AUDIO_FLAG_NO_CAPTURE;
+ attr.flags |= AUDIO_FLAG_NO_MEDIA_PROJECTION;
}
audio_output_flags_t originalFlags = flags;
AutoCallerClear acc;
@@ -322,7 +322,7 @@
return;
}
sp<AudioPlaybackClient> client = mAudioPlaybackClients.valueAt(index);
- mAudioRecordClients.removeItem(portId);
+ mAudioPlaybackClients.removeItem(portId);
// called from internal thread: no need to clear caller identity
mAudioPolicyManager->releaseOutput(portId);
@@ -1083,6 +1083,14 @@
return PERMISSION_DENIED;
}
+ bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
+ return mix.mAllowPrivilegedPlaybackCapture; });
+ const uid_t callingUid = IPCThreadState::self()->getCallingUid();
+ const pid_t callingPid = IPCThreadState::self()->getCallingPid();
+ if (needCaptureMediaOutput && !captureMediaOutputAllowed(callingPid, callingUid)) {
+ return PERMISSION_DENIED;
+ }
+
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 51d0682..8113c3f 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -972,8 +972,9 @@
userid_t clientUserId = multiuser_get_user_id(clientUid);
// Only allow clients who are being used by the current foreground device user, unless calling
- // from our own process.
- if (callingPid != getpid() && (mAllowedUsers.find(clientUserId) == mAllowedUsers.end())) {
+ // from our own process OR the caller is using the cameraserver's HIDL interface.
+ if (!hardware::IPCThreadState::self()->isServingCall() && callingPid != getpid() &&
+ (mAllowedUsers.find(clientUserId) == mAllowedUsers.end())) {
ALOGE("CameraService::connect X (PID %d) rejected (cannot connect from "
"device user %d, currently allowed device users: %s)", callingPid, clientUserId,
toString(mAllowedUsers).string());