Merge "codec2: declare 10-bit support for all AV1 codecs" into tm-dev
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index dc9f848..5ecb130 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -2041,6 +2041,9 @@
sp<MediaCodecBuffer> outBuffer;
std::shared_ptr<C2Buffer> c2Buffer;
+ constexpr int kMaxReallocTry = 5;
+ int reallocTryNum = 0;
+
while (true) {
Mutexed<Output>::Locked output(mOutput);
if (!output->buffers) {
@@ -2048,6 +2051,9 @@
}
action = output->buffers->popFromStashAndRegister(
&c2Buffer, &index, &outBuffer);
+ if (action != OutputBuffers::REALLOCATE) {
+ reallocTryNum = 0;
+ }
switch (action) {
case OutputBuffers::SKIP:
return;
@@ -2058,6 +2064,13 @@
mCallback->onOutputBufferAvailable(index, outBuffer);
break;
case OutputBuffers::REALLOCATE:
+ if (++reallocTryNum > kMaxReallocTry) {
+ output.unlock();
+ ALOGE("[%s] sendOutputBuffers: tried %d realloc and failed",
+ mName, kMaxReallocTry);
+ mCCodecCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ return;
+ }
if (!output->buffers->isArrayMode()) {
output->buffers =
output->buffers->toArrayMode(output->numSlots);
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index 4662247..f968a4b 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -867,6 +867,11 @@
{ .duration = 0 , .waveFreq = { 0 }, 0, 0}},
.repeatCnt = ToneGenerator::TONEGEN_INF,
.repeatSegment = 0 }, // TONE_TW_RINGTONE
+ { .segments = { { .duration = 200, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = 3,
+ .repeatSegment = 0 }, // TONE_NZ_CALL_WAITING
};
// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type
@@ -961,6 +966,16 @@
TONE_SUP_ERROR, // TONE_SUP_ERROR
TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING
TONE_TW_RINGTONE // TONE_SUP_RINGTONE
+ },
+ { // NEW ZEALAND
+ TONE_JAPAN_DIAL, // TONE_SUP_DIAL
+ TONE_JAPAN_BUSY, // TONE_SUP_BUSY
+ TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION
+ TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK
+ TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL
+ TONE_SUP_ERROR, // TONE_SUP_ERROR
+ TONE_NZ_CALL_WAITING, // TONE_SUP_CALL_WAITING
+ TONE_GB_RINGTONE // TONE_SUP_RINGTONE
}
};
@@ -1038,6 +1053,8 @@
mRegion = INDIA;
} else if (strstr(value, "tw") != NULL) {
mRegion = TAIWAN;
+ } else if (strstr(value, "nz") != NULL) {
+ mRegion = NZ;
} else {
mRegion = CEPT;
}
diff --git a/media/libaudioclient/include/media/ToneGenerator.h b/media/libaudioclient/include/media/ToneGenerator.h
index d00dfd2..46e9501 100644
--- a/media/libaudioclient/include/media/ToneGenerator.h
+++ b/media/libaudioclient/include/media/ToneGenerator.h
@@ -225,7 +225,11 @@
TONE_INDIA_CONGESTION, // Congestion tone: 400 Hz, 250ms ON, 250ms OFF...
TONE_INDIA_CALL_WAITING, // Call waiting tone: 400 Hz, tone repeated in a 0.2s on, 0.1s off, 0.2s on, 7.5s off pattern.
TONE_INDIA_RINGTONE, // Ring tone: 400 Hz tone modulated with 25Hz, 0.4 on 0.2 off 0.4 on 2..0 off
+ // TAIWAN supervisory tones
TONE_TW_RINGTONE, // Ring Tone: 440 Hz + 480 Hz repeated with pattern 1s on, 3s off.
+ // NEW ZEALAND supervisory tones
+ TONE_NZ_CALL_WAITING, // Call waiting tone: 400 Hz, 0.2s ON, 3s OFF,
+ // 0.2s ON, 3s OFF, 0.2s ON, 3s OFF, 0.2s ON
NUM_ALTERNATE_TONES
};
@@ -239,6 +243,7 @@
IRELAND,
INDIA,
TAIWAN,
+ NZ,
CEPT,
NUM_REGIONS
};
diff --git a/media/libmediaplayerservice/nuplayer/AWakeLock.cpp b/media/libmediaplayerservice/nuplayer/AWakeLock.cpp
index c3bd207..25a8ae4 100644
--- a/media/libmediaplayerservice/nuplayer/AWakeLock.cpp
+++ b/media/libmediaplayerservice/nuplayer/AWakeLock.cpp
@@ -59,11 +59,10 @@
if (mPowerManager != NULL) {
sp<IBinder> binder = new BBinder();
int64_t token = IPCThreadState::self()->clearCallingIdentity();
- binder::Status status = mPowerManager->acquireWakeLock(
+ binder::Status status = mPowerManager->acquireWakeLockAsync(
binder, POWERMANAGER_PARTIAL_WAKE_LOCK,
String16("AWakeLock"), String16("media"),
- {} /* workSource */, {} /* historyTag */, -1 /* displayId */,
- nullptr /* callback */);
+ {} /* workSource */, {} /* historyTag */);
IPCThreadState::self()->restoreCallingIdentity(token);
if (status.isOk()) {
mWakeLockToken = binder;
diff --git a/media/libstagefright/timedtext/TextDescriptions.cpp b/media/libstagefright/timedtext/TextDescriptions.cpp
index 2c2d11d..3fec9ed 100644
--- a/media/libstagefright/timedtext/TextDescriptions.cpp
+++ b/media/libstagefright/timedtext/TextDescriptions.cpp
@@ -466,6 +466,10 @@
if (subChunkType == FOURCC('f', 't', 'a', 'b'))
{
+ if(subChunkSize < 8) {
+ return OK;
+ }
+
tmpData += 8;
size_t subChunkRemaining = subChunkSize - 8;
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index dec439f..7c2f34f 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -2291,6 +2291,9 @@
mOperatingMode = operatingMode;
}
+ // Reset min expected duration when session is reconfigured.
+ mMinExpectedDuration = 0;
+
// In case called from configureStreams, abort queued input buffers not belonging to
// any pending requests.
if (mInputStream != NULL && notifyRequestThread) {
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
index da1cf09..1e20ee0 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
@@ -18,6 +18,7 @@
#define ATRACE_TAG ATRACE_TAG_CAMERA
//#define LOG_NDEBUG 0
+#include <algorithm>
#include <ctime>
#include <fstream>
@@ -1392,14 +1393,30 @@
const VsyncEventData& vsyncEventData = parcelableVsyncEventData.vsync;
nsecs_t currentTime = systemTime();
- // Reset capture to present time offset if more than 1 second
- // between frames.
- if (t - mLastCaptureTime > kSpacingResetIntervalNs) {
+ // Reset capture to present time offset if:
+ // - More than 1 second between frames.
+ // - The frame duration deviates from multiples of vsync frame intervals.
+ nsecs_t captureInterval = t - mLastCaptureTime;
+ float captureToVsyncIntervalRatio = 1.0f * captureInterval / vsyncEventData.frameInterval;
+ float ratioDeviation = std::fabs(
+ captureToVsyncIntervalRatio - std::roundf(captureToVsyncIntervalRatio));
+ if (captureInterval > kSpacingResetIntervalNs ||
+ ratioDeviation >= kMaxIntervalRatioDeviation) {
+ nsecs_t minPresentT = mLastPresentTime + vsyncEventData.frameInterval / 2;
for (size_t i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
- if (vsyncEventData.frameTimelines[i].deadlineTimestamp >= currentTime) {
- mCaptureToPresentOffset =
- vsyncEventData.frameTimelines[i].expectedPresentationTime - t;
- break;
+ const auto& timeline = vsyncEventData.frameTimelines[i];
+ if (timeline.deadlineTimestamp >= currentTime &&
+ timeline.expectedPresentationTime > minPresentT) {
+ nsecs_t presentT = vsyncEventData.frameTimelines[i].expectedPresentationTime;
+ mCaptureToPresentOffset = presentT - t;
+ mLastCaptureTime = t;
+ mLastPresentTime = presentT;
+
+ // Move the expected presentation time back by 1/3 of frame interval to
+ // mitigate the time drift. Due to time drift, if we directly use the
+ // expected presentation time, often times 2 expected presentation time
+ // falls into the same VSYNC interval.
+ return presentT - vsyncEventData.frameInterval/3;
}
}
}
@@ -1415,16 +1432,27 @@
int minVsyncs = (mMinExpectedDuration - vsyncEventData.frameInterval / 2) /
vsyncEventData.frameInterval;
if (minVsyncs < 0) minVsyncs = 0;
- nsecs_t minInterval = minVsyncs * vsyncEventData.frameInterval + kTimelineThresholdNs;
- // Find best timestamp in the vsync timeline:
+ nsecs_t minInterval = minVsyncs * vsyncEventData.frameInterval;
+ // Find best timestamp in the vsync timelines:
+ // - Only use at most 3 timelines to avoid long latency
// - closest to the ideal present time,
// - deadline timestamp is greater than the current time, and
// - the candidate present time is at least minInterval in the future
// compared to last present time.
- for (const auto& vsyncTime : vsyncEventData.frameTimelines) {
+ int maxTimelines = std::min(kMaxTimelines, (int)VsyncEventData::kFrameTimelinesLength);
+ float biasForShortDelay = 1.0f;
+ for (int i = 0; i < maxTimelines; i ++) {
+ const auto& vsyncTime = vsyncEventData.frameTimelines[i];
+ if (minVsyncs > 0) {
+ // Bias towards using smaller timeline index:
+ // i = 0: bias = 1
+ // i = maxTimelines-1: bias = -1
+ biasForShortDelay = 1.0 - 2.0 * i / (maxTimelines - 1);
+ }
if (std::abs(vsyncTime.expectedPresentationTime - idealPresentT) < minDiff &&
vsyncTime.deadlineTimestamp >= currentTime &&
- vsyncTime.expectedPresentationTime > mLastPresentTime + minInterval) {
+ vsyncTime.expectedPresentationTime >
+ mLastPresentTime + minInterval + biasForShortDelay * kTimelineThresholdNs) {
expectedPresentT = vsyncTime.expectedPresentationTime;
minDiff = std::abs(vsyncTime.expectedPresentationTime - idealPresentT);
}
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h
index 5f2831f..e8065ce 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.h
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h
@@ -421,8 +421,10 @@
nsecs_t mLastPresentTime = 0;
nsecs_t mCaptureToPresentOffset = 0;
static constexpr size_t kDisplaySyncExtraBuffer = 2;
- static constexpr nsecs_t kSpacingResetIntervalNs = 1000000000LL; // 1 second
+ static constexpr nsecs_t kSpacingResetIntervalNs = 50000000LL; // 50 millisecond
static constexpr nsecs_t kTimelineThresholdNs = 1000000LL; // 1 millisecond
+ static constexpr float kMaxIntervalRatioDeviation = 0.05f;
+ static constexpr int kMaxTimelines = 3;
nsecs_t syncTimestampToDisplayLocked(nsecs_t t);
// Re-space frames by delaying queueBuffer so that frame delivery has