Skip to content

Commit f65934a

Browse files
James DongAndroid (Google) Code Review
authored andcommitted
Merge "Limit the amount of audio record data in each buffer"
2 parents c10e489 + 745fcc0 commit f65934a

File tree

2 files changed

+39
-19
lines changed

2 files changed

+39
-19
lines changed

include/media/stagefright/AudioSource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ struct AudioSource : public MediaSource, public MediaBufferObserver {
9595
int32_t startFrame, int32_t rampDurationFrames,
9696
uint8_t *data, size_t bytes);
9797

98+
void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs);
9899
void releaseQueuedFrames_l();
99100
void waitOutstandingEncodingFrames_l();
100101
status_t reset();

media/libstagefright/AudioSource.cpp

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,6 @@ status_t AudioSource::dataCallbackTimestamp(
282282
mPrevSampleTimeUs = mStartTimeUs;
283283
}
284284

285-
int64_t timestampUs = mPrevSampleTimeUs;
286-
287285
size_t numLostBytes = 0;
288286
if (mNumFramesReceived > 0) { // Ignore earlier frame lost
289287
// getInputFramesLost() returns the number of lost frames.
@@ -293,37 +291,58 @@ status_t AudioSource::dataCallbackTimestamp(
293291

294292
CHECK_EQ(numLostBytes & 1, 0u);
295293
CHECK_EQ(audioBuffer.size & 1, 0u);
296-
size_t bufferSize = numLostBytes + audioBuffer.size;
297-
MediaBuffer *buffer = new MediaBuffer(bufferSize);
298294
if (numLostBytes > 0) {
299-
memset(buffer->data(), 0, numLostBytes);
300-
memcpy((uint8_t *) buffer->data() + numLostBytes,
301-
audioBuffer.i16, audioBuffer.size);
302-
} else {
303-
if (audioBuffer.size == 0) {
304-
ALOGW("Nothing is available from AudioRecord callback buffer");
305-
buffer->release();
306-
return OK;
295+
// Loss of audio frames should happen rarely; thus the LOGW should
296+
// not cause a logging spam
297+
ALOGW("Lost audio record data: %d bytes", numLostBytes);
298+
}
299+
300+
while (numLostBytes > 0) {
301+
size_t bufferSize = numLostBytes;
302+
if (numLostBytes > kMaxBufferSize) {
303+
numLostBytes -= kMaxBufferSize;
304+
bufferSize = kMaxBufferSize;
305+
} else {
306+
numLostBytes = 0;
307307
}
308-
memcpy((uint8_t *) buffer->data(),
309-
audioBuffer.i16, audioBuffer.size);
308+
MediaBuffer *lostAudioBuffer = new MediaBuffer(bufferSize);
309+
memset(lostAudioBuffer->data(), 0, bufferSize);
310+
lostAudioBuffer->set_range(0, bufferSize);
311+
queueInputBuffer_l(lostAudioBuffer, timeUs);
312+
}
313+
314+
if (audioBuffer.size == 0) {
315+
ALOGW("Nothing is available from AudioRecord callback buffer");
316+
return OK;
310317
}
311318

319+
const size_t bufferSize = audioBuffer.size;
320+
MediaBuffer *buffer = new MediaBuffer(bufferSize);
321+
memcpy((uint8_t *) buffer->data(),
322+
audioBuffer.i16, audioBuffer.size);
312323
buffer->set_range(0, bufferSize);
313-
timestampUs += ((1000000LL * (bufferSize >> 1)) +
314-
(mSampleRate >> 1)) / mSampleRate;
324+
queueInputBuffer_l(buffer, timeUs);
325+
return OK;
326+
}
327+
328+
void AudioSource::queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs) {
329+
const size_t bufferSize = buffer->range_length();
330+
const size_t frameSize = mRecord->frameSize();
331+
const int64_t timestampUs =
332+
mPrevSampleTimeUs +
333+
((1000000LL * (bufferSize / frameSize)) +
334+
(mSampleRate >> 1)) / mSampleRate;
315335

316336
if (mNumFramesReceived == 0) {
317337
buffer->meta_data()->setInt64(kKeyAnchorTime, mStartTimeUs);
318338
}
339+
319340
buffer->meta_data()->setInt64(kKeyTime, mPrevSampleTimeUs);
320341
buffer->meta_data()->setInt64(kKeyDriftTime, timeUs - mInitialReadTimeUs);
321342
mPrevSampleTimeUs = timestampUs;
322-
mNumFramesReceived += buffer->range_length() / sizeof(int16_t);
343+
mNumFramesReceived += bufferSize / frameSize;
323344
mBuffersReceived.push_back(buffer);
324345
mFrameAvailableCondition.signal();
325-
326-
return OK;
327346
}
328347

329348
void AudioSource::trackMaxAmplitude(int16_t *data, int nSamples) {

0 commit comments

Comments
 (0)