Merge "Install extractors for 1st and 2nd ABIs to the test APEX" into qt-dev
diff --git a/apex/ld.config.txt b/apex/ld.config.txt
index 715113d..87af5a1 100644
--- a/apex/ld.config.txt
+++ b/apex/ld.config.txt
@@ -38,7 +38,8 @@
namespace.platform.isolated = true
namespace.platform.search.paths = /system/${LIB}
-namespace.platform.asan.search.paths = /data/asan/system/${LIB}
+namespace.platform.asan.search.paths = /data/asan/system/${LIB}
+namespace.platform.asan.search.paths += /system/${LIB}
# /system/lib/libc.so, etc are symlinks to /apex/com.android.lib/lib/bionic/libc.so, etc.
# Add /apex/... pat to the permitted paths because linker uses realpath(3)
diff --git a/camera/ndk/Android.bp b/camera/ndk/Android.bp
index d96f403..7786856 100644
--- a/camera/ndk/Android.bp
+++ b/camera/ndk/Android.bp
@@ -64,6 +64,10 @@
"-Wextra",
"-Werror",
],
+ // TODO: jchowdhary@, use header_libs instead b/131165718
+ include_dirs: [
+ "system/media/private/camera/include",
+ ],
export_include_dirs: ["include"],
export_shared_lib_headers: [
"libnativewindow",
@@ -123,6 +127,10 @@
"android.hardware.camera.common@1.0-helper",
"libarect",
],
+ // TODO: jchowdhary@, use header_libs instead b/131165718
+ include_dirs: [
+ "system/media/private/camera/include",
+ ],
product_variables: {
pdk: {
enabled: false,
diff --git a/camera/ndk/NdkCameraManager.cpp b/camera/ndk/NdkCameraManager.cpp
index 23d01ef..3d231a8 100644
--- a/camera/ndk/NdkCameraManager.cpp
+++ b/camera/ndk/NdkCameraManager.cpp
@@ -190,3 +190,17 @@
}
return mgr->openCamera(cameraId, callback, device);
}
+
+#ifdef __ANDROID_VNDK__
+EXPORT
+camera_status_t ACameraManager_getTagFromName(ACameraManager *mgr, const char* cameraId,
+ const char *name, /*out*/uint32_t *tag) {
+ ATRACE_CALL();
+ if (mgr == nullptr || cameraId == nullptr || name == nullptr) {
+ ALOGE("%s: invalid argument! mgr %p cameraId %p name %p",
+ __FUNCTION__, mgr, cameraId, name);
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+ return mgr->getTagFromName(cameraId, name, tag);
+}
+#endif
diff --git a/camera/ndk/include/camera/NdkCameraManager.h b/camera/ndk/include/camera/NdkCameraManager.h
index 5c810bb..2cc8a97 100644
--- a/camera/ndk/include/camera/NdkCameraManager.h
+++ b/camera/ndk/include/camera/NdkCameraManager.h
@@ -374,6 +374,23 @@
ACameraManager* manager,
const ACameraManager_ExtendedAvailabilityCallbacks* callback) __INTRODUCED_IN(29);
+#ifdef __ANDROID_VNDK__
+/**
+ * Retrieve the tag value, given the tag name and camera id.
+ * This method is device specific since some metadata might be defined by device manufacturers
+ * and might only be accessible for specific cameras.
+ * @param manager The {@link ACameraManager} of interest.
+ * @param cameraId The cameraId, which is used to query camera characteristics.
+ * @param name The name of the tag being queried.
+ * @param tag The output tag assigned by this method.
+ *
+ * @return ACAMERA_OK only if the function call was successful.
+ */
+camera_status_t ACameraManager_getTagFromName(ACameraManager *manager, const char* cameraId,
+ const char *name, /*out*/uint32_t *tag)
+ __INTRODUCED_IN(29);
+#endif
+
#endif /* __ANDROID_API__ >= 29 */
__END_DECLS
diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
index 575ee9d..70c887a 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
+++ b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
@@ -22,6 +22,8 @@
#include "ACameraMetadata.h"
#include "ndk_vendor/impl/ACameraDevice.h"
#include "utils.h"
+#include <CameraMetadata.h>
+#include <camera_metadata_hidden.h>
#include <utils/Vector.h>
#include <cutils/properties.h>
@@ -587,6 +589,26 @@
return ACAMERA_OK;
}
+camera_status_t
+ACameraManager::getTagFromName(const char *cameraId, const char *name, uint32_t *tag) {
+ sp<ACameraMetadata> rawChars;
+ camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
+ if (ret != ACAMERA_OK) {
+ ALOGE("%s, Cannot retrieve camera characteristics for camera id %s", __FUNCTION__,
+ cameraId);
+ return ACAMERA_ERROR_METADATA_NOT_FOUND;
+ }
+ const CameraMetadata& metadata = rawChars->getInternalData();
+ const camera_metadata_t *rawMetadata = metadata.getAndLock();
+ metadata_vendor_id_t vendorTagId = get_camera_metadata_vendor_id(rawMetadata);
+ metadata.unlock(rawMetadata);
+ sp<VendorTagDescriptorCache> vtCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
+ sp<VendorTagDescriptor> vTags = nullptr;
+ vtCache->getVendorTagDescriptor(vendorTagId, &vTags);
+ status_t status= metadata.getTagFromName(name, vTags.get(), tag);
+ return status == OK ? ACAMERA_OK : ACAMERA_ERROR_METADATA_NOT_FOUND;
+}
+
ACameraManager::~ACameraManager() {
}
diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.h b/camera/ndk/ndk_vendor/impl/ACameraManager.h
index df69353..2c62d44 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraManager.h
+++ b/camera/ndk/ndk_vendor/impl/ACameraManager.h
@@ -204,6 +204,7 @@
camera_status_t openCamera(const char* cameraId,
ACameraDevice_StateCallbacks* callback,
/*out*/ACameraDevice** device);
+ camera_status_t getTagFromName(const char *cameraId, const char *name, uint32_t *tag);
private:
enum {
diff --git a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
index 7368775..37de30a 100644
--- a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
+++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
@@ -799,6 +799,15 @@
bool isBC = isCapabilitySupported(staticMetadata,
ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE);
+ uint32_t namedTag = 0;
+ // Test that ACameraMetadata_getTagFromName works as expected for public tag
+ // names
+ camera_status_t status = ACameraManager_getTagFromName(mCameraManager, cameraId,
+ "android.control.aeMode", &namedTag);
+
+ ASSERT_EQ(status, ACAMERA_OK);
+ ASSERT_EQ(namedTag, ACAMERA_CONTROL_AE_MODE);
+
ACameraMetadata_free(staticMetadata);
if (!isBC) {
diff --git a/media/codec2/components/aom/C2SoftAomDec.cpp b/media/codec2/components/aom/C2SoftAomDec.cpp
index 4bcc2c6..df4dadb 100644
--- a/media/codec2/components/aom/C2SoftAomDec.cpp
+++ b/media/codec2/components/aom/C2SoftAomDec.cpp
@@ -78,6 +78,26 @@
.withSetter(ProfileLevelSetter, mSize)
.build());
+ mHdr10PlusInfoInput = C2StreamHdr10PlusInfo::input::AllocShared(0);
+ addParameter(
+ DefineParam(mHdr10PlusInfoInput, C2_PARAMKEY_INPUT_HDR10_PLUS_INFO)
+ .withDefault(mHdr10PlusInfoInput)
+ .withFields({
+ C2F(mHdr10PlusInfoInput, m.value).any(),
+ })
+ .withSetter(Hdr10PlusInfoInputSetter)
+ .build());
+
+ mHdr10PlusInfoOutput = C2StreamHdr10PlusInfo::output::AllocShared(0);
+ addParameter(
+ DefineParam(mHdr10PlusInfoOutput, C2_PARAMKEY_OUTPUT_HDR10_PLUS_INFO)
+ .withDefault(mHdr10PlusInfoOutput)
+ .withFields({
+ C2F(mHdr10PlusInfoOutput, m.value).any(),
+ })
+ .withSetter(Hdr10PlusInfoOutputSetter)
+ .build());
+
addParameter(DefineParam(mMaxSize, C2_PARAMKEY_MAX_PICTURE_SIZE)
.withDefault(new C2StreamMaxPictureSizeTuning::output(
0u, 320, 240))
@@ -203,6 +223,18 @@
return mDefaultColorAspects;
}
+ static C2R Hdr10PlusInfoInputSetter(bool mayBlock, C2P<C2StreamHdr10PlusInfo::input> &me) {
+ (void)mayBlock;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+ static C2R Hdr10PlusInfoOutputSetter(bool mayBlock, C2P<C2StreamHdr10PlusInfo::output> &me) {
+ (void)mayBlock;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
private:
std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
@@ -211,6 +243,8 @@
std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
std::shared_ptr<C2StreamColorAspectsTuning::output> mDefaultColorAspects;
+ std::shared_ptr<C2StreamHdr10PlusInfo::input> mHdr10PlusInfoInput;
+ std::shared_ptr<C2StreamHdr10PlusInfo::output> mHdr10PlusInfoOutput;
};
C2SoftAomDec::C2SoftAomDec(const char* name, c2_node_id_t id,
@@ -341,7 +375,8 @@
const std::shared_ptr<C2GraphicBlock>& block) {
std::shared_ptr<C2Buffer> buffer =
createGraphicBuffer(block, C2Rect(mWidth, mHeight));
- auto fillWork = [buffer, index](const std::unique_ptr<C2Work>& work) {
+ auto fillWork = [buffer, index, intf = this->mIntf](
+ const std::unique_ptr<C2Work>& work) {
uint32_t flags = 0;
if ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) &&
(c2_cntr64_t(index) == work->input.ordinal.frameIndex)) {
@@ -353,6 +388,28 @@
work->worklets.front()->output.buffers.push_back(buffer);
work->worklets.front()->output.ordinal = work->input.ordinal;
work->workletsProcessed = 1u;
+
+ for (const std::unique_ptr<C2Param> ¶m: work->input.configUpdate) {
+ if (param) {
+ C2StreamHdr10PlusInfo::input *hdr10PlusInfo =
+ C2StreamHdr10PlusInfo::input::From(param.get());
+
+ if (hdr10PlusInfo != nullptr) {
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ std::unique_ptr<C2Param> outParam = C2Param::CopyAsStream(
+ *param.get(), true /*output*/, param->stream());
+ c2_status_t err = intf->config(
+ { outParam.get() }, C2_MAY_BLOCK, &failures);
+ if (err == C2_OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(*outParam.get()));
+ } else {
+ ALOGE("finishWork: Config update size failed");
+ }
+ break;
+ }
+ }
+ }
};
if (work && c2_cntr64_t(index) == work->input.ordinal.frameIndex) {
fillWork(work);
diff --git a/media/codec2/components/opus/C2SoftOpusEnc.cpp b/media/codec2/components/opus/C2SoftOpusEnc.cpp
index a0b2443..f1020c3 100644
--- a/media/codec2/components/opus/C2SoftOpusEnc.cpp
+++ b/media/codec2/components/opus/C2SoftOpusEnc.cpp
@@ -194,12 +194,12 @@
return C2_BAD_VALUE;
}
- // Unconstrained VBR
- if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR(0) != OPUS_OK)) {
+ // Constrained VBR
+ if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR(1) != OPUS_OK)) {
ALOGE("failed to set vbr type");
return C2_BAD_VALUE;
}
- if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR_CONSTRAINT(0) !=
+ if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR_CONSTRAINT(1) !=
OPUS_OK)) {
ALOGE("failed to set vbr constraint");
return C2_BAD_VALUE;
diff --git a/media/codec2/sfplugin/utils/Codec2Mapper.cpp b/media/codec2/sfplugin/utils/Codec2Mapper.cpp
index d62944a..40160c7 100644
--- a/media/codec2/sfplugin/utils/Codec2Mapper.cpp
+++ b/media/codec2/sfplugin/utils/Codec2Mapper.cpp
@@ -379,11 +379,19 @@
ALookup<C2Config::profile_t, int32_t> sAv1Profiles = {
- { C2Config::PROFILE_AV1_0, AV1Profile0 },
- { C2Config::PROFILE_AV1_1, AV1Profile1 },
- { C2Config::PROFILE_AV1_2, AV1Profile2 },
+ // TODO: will need to disambiguate between Main8 and Main10
+ { C2Config::PROFILE_AV1_0, AV1ProfileMain8 },
+ { C2Config::PROFILE_AV1_0, AV1ProfileMain10 },
};
+ALookup<C2Config::profile_t, int32_t> sAv1HdrProfiles = {
+ { C2Config::PROFILE_AV1_0, AV1ProfileMain10 },
+ { C2Config::PROFILE_AV1_0, AV1ProfileMain10HDR10 },
+};
+
+ALookup<C2Config::profile_t, int32_t> sAv1Hdr10PlusProfiles = {
+ { C2Config::PROFILE_AV1_0, AV1ProfileMain10HDR10Plus },
+};
/**
* A helper that passes through vendor extension profile and level values.
@@ -590,6 +598,10 @@
};
struct Av1ProfileLevelMapper : ProfileLevelMapperHelper {
+ Av1ProfileLevelMapper(bool isHdr = false, bool isHdr10Plus = false) :
+ ProfileLevelMapperHelper(),
+ mIsHdr(isHdr), mIsHdr10Plus(isHdr10Plus) {}
+
virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
return sAv1Levels.map(from, to);
}
@@ -597,11 +609,19 @@
return sAv1Levels.map(from, to);
}
virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
- return sAv1Profiles.map(from, to);
+ return mIsHdr10Plus ? sAv1Hdr10PlusProfiles.map(from, to) :
+ mIsHdr ? sAv1HdrProfiles.map(from, to) :
+ sAv1Profiles.map(from, to);
}
virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
- return sAv1Profiles.map(from, to);
+ return mIsHdr10Plus ? sAv1Hdr10PlusProfiles.map(from, to) :
+ mIsHdr ? sAv1HdrProfiles.map(from, to) :
+ sAv1Profiles.map(from, to);
}
+
+private:
+ bool mIsHdr;
+ bool mIsHdr10Plus;
};
} // namespace
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 5a31c58..e1bfb62 100755
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -338,13 +338,16 @@
return MEDIA_MIMETYPE_VIDEO_HEVC;
case FOURCC("ac-4"):
return MEDIA_MIMETYPE_AUDIO_AC4;
+ case FOURCC("Opus"):
+ return MEDIA_MIMETYPE_AUDIO_OPUS;
case FOURCC("twos"):
case FOURCC("sowt"):
return MEDIA_MIMETYPE_AUDIO_RAW;
case FOURCC("alac"):
return MEDIA_MIMETYPE_AUDIO_ALAC;
-
+ case FOURCC("fLaC"):
+ return MEDIA_MIMETYPE_AUDIO_FLAC;
case FOURCC("av01"):
return MEDIA_MIMETYPE_VIDEO_AV1;
case FOURCC(".mp3"):
@@ -1640,9 +1643,11 @@
case FOURCC("enca"):
case FOURCC("samr"):
case FOURCC("sawb"):
+ case FOURCC("Opus"):
case FOURCC("twos"):
case FOURCC("sowt"):
case FOURCC("alac"):
+ case FOURCC("fLaC"):
case FOURCC(".mp3"):
case 0x6D730055: // "ms U" mp3 audio
{
@@ -1729,6 +1734,47 @@
AMediaFormat_setInt32(mLastTrack->meta, AMEDIAFORMAT_KEY_CHANNEL_COUNT, num_channels);
AMediaFormat_setInt32(mLastTrack->meta, AMEDIAFORMAT_KEY_SAMPLE_RATE, sample_rate);
+ if (chunk_type == FOURCC("Opus")) {
+ uint8_t opusInfo[19];
+ data_offset += sizeof(buffer);
+ // Read Opus Header
+ if (mDataSource->readAt(
+ data_offset, opusInfo, sizeof(opusInfo)) < (ssize_t)sizeof(opusInfo)) {
+ return ERROR_IO;
+ }
+
+ // OpusHeader must start with this magic sequence
+ // http://wiki.xiph.org/OggOpus#ID_Header
+ strncpy((char *)opusInfo, "OpusHead", 8);
+
+ // Read Opus Specific Box values
+ size_t opusOffset = 10;
+ uint16_t pre_skip = U16_AT(&opusInfo[opusOffset]);
+ uint32_t sample_rate = U32_AT(&opusInfo[opusOffset + 2]);
+ uint16_t out_gain = U16_AT(&opusInfo[opusOffset + 6]);
+
+ // Convert Opus Specific Box values. ParseOpusHeader expects
+ // the values in LE, however MP4 stores these values as BE
+ // https://opus-codec.org/docs/opus_in_isobmff.html#4.3.2
+ memcpy(&opusInfo[opusOffset], &pre_skip, sizeof(pre_skip));
+ memcpy(&opusInfo[opusOffset + 2], &sample_rate, sizeof(sample_rate));
+ memcpy(&opusInfo[opusOffset + 6], &out_gain, sizeof(out_gain));
+
+ int64_t codecDelay = 6500000;
+ int64_t seekPreRollNs = 80000000; // Fixed 80 msec
+
+ AMediaFormat_setBuffer(mLastTrack->meta,
+ AMEDIAFORMAT_KEY_CSD_0, opusInfo, sizeof(opusInfo));
+ AMediaFormat_setBuffer(mLastTrack->meta,
+ AMEDIAFORMAT_KEY_CSD_1, &codecDelay, sizeof(codecDelay));
+ AMediaFormat_setBuffer(mLastTrack->meta,
+ AMEDIAFORMAT_KEY_CSD_2, &seekPreRollNs, sizeof(seekPreRollNs));
+
+ data_offset += sizeof(opusInfo);
+ *offset = data_offset;
+ CHECK_EQ(*offset, stop_offset);
+ }
+
if (chunk_type == FOURCC("alac")) {
// See 'external/alac/ALACMagicCookieDescription.txt for the detail'.
@@ -1766,6 +1812,29 @@
CHECK_EQ(*offset, stop_offset);
}
+ if (chunk_type == FOURCC("fLaC")) {
+
+ // From https://github.com/xiph/flac/blob/master/doc/isoflac.txt
+ // 4 for mime, 4 for blockType and BlockLen, 34 for metadata
+ uint8_t flacInfo[4 + 4 + 34];
+ // skipping dFla, version
+ data_offset += sizeof(buffer) + 12;
+ size_t flacOffset = 4;
+ // Add flaC header mime type to CSD
+ strncpy((char *)flacInfo, "fLaC", 4);
+ if (mDataSource->readAt(
+ data_offset, flacInfo + flacOffset, sizeof(flacInfo) - flacOffset) <
+ (ssize_t)sizeof(flacInfo) - flacOffset) {
+ return ERROR_IO;
+ }
+ data_offset += sizeof(flacInfo) - flacOffset;
+
+ AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_0, flacInfo,
+ sizeof(flacInfo));
+ *offset = data_offset;
+ CHECK_EQ(*offset, stop_offset);
+ }
+
while (*offset < stop_offset) {
status_t err = parseChunk(offset, depth + 1);
if (err != OK) {
diff --git a/media/extractors/mpeg2/ExtractorBundle.cpp b/media/extractors/mpeg2/ExtractorBundle.cpp
index 946a2a9..a7c756b 100644
--- a/media/extractors/mpeg2/ExtractorBundle.cpp
+++ b/media/extractors/mpeg2/ExtractorBundle.cpp
@@ -29,6 +29,8 @@
static const char *extensions[] = {
"m2p",
+ "m2ts",
+ "mts",
"ts",
NULL
};
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
index 49dd0b4..50ce657 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
@@ -238,6 +238,12 @@
mParser(new ATSParser),
mLastSyncEvent(0),
mOffset(0) {
+ char header;
+ if (source->readAt(0, &header, 1) == 1 && header == 0x47) {
+ mHeaderSkip = 0;
+ } else {
+ mHeaderSkip = 4;
+ }
init();
}
@@ -460,7 +466,7 @@
Mutex::Autolock autoLock(mLock);
uint8_t packet[kTSPacketSize];
- ssize_t n = mDataSource->readAt(mOffset, packet, kTSPacketSize);
+ ssize_t n = mDataSource->readAt(mOffset + mHeaderSkip, packet, kTSPacketSize);
if (n < (ssize_t)kTSPacketSize) {
if (n >= 0) {
@@ -470,7 +476,7 @@
}
ATSParser::SyncEvent event(mOffset);
- mOffset += n;
+ mOffset += mHeaderSkip + n;
status_t err = mParser->feedTSPacket(packet, kTSPacketSize, &event);
if (event.hasReturnedData()) {
if (isInit) {
@@ -539,15 +545,15 @@
break;
}
- ssize_t n = mDataSource->readAt(offset, packet, kTSPacketSize);
+ ssize_t n = mDataSource->readAt(offset+mHeaderSkip, packet, kTSPacketSize);
if (n < 0) {
return n;
} else if (n < (ssize_t)kTSPacketSize) {
break;
}
- offset += kTSPacketSize;
- bytesRead += kTSPacketSize;
+ offset += kTSPacketSize + mHeaderSkip;
+ bytesRead += kTSPacketSize + mHeaderSkip;
err = parser->feedTSPacket(packet, kTSPacketSize, &ev);
if (err != OK) {
return err;
@@ -791,7 +797,17 @@
char header;
if (source->readAt(kTSPacketSize * i, &header, 1) != 1
|| header != 0x47) {
- return false;
+ // not ts file, check if m2ts file
+ for (int j = 0; j < 5; ++j) {
+ char headers[5];
+ if (source->readAt((kTSPacketSize + 4) * j, &headers, 5) != 5
+ || headers[4] != 0x47) {
+ // not m2ts file too, return
+ return false;
+ }
+ }
+ ALOGV("this is m2ts file\n");
+ break;
}
}
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.h b/media/extractors/mpeg2/MPEG2TSExtractor.h
index 2537d3b..dcd1e7b 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.h
@@ -102,6 +102,7 @@
status_t estimateDurationsFromTimesUsAtEnd();
+ size_t mHeaderSkip;
DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSExtractor);
};
diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp
index b63ae6b..72b94bb 100644
--- a/media/extractors/ogg/OggExtractor.cpp
+++ b/media/extractors/ogg/OggExtractor.cpp
@@ -323,6 +323,7 @@
mFirstDataOffset(-1),
mHapticChannelCount(0) {
mCurrentPage.mNumSegments = 0;
+ mCurrentPage.mFlags = 0;
vorbis_info_init(&mVi);
vorbis_comment_init(&mVc);
@@ -414,19 +415,18 @@
ALOGV("prevPageOffset at %lld, pageOffset at %lld",
(long long)prevPageOffset, (long long)pageOffset);
-
+ uint8_t flag = 0;
for (;;) {
Page prevPage;
ssize_t n = readPage(prevPageOffset, &prevPage);
if (n <= 0) {
- return (status_t)n;
+ return (flag & 0x4) ? OK : (status_t)n;
}
-
+ flag = prevPage.mFlags;
prevPageOffset += n;
-
+ *granulePos = prevPage.mGranulePosition;
if (prevPageOffset == pageOffset) {
- *granulePos = prevPage.mGranulePosition;
return OK;
}
}
@@ -688,7 +688,7 @@
TRESPASS();
}
- uint32_t numSamples = frameSizeUs * numFrames * kOpusSampleRate / 1000000;
+ uint32_t numSamples = (uint32_t)((uint64_t)frameSizeUs * numFrames * kOpusSampleRate) / 1000000;
return numSamples;
}
@@ -868,6 +868,7 @@
CHECK_EQ(mNextLaceIndex, mCurrentPage.mNumSegments);
mOffset += mCurrentPageSize;
+ uint8_t flag = mCurrentPage.mFlags;
ssize_t n = readPage(mOffset, &mCurrentPage);
if (n <= 0) {
@@ -878,6 +879,7 @@
ALOGV("readPage returned %zd", n);
+ if (flag & 0x04) return AMEDIA_ERROR_END_OF_STREAM;
return (media_status_t) n;
}
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index e9b6fb1..03bd6ce 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -59,6 +59,7 @@
"IEffectClient.cpp",
"ToneGenerator.cpp",
"PlayerBase.cpp",
+ "RecordingActivityTracker.cpp",
"TrackPlayerBase.cpp",
],
shared_libs: [
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index f07be46..0cce5bc 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -22,7 +22,11 @@
#include <android-base/macros.h>
#include <sys/resource.h>
+#include <audiomanager/AudioManager.h>
+#include <audiomanager/IAudioManager.h>
+#include <binder/Binder.h>
#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
#include <media/AudioRecord.h>
#include <utils/Log.h>
#include <private/media/AudioTrackShared.h>
@@ -219,6 +223,8 @@
inputSource, sampleRate, format, channelMask, frameCount, notificationFrames,
sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid);
+ mTracker.reset(new RecordingActivityTracker());
+
mSelectedDeviceId = selectedDeviceId;
mSelectedMicDirection = selectedMicDirection;
mSelectedMicFieldDimension = microphoneFieldDimension;
@@ -396,6 +402,7 @@
// This is legacy behavior. This is not done in stop() to avoid a race condition
// where the last marker event is issued twice.
mMarkerReached = false;
+ // mActive is checked by restoreRecord_l
mActive = true;
status_t status = NO_ERROR;
@@ -416,7 +423,9 @@
if (status != NO_ERROR) {
mActive = false;
ALOGE("%s(%d): status %d", __func__, mPortId, status);
+ mMediaMetrics.markError(status, __FUNCTION__);
} else {
+ mTracker->recordingStarted();
sp<AudioRecordThread> t = mAudioRecordThread;
if (t != 0) {
t->resume();
@@ -429,10 +438,6 @@
// we've successfully started, log that time
mMediaMetrics.logStart(systemTime());
}
-
- if (status != NO_ERROR) {
- mMediaMetrics.markError(status, __FUNCTION__);
- }
return status;
}
@@ -447,6 +452,7 @@
mActive = false;
mProxy->interrupt();
mAudioRecord->stop();
+ mTracker->recordingStopped();
// Note: legacy handling - stop does not clear record marker and
// periodic update position; we update those on start().
@@ -711,6 +717,7 @@
}
}
input.opPackageName = opPackageName;
+ input.riid = mTracker->getRiid();
input.flags = mFlags;
// The notification frame count is the period between callbacks, as suggested by the client
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index de82d2b..47e2c28 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -428,6 +428,7 @@
audio_unique_id_t AudioSystem::newAudioUniqueId(audio_unique_id_use_t use)
{
+ // Must not use AF as IDs will re-roll on audioserver restart, b/130369529.
const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE;
return af->newAudioUniqueId(use);
@@ -924,6 +925,7 @@
status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
pid_t pid,
uid_t uid,
@@ -936,7 +938,7 @@
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return NO_INIT;
return aps->getInputForAttr(
- attr, input, session, pid, uid, opPackageName,
+ attr, input, riid, session, pid, uid, opPackageName,
config, flags, selectedDeviceId, portId);
}
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index 4a8bb52..9b4221c 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -305,6 +305,7 @@
virtual status_t getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
pid_t pid,
uid_t uid,
@@ -334,6 +335,7 @@
}
data.write(attr, sizeof(audio_attributes_t));
data.writeInt32(*input);
+ data.writeInt32(riid);
data.writeInt32(session);
data.writeInt32(pid);
data.writeInt32(uid);
@@ -1511,6 +1513,7 @@
data.read(&attr, sizeof(audio_attributes_t));
sanetizeAudioAttributes(&attr);
audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
+ audio_unique_id_t riid = (audio_unique_id_t)data.readInt32();
audio_session_t session = (audio_session_t)data.readInt32();
pid_t pid = (pid_t)data.readInt32();
uid_t uid = (uid_t)data.readInt32();
@@ -1521,7 +1524,7 @@
audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
- status_t status = getInputForAttr(&attr, &input, session, pid, uid,
+ status_t status = getInputForAttr(&attr, &input, riid, session, pid, uid,
opPackageName, &config,
flags, &selectedDeviceId, &portId);
reply->writeInt32(status);
diff --git a/media/libaudioclient/IAudioPolicyServiceClient.cpp b/media/libaudioclient/IAudioPolicyServiceClient.cpp
index 52d8ccd..0f9580c 100644
--- a/media/libaudioclient/IAudioPolicyServiceClient.cpp
+++ b/media/libaudioclient/IAudioPolicyServiceClient.cpp
@@ -50,6 +50,7 @@
}
inline void readRecordClientInfoFromParcel(const Parcel& data, record_client_info_t *clientInfo) {
+ clientInfo->riid = (audio_unique_id_t) data.readInt32();
clientInfo->uid = (uid_t) data.readUint32();
clientInfo->session = (audio_session_t) data.readInt32();
clientInfo->source = (audio_source_t) data.readInt32();
@@ -58,6 +59,7 @@
}
inline void writeRecordClientInfoToParcel(Parcel& data, const record_client_info_t *clientInfo) {
+ data.writeInt32((int32_t) clientInfo->riid);
data.writeUint32((uint32_t) clientInfo->uid);
data.writeInt32((int32_t) clientInfo->session);
data.writeInt32((int32_t) clientInfo->source);
diff --git a/media/libaudioclient/RecordingActivityTracker.cpp b/media/libaudioclient/RecordingActivityTracker.cpp
new file mode 100644
index 0000000..bd10895
--- /dev/null
+++ b/media/libaudioclient/RecordingActivityTracker.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include <audiomanager/AudioManager.h>
+#include <audiomanager/IAudioManager.h>
+#include <binder/Binder.h>
+#include <binder/IServiceManager.h>
+#include <media/RecordingActivityTracker.h>
+
+namespace android {
+
+RecordingActivityTracker::RecordingActivityTracker()
+ : mRIId(RECORD_RIID_INVALID), mToken(new BBinder())
+{
+ // use checkService() to avoid blocking if audio service is not up yet
+ sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
+ if (binder != 0) {
+ mAudioManager = interface_cast<IAudioManager>(binder);
+ } else {
+ ALOGE("RecordingActivityTracker(): binding to audio service failed, service up?");
+ }
+}
+
+RecordingActivityTracker::~RecordingActivityTracker()
+{
+}
+
+audio_unique_id_t RecordingActivityTracker::getRiid()
+{
+ if (mRIId == RECORD_RIID_INVALID && mAudioManager) {
+ mRIId = mAudioManager->trackRecorder(mToken);
+ }
+ return mRIId;
+}
+
+void RecordingActivityTracker::recordingStarted()
+{
+ if (getRiid() != RECORD_RIID_INVALID && mAudioManager) {
+ mAudioManager->recorderEvent(mRIId, RECORDER_STATE_STARTED);
+ }
+}
+
+void RecordingActivityTracker::recordingStopped()
+{
+ if (getRiid() != RECORD_RIID_INVALID && mAudioManager) {
+ mAudioManager->recorderEvent(mRIId, RECORDER_STATE_STOPPED);
+ }
+}
+
+} // namespace android
diff --git a/media/libaudioclient/include/media/AudioPolicy.h b/media/libaudioclient/include/media/AudioPolicy.h
index 4b94c12..a40e019 100644
--- a/media/libaudioclient/include/media/AudioPolicy.h
+++ b/media/libaudioclient/include/media/AudioPolicy.h
@@ -119,11 +119,11 @@
};
-// definitions for audio recording configuration updates
-// which update type is reported
-#define RECORD_CONFIG_EVENT_NONE -1
-#define RECORD_CONFIG_EVENT_START 1
-#define RECORD_CONFIG_EVENT_STOP 0
+// definitions for audio recording configuration updates;
+// keep in sync with AudioManager.java for values used from native code
+#define RECORD_CONFIG_EVENT_START 0
+#define RECORD_CONFIG_EVENT_STOP 1
+#define RECORD_CONFIG_EVENT_UPDATE 2
static inline bool is_mix_loopback_render(uint32_t routeFlags) {
return (routeFlags & MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER)
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index 9c81bb7..a3c0fe4 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -17,6 +17,9 @@
#ifndef ANDROID_AUDIORECORD_H
#define ANDROID_AUDIORECORD_H
+#include <memory>
+#include <vector>
+
#include <binder/IMemory.h>
#include <cutils/sched_policy.h>
#include <media/AudioSystem.h>
@@ -24,9 +27,9 @@
#include <media/MediaAnalyticsItem.h>
#include <media/Modulo.h>
#include <media/MicrophoneInfo.h>
+#include <media/RecordingActivityTracker.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
-#include <vector>
#include "android/media/IAudioRecord.h"
@@ -618,6 +621,8 @@
sp<AudioRecordThread> mAudioRecordThread;
mutable Mutex mLock;
+ std::unique_ptr<RecordingActivityTracker> mTracker;
+
// Current client state: false = stopped, true = active. Protected by mLock. If more states
// are added, consider changing this to enum State { ... } mState as in AudioTrack.
bool mActive;
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index d180bbc..d3035da 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -242,6 +242,7 @@
// or release it with releaseInput().
static status_t getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
pid_t pid,
uid_t uid,
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index dcc18b6..8ec8931 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -205,6 +205,9 @@
return DEAD_OBJECT;
}
opPackageName = parcel->readString16();
+ if (parcel->read(&riid, sizeof(audio_unique_id_t)) != NO_ERROR) {
+ return DEAD_OBJECT;
+ }
/* input/output arguments*/
(void)parcel->read(&flags, sizeof(audio_input_flags_t));
@@ -221,6 +224,7 @@
(void)parcel->write(&config, sizeof(audio_config_base_t));
(void)clientInfo.writeToParcel(parcel);
(void)parcel->writeString16(opPackageName);
+ (void)parcel->write(&riid, sizeof(audio_unique_id_t));
/* input/output arguments*/
(void)parcel->write(&flags, sizeof(audio_input_flags_t));
@@ -236,6 +240,7 @@
audio_config_base_t config;
AudioClient clientInfo;
String16 opPackageName;
+ audio_unique_id_t riid;
/* input/output */
audio_input_flags_t flags;
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index 11983d5..b639044 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -73,6 +73,7 @@
virtual void releaseOutput(audio_port_handle_t portId) = 0;
virtual status_t getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
pid_t pid,
uid_t uid,
diff --git a/media/libaudioclient/include/media/IAudioPolicyServiceClient.h b/media/libaudioclient/include/media/IAudioPolicyServiceClient.h
index 79008c3..47b31ee 100644
--- a/media/libaudioclient/include/media/IAudioPolicyServiceClient.h
+++ b/media/libaudioclient/include/media/IAudioPolicyServiceClient.h
@@ -31,6 +31,7 @@
// ----------------------------------------------------------------------------
struct record_client_info {
+ audio_unique_id_t riid;
uid_t uid;
audio_session_t session;
audio_source_t source;
diff --git a/media/libaudioclient/include/media/RecordingActivityTracker.h b/media/libaudioclient/include/media/RecordingActivityTracker.h
new file mode 100644
index 0000000..9891a70
--- /dev/null
+++ b/media/libaudioclient/include/media/RecordingActivityTracker.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 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 __ANDROID_RECORDING_ACTIVITY_TRACKER_H__
+#define __ANDROID_RECORDING_ACTIVITY_TRACKER_H__
+
+#include <utils/StrongPointer.h>
+
+namespace android {
+
+class IAudioManager;
+class IBinder;
+
+class RecordingActivityTracker
+{
+public:
+ RecordingActivityTracker();
+ ~RecordingActivityTracker();
+ audio_unique_id_t getRiid();
+ void recordingStarted();
+ void recordingStopped();
+
+private:
+ sp<IAudioManager> mAudioManager;
+ audio_unique_id_t mRIId;
+ sp<IBinder> mToken;
+};
+
+} // namespace android
+
+#endif // __ANDROID_RECORDING_ACTIVITY_TRACKER_H__
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 3b87462..317b5ec 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -2580,6 +2580,8 @@
layerParams.nPLayerCountActual = numLayers - numBLayers;
layerParams.nBLayerCountActual = numBLayers;
layerParams.bBitrateRatiosSpecified = OMX_FALSE;
+ layerParams.nLayerCountMax = numLayers;
+ layerParams.nBLayerCountMax = numBLayers;
err = mOMXNode->setParameter(
(OMX_INDEXTYPE)OMX_IndexParamAndroidVideoTemporalLayering,
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 2ca5eee..e56750b 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -1110,6 +1110,9 @@
reset();
}
if (!isResourceError(err)) {
+ if (err == OK) {
+ disableLegacyBufferDropPostQ(surface);
+ }
break;
}
}
@@ -1175,7 +1178,11 @@
msg->setObject("surface", surface);
sp<AMessage> response;
- return PostAndAwaitResponse(msg, &response);
+ status_t result = PostAndAwaitResponse(msg, &response);
+ if (result == OK) {
+ disableLegacyBufferDropPostQ(surface);
+ }
+ return result;
}
status_t MediaCodec::createInputSurface(
diff --git a/media/libstagefright/SurfaceUtils.cpp b/media/libstagefright/SurfaceUtils.cpp
index 9e11a94..4c94baa 100644
--- a/media/libstagefright/SurfaceUtils.cpp
+++ b/media/libstagefright/SurfaceUtils.cpp
@@ -18,10 +18,13 @@
#define LOG_TAG "SurfaceUtils"
#include <utils/Log.h>
+#include <android/api-level.h>
#include <media/hardware/VideoAPI.h>
#include <media/stagefright/SurfaceUtils.h>
#include <gui/Surface.h>
+extern "C" int android_get_application_target_sdk_version();
+
namespace android {
status_t setNativeWindowSizeFormatAndUsage(
@@ -291,5 +294,28 @@
return err;
}
+
+status_t disableLegacyBufferDropPostQ(const sp<Surface> &surface) {
+ sp<IGraphicBufferProducer> igbp =
+ surface ? surface->getIGraphicBufferProducer() : nullptr;
+ if (igbp) {
+ int targetSdk = android_get_application_target_sdk_version();
+ // When the caller is not an app (e.g. MediaPlayer in mediaserver)
+ // targetSdk is __ANDROID_API_FUTURE__.
+ bool drop =
+ targetSdk < __ANDROID_API_Q__ ||
+ targetSdk == __ANDROID_API_FUTURE__;
+ if (!drop) {
+ status_t err = igbp->setLegacyBufferDrop(false);
+ if (err == NO_ERROR) {
+ ALOGD("legacy buffer drop disabled: target sdk (%d)",
+ targetSdk);
+ } else {
+ ALOGD("disabling legacy buffer drop failed: %d", err);
+ }
+ }
+ }
+ return NO_ERROR;
+}
} // namespace android
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 537e4c0..3de934f 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -1101,7 +1101,9 @@
} else if (meta->findData(kKeyHVCC, &type, &data, &size)) {
const uint8_t *ptr = (const uint8_t *)data;
- if (size < 23 || ptr[0] != 1) { // configurationVersion == 1
+ if (size < 23 || (ptr[0] != 1 && ptr[0] != 0)) {
+ // configurationVersion == 1 or 0
+ // 1 is what the standard dictates, but some old muxers may have used 0.
ALOGE("b/23680780");
return BAD_VALUE;
}
diff --git a/media/libstagefright/VideoFrameSchedulerBase.cpp b/media/libstagefright/VideoFrameSchedulerBase.cpp
index 912dcf3..0d1517b 100644
--- a/media/libstagefright/VideoFrameSchedulerBase.cpp
+++ b/media/libstagefright/VideoFrameSchedulerBase.cpp
@@ -115,6 +115,9 @@
#endif
+// If overflow happens, the value is already incorrect, and no mater what value we get is OK.
+// And this part of calculation is not important, so it's OK to simply disable overflow check
+// instead of using double which makes code more complicated.
__attribute__((no_sanitize("integer")))
bool VideoFrameSchedulerBase::PLL::fit(
nsecs_t phase, nsecs_t period, size_t numSamplesToUse,
diff --git a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
index c84614a..50d7724 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
@@ -356,16 +356,18 @@
}
}
-constexpr int32_t AV1Profile0 = 0x01;
-constexpr int32_t AV1Profile1 = 0x02;
-constexpr int32_t AV1Profile2 = 0x04;
+constexpr int32_t AV1ProfileMain8 = 0x1;
+constexpr int32_t AV1ProfileMain10 = 0x2;
+constexpr int32_t AV1ProfileMain10HDR10 = 0x1000;
+constexpr int32_t AV1ProfileMain10HDR10Plus = 0x2000;
inline static const char *asString_AV1Profile(int32_t i, const char *def = "??") {
switch (i) {
- case AV1Profile0: return "0";
- case AV1Profile1: return "1";
- case AV1Profile2: return "2";
- default: return def;
+ case AV1ProfileMain8: return "Main8";
+ case AV1ProfileMain10: return "Main10HDR";
+ case AV1ProfileMain10HDR10: return "Main10HDR10";
+ case AV1ProfileMain10HDR10Plus: return "Main10HDRPlus";
+ default: return def;
}
}
diff --git a/media/libstagefright/include/media/stagefright/SurfaceUtils.h b/media/libstagefright/include/media/stagefright/SurfaceUtils.h
index 689e458..ae55c65 100644
--- a/media/libstagefright/include/media/stagefright/SurfaceUtils.h
+++ b/media/libstagefright/include/media/stagefright/SurfaceUtils.h
@@ -19,8 +19,10 @@
#define SURFACE_UTILS_H_
#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
struct ANativeWindow;
+class Surface;
namespace android {
@@ -40,6 +42,15 @@
status_t nativeWindowConnect(ANativeWindow *surface, const char *reason);
status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason);
+/**
+ * Disable buffer dropping behavior of BufferQueue if target sdk of application
+ * is Q or later. If the caller is not an app (e.g. MediaPlayer in mediaserver)
+ * retain buffer dropping behavior.
+ *
+ * @return NO_ERROR
+ */
+status_t disableLegacyBufferDropPostQ(const sp<Surface> &surface);
+
} // namespace android
#endif // SURFACE_UTILS_H_
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 55db699..0f03b7e 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -46,6 +46,7 @@
#include <cutils/properties.h>
#include <system/audio.h>
+#include <audiomanager/AudioManager.h>
#include "AudioFlinger.h"
#include "NBAIO_Tee.h"
@@ -312,6 +313,7 @@
"%s does not support secondary outputs, ignoring them", __func__);
} else {
ret = AudioSystem::getInputForAttr(attr, &io,
+ RECORD_RIID_INVALID,
actualSessionId,
client.clientPid,
client.clientUid,
@@ -1889,6 +1891,7 @@
portId = AUDIO_PORT_HANDLE_NONE;
}
lStatus = AudioSystem::getInputForAttr(&input.attr, &output.inputId,
+ input.riid,
sessionId,
// FIXME compare to AudioTrack
clientPid,
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 711a6dd..fd29f31 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -59,6 +59,7 @@
#include <media/nbaio/SourceAudioBufferProvider.h>
#include <mediautils/BatteryNotifier.h>
+#include <audiomanager/AudioManager.h>
#include <powermanager/PowerManager.h>
#include <media/audiohal/EffectsFactoryHalInterface.h>
@@ -8561,6 +8562,7 @@
config.format = mFormat;
audio_port_handle_t deviceId = mDeviceId;
ret = AudioSystem::getInputForAttr(&mAttr, &io,
+ RECORD_RIID_INVALID,
mSessionId,
client.clientPid,
client.clientUid,
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index 4b56a46..49937f0 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -124,6 +124,7 @@
// request an input appropriate for record from the supplied device with supplied parameters.
virtual status_t getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
uid_t uid,
const audio_config_base_t *config,
diff --git a/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h
index 4bb225d..0d05a63 100644
--- a/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h
+++ b/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h
@@ -22,6 +22,7 @@
#include <sys/types.h>
#include <system/audio.h>
+#include <audiomanager/AudioManager.h>
#include <media/AudioProductStrategy.h>
#include <utils/Errors.h>
#include <utils/KeyedVector.h>
@@ -146,20 +147,23 @@
class RecordClientDescriptor: public ClientDescriptor
{
public:
- RecordClientDescriptor(audio_port_handle_t portId, uid_t uid, audio_session_t sessionId,
- audio_attributes_t attributes, audio_config_base_t config,
- audio_port_handle_t preferredDeviceId,
+ RecordClientDescriptor(audio_port_handle_t portId, audio_unique_id_t riid, uid_t uid,
+ audio_session_t sessionId, audio_attributes_t attributes,
+ audio_config_base_t config, audio_port_handle_t preferredDeviceId,
audio_source_t source, audio_input_flags_t flags, bool isSoundTrigger) :
ClientDescriptor(portId, uid, sessionId, attributes, config, preferredDeviceId),
- mSource(source), mFlags(flags), mIsSoundTrigger(isSoundTrigger), mAppState(APP_STATE_IDLE) {}
+ mRIId(riid), mSource(source), mFlags(flags), mIsSoundTrigger(isSoundTrigger),
+ mAppState(APP_STATE_IDLE) {}
~RecordClientDescriptor() override = default;
using ClientDescriptor::dump;
void dump(String8 *dst, int spaces, int index) const override;
+ audio_unique_id_t riid() const { return mRIId; }
audio_source_t source() const { return mSource; }
audio_input_flags_t flags() const { return mFlags; }
bool isSoundTrigger() const { return mIsSoundTrigger; }
+ bool isLowLevel() const { return mRIId == RECORD_RIID_INVALID; }
void setAppState(app_state_t appState) { mAppState = appState; }
app_state_t appState() { return mAppState; }
bool isSilenced() const { return mAppState == APP_STATE_IDLE; }
@@ -167,6 +171,7 @@
EffectDescriptorCollection getEnabledEffects() const { return mEnabledEffects; }
private:
+ const audio_unique_id_t mRIId;
const audio_source_t mSource;
const audio_input_flags_t mFlags;
const bool mIsSoundTrigger;
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
index 58683be..a096e8f 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "APM::AudioInputDescriptor"
//#define LOG_NDEBUG 0
+#include <audiomanager/AudioManager.h>
#include <media/AudioPolicy.h>
#include <policy.h>
#include <AudioPolicyInterface.h>
@@ -179,7 +180,9 @@
mPatchHandle = handle;
for (const auto &client : getClientIterable()) {
if (client->active()) {
- updateClientRecordingConfiguration(RECORD_CONFIG_EVENT_START, client);
+ updateClientRecordingConfiguration(
+ client->isLowLevel() ? RECORD_CONFIG_EVENT_START : RECORD_CONFIG_EVENT_UPDATE,
+ client);
}
}
}
@@ -342,15 +345,19 @@
void AudioInputDescriptor::updateClientRecordingConfiguration(
int event, const sp<RecordClientDescriptor>& client)
{
+ ALOGV("%s riid %d uid %d port %d session %d event %d",
+ __func__, client->riid(), client->uid(), client->portId(), client->session(), event);
// do not send callback if starting and no device is selected yet to avoid
// double callbacks from startInput() before and after the device is selected
- if (event == RECORD_CONFIG_EVENT_START
- && mPatchHandle == AUDIO_PATCH_HANDLE_NONE) {
+ // "start" and "stop" events for "high level" clients (AudioRecord) are sent by the client side
+ if ((event == RECORD_CONFIG_EVENT_START && mPatchHandle == AUDIO_PATCH_HANDLE_NONE)
+ || (!client->isLowLevel()
+ && (event == RECORD_CONFIG_EVENT_START || event == RECORD_CONFIG_EVENT_STOP))) {
return;
}
const audio_config_base_t sessionConfig = client->config();
- const record_client_info_t recordClientInfo{client->uid(), client->session(),
+ const record_client_info_t recordClientInfo{client->riid(), client->uid(), client->session(),
client->source(), client->portId(),
client->isSilenced()};
const audio_config_base_t config = getConfig();
@@ -429,7 +436,7 @@
checkSuspendEffects();
for (const auto& client : updatedClients) {
- updateClientRecordingConfiguration(RECORD_CONFIG_EVENT_START, client);
+ updateClientRecordingConfiguration(RECORD_CONFIG_EVENT_UPDATE, client);
}
}
@@ -462,7 +469,7 @@
checkSuspendEffects();
for (const auto& client : updatedClients) {
- updateClientRecordingConfiguration(RECORD_CONFIG_EVENT_START, client);
+ updateClientRecordingConfiguration(RECORD_CONFIG_EVENT_UPDATE, client);
}
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 7011ef7..c0ca440 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1884,6 +1884,7 @@
status_t AudioPolicyManager::getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
uid_t uid,
const audio_config_base_t *config,
@@ -2027,7 +2028,7 @@
mSoundTriggerSessions.indexOfKey(session) > 0;
*portId = AudioPort::getNextUniqueId();
- clientDesc = new RecordClientDescriptor(*portId, uid, session, attributes, *config,
+ clientDesc = new RecordClientDescriptor(*portId, riid, uid, session, attributes, *config,
requestedDeviceId, attributes.source, flags,
isSoundTrigger);
inputDesc = mInputs.valueFor(*input);
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 8ca06e7..612bd8f 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -128,6 +128,7 @@
virtual void releaseOutput(audio_port_handle_t portId);
virtual status_t getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
uid_t uid,
const audio_config_base_t *config,
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 2e47eb6..06e68a9 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -334,6 +334,7 @@
status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
pid_t pid,
uid_t uid,
@@ -403,7 +404,7 @@
{
AutoCallerClear acc;
// the audio_in_acoustics_t parameter is ignored by get_input()
- status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
+ status = mAudioPolicyManager->getInputForAttr(attr, input, riid, session, uid,
config,
flags, selectedDeviceId,
&inputType, portId);
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 2926acb..58256f7 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -91,6 +91,7 @@
virtual void releaseOutput(audio_port_handle_t portId);
virtual status_t getInputForAttr(const audio_attributes_t *attr,
audio_io_handle_t *input,
+ audio_unique_id_t riid,
audio_session_t session,
pid_t pid,
uid_t uid,