Revert "aacenc: fix timestamp off by one frame"
This reverts commit 10ceef9f3b96e5c7bc783432fe569333a2405cf0.
Reason for revert: This isn't wanted in qt-dev. It is in qt-r1-dev and will be delivered in the December Mainline train.
Bug: 137245963
Change-Id: I0a5a4991786d6dcbd324663a6d342729166a5528
Merged-In: I567890f3d04544c12adfe29a6a23c06f1db699e7
diff --git a/media/codec2/components/aac/C2SoftAacEnc.cpp b/media/codec2/components/aac/C2SoftAacEnc.cpp
index 1dc676b..8e3852c 100644
--- a/media/codec2/components/aac/C2SoftAacEnc.cpp
+++ b/media/codec2/components/aac/C2SoftAacEnc.cpp
@@ -157,7 +157,7 @@
mSentCodecSpecificData(false),
mInputTimeSet(false),
mInputSize(0),
- mNextFrameTimestampUs(0),
+ mInputTimeUs(0),
mSignalledError(false),
mOutIndex(0u) {
}
@@ -183,7 +183,7 @@
mSentCodecSpecificData = false;
mInputTimeSet = false;
mInputSize = 0u;
- mNextFrameTimestampUs = 0;
+ mInputTimeUs = 0;
mSignalledError = false;
return C2_OK;
}
@@ -201,7 +201,7 @@
mSentCodecSpecificData = false;
mInputTimeSet = false;
mInputSize = 0u;
- mNextFrameTimestampUs = 0;
+ mInputTimeUs = 0;
return C2_OK;
}
@@ -365,18 +365,17 @@
capacity = view.capacity();
}
if (!mInputTimeSet && capacity > 0) {
- mNextFrameTimestampUs = work->input.ordinal.timestamp;
+ mInputTimeUs = work->input.ordinal.timestamp;
mInputTimeSet = true;
}
size_t numFrames = (capacity + mInputSize + (eos ? mNumBytesPerInputFrame - 1 : 0))
/ mNumBytesPerInputFrame;
- ALOGV("capacity = %zu; mInputSize = %zu; numFrames = %zu "
- "mNumBytesPerInputFrame = %u inputTS = %lld",
- capacity, mInputSize, numFrames,
- mNumBytesPerInputFrame, work->input.ordinal.timestamp.peekll());
+ ALOGV("capacity = %zu; mInputSize = %zu; numFrames = %zu mNumBytesPerInputFrame = %u",
+ capacity, mInputSize, numFrames, mNumBytesPerInputFrame);
std::shared_ptr<C2LinearBlock> block;
+ std::shared_ptr<C2Buffer> buffer;
std::unique_ptr<C2WriteView> wView;
uint8_t *outPtr = temp;
size_t outAvailable = 0u;
@@ -443,11 +442,7 @@
const std::shared_ptr<C2Buffer> mBuffer;
};
- struct OutputBuffer {
- std::shared_ptr<C2Buffer> buffer;
- c2_cntr64_t timestampUs;
- };
- std::list<OutputBuffer> outputBuffers;
+ C2WorkOrdinalStruct outOrdinal = work->input.ordinal;
while (encoderErr == AACENC_OK && inargs.numInSamples > 0) {
if (numFrames && !block) {
@@ -478,22 +473,29 @@
&outargs);
if (encoderErr == AACENC_OK) {
+ if (buffer) {
+ outOrdinal.frameIndex = mOutIndex++;
+ outOrdinal.timestamp = mInputTimeUs;
+ cloneAndSend(
+ inputIndex,
+ work,
+ FillWork(C2FrameData::FLAG_INCOMPLETE, outOrdinal, buffer));
+ buffer.reset();
+ }
+
if (outargs.numOutBytes > 0) {
mInputSize = 0;
int consumed = (capacity / sizeof(int16_t)) - inargs.numInSamples
+ outargs.numInSamples;
- c2_cntr64_t currentFrameTimestampUs = mNextFrameTimestampUs;
- mNextFrameTimestampUs = work->input.ordinal.timestamp
+ mInputTimeUs = work->input.ordinal.timestamp
+ (consumed * 1000000ll / channelCount / sampleRate);
- std::shared_ptr<C2Buffer> buffer = createLinearBuffer(block, 0, outargs.numOutBytes);
+ buffer = createLinearBuffer(block, 0, outargs.numOutBytes);
#if defined(LOG_NDEBUG) && !LOG_NDEBUG
hexdump(outPtr, std::min(outargs.numOutBytes, 256));
#endif
outPtr = temp;
outAvailable = 0;
block.reset();
-
- outputBuffers.push_back({buffer, currentFrameTimestampUs});
} else {
mInputSize += outargs.numInSamples * sizeof(int16_t);
}
@@ -504,9 +506,8 @@
inargs.numInSamples -= outargs.numInSamples;
}
}
- ALOGV("encoderErr = %d mInputSize = %zu "
- "inargs.numInSamples = %d, mNextFrameTimestampUs = %lld",
- encoderErr, mInputSize, inargs.numInSamples, mNextFrameTimestampUs.peekll());
+ ALOGV("encoderErr = %d mInputSize = %zu inargs.numInSamples = %d, mInputTimeUs = %lld",
+ encoderErr, mInputSize, inargs.numInSamples, mInputTimeUs.peekll());
}
if (eos && inBufferSize[0] > 0) {
@@ -541,27 +542,10 @@
&outargs);
}
- while (outputBuffers.size() > 1) {
- const OutputBuffer& front = outputBuffers.front();
- C2WorkOrdinalStruct ordinal = work->input.ordinal;
- ordinal.frameIndex = mOutIndex++;
- ordinal.timestamp = front.timestampUs;
- cloneAndSend(
- inputIndex,
- work,
- FillWork(C2FrameData::FLAG_INCOMPLETE, ordinal, front.buffer));
- outputBuffers.pop_front();
- }
- std::shared_ptr<C2Buffer> buffer;
- C2WorkOrdinalStruct ordinal = work->input.ordinal;
- ordinal.frameIndex = mOutIndex++;
- if (!outputBuffers.empty()) {
- ordinal.timestamp = outputBuffers.front().timestampUs;
- buffer = outputBuffers.front().buffer;
- }
- // Mark the end of frame
+ outOrdinal.frameIndex = mOutIndex++;
+ outOrdinal.timestamp = mInputTimeUs;
FillWork((C2FrameData::flags_t)(eos ? C2FrameData::FLAG_END_OF_STREAM : 0),
- ordinal, buffer)(work);
+ outOrdinal, buffer)(work);
}
c2_status_t C2SoftAacEnc::drain(
@@ -585,7 +569,7 @@
mSentCodecSpecificData = false;
mInputTimeSet = false;
mInputSize = 0u;
- mNextFrameTimestampUs = 0;
+ mInputTimeUs = 0;
// TODO: we don't have any pending work at this time to drain.
return C2_OK;
diff --git a/media/codec2/components/aac/C2SoftAacEnc.h b/media/codec2/components/aac/C2SoftAacEnc.h
index 2655039..a38be19 100644
--- a/media/codec2/components/aac/C2SoftAacEnc.h
+++ b/media/codec2/components/aac/C2SoftAacEnc.h
@@ -56,7 +56,7 @@
bool mSentCodecSpecificData;
bool mInputTimeSet;
size_t mInputSize;
- c2_cntr64_t mNextFrameTimestampUs;
+ c2_cntr64_t mInputTimeUs;
bool mSignalledError;
std::atomic_uint64_t mOutIndex;