am 5a905ceb: Merge "Track maximum amplitude and fix getMaxAmplitude()" into gingerbread

Merge commit '5a905ceb063bd31170d3d869efcd051cbd8e4e13' into gingerbread-plus-aosp

* commit '5a905ceb063bd31170d3d869efcd051cbd8e4e13':
  Track maximum amplitude and fix getMaxAmplitude()
This commit is contained in:
James Dong
2010-06-25 09:47:51 -07:00
committed by Android Git Automerger
4 changed files with 45 additions and 1 deletions

View File

@@ -39,6 +39,9 @@ struct AudioSource : public MediaSource {
virtual status_t stop(); virtual status_t stop();
virtual sp<MetaData> getFormat(); virtual sp<MetaData> getFormat();
// Returns the maximum amplitude since last call.
int16_t getMaxAmplitude();
virtual status_t read( virtual status_t read(
MediaBuffer **buffer, const ReadOptions *options = NULL); MediaBuffer **buffer, const ReadOptions *options = NULL);
@@ -53,13 +56,17 @@ private:
bool mStarted; bool mStarted;
bool mCollectStats; bool mCollectStats;
bool mTrackMaxAmplitude;
int64_t mTotalReadTimeUs; int64_t mTotalReadTimeUs;
int64_t mTotalReadBytes; int64_t mTotalReadBytes;
int64_t mTotalReads; int64_t mTotalReads;
int64_t mStartTimeUs; int64_t mStartTimeUs;
int16_t mMaxAmplitude;
MediaBufferGroup *mGroup; MediaBufferGroup *mGroup;
void trackMaxAmplitude(int16_t *data, int nSamples);
AudioSource(const AudioSource &); AudioSource(const AudioSource &);
AudioSource &operator=(const AudioSource &); AudioSource &operator=(const AudioSource &);
}; };

View File

@@ -484,6 +484,7 @@ sp<MediaSource> StagefrightRecorder::createAudioSource() {
sp<MediaSource> audioEncoder = sp<MediaSource> audioEncoder =
OMXCodec::Create(client.interface(), encMeta, OMXCodec::Create(client.interface(), encMeta,
true /* createEncoder */, audioSource); true /* createEncoder */, audioSource);
mAudioSourceNode = audioSource;
return audioEncoder; return audioEncoder;
} }
@@ -822,6 +823,7 @@ status_t StagefrightRecorder::reset() {
mAudioBitRate = 12200; mAudioBitRate = 12200;
mInterleaveDurationUs = 0; mInterleaveDurationUs = 0;
mIFramesInterval = 1; mIFramesInterval = 1;
mAudioSourceNode = 0;
mEncoderProfiles = MediaProfiles::getInstance(); mEncoderProfiles = MediaProfiles::getInstance();
mOutputFd = -1; mOutputFd = -1;
@@ -831,7 +833,11 @@ status_t StagefrightRecorder::reset() {
} }
status_t StagefrightRecorder::getMaxAmplitude(int *max) { status_t StagefrightRecorder::getMaxAmplitude(int *max) {
*max = 0; if (mAudioSourceNode != 0) {
*max = mAudioSourceNode->getMaxAmplitude();
} else {
*max = 0;
}
return OK; return OK;
} }

View File

@@ -26,6 +26,7 @@ namespace android {
class Camera; class Camera;
struct MediaSource; struct MediaSource;
struct MediaWriter; struct MediaWriter;
struct AudioSource;
class MediaProfiles; class MediaProfiles;
struct StagefrightRecorder : public MediaRecorderBase { struct StagefrightRecorder : public MediaRecorderBase {
@@ -64,6 +65,7 @@ private:
sp<ISurface> mPreviewSurface; sp<ISurface> mPreviewSurface;
sp<IMediaPlayerClient> mListener; sp<IMediaPlayerClient> mListener;
sp<MediaWriter> mWriter; sp<MediaWriter> mWriter;
sp<AudioSource> mAudioSourceNode;
audio_source mAudioSource; audio_source mAudioSource;
video_source mVideoSource; video_source mVideoSource;

View File

@@ -78,6 +78,8 @@ status_t AudioSource::start(MetaData *params) {
mCollectStats = true; mCollectStats = true;
} }
mTrackMaxAmplitude = false;
mMaxAmplitude = 0;
mStartTimeUs = 0; mStartTimeUs = 0;
int64_t startTimeUs; int64_t startTimeUs;
if (params && params->findInt64(kKeyTime, &startTimeUs)) { if (params && params->findInt64(kKeyTime, &startTimeUs)) {
@@ -168,6 +170,10 @@ status_t AudioSource::read(
return (status_t)n; return (status_t)n;
} }
if (mTrackMaxAmplitude) {
trackMaxAmplitude((int16_t *) buffer->data(), n >> 1);
}
uint32_t sampleRate = mRecord->getSampleRate(); uint32_t sampleRate = mRecord->getSampleRate();
int64_t timestampUs = (1000000LL * numFramesRecorded) / sampleRate + mStartTimeUs; int64_t timestampUs = (1000000LL * numFramesRecorded) / sampleRate + mStartTimeUs;
buffer->meta_data()->setInt64(kKeyTime, timestampUs); buffer->meta_data()->setInt64(kKeyTime, timestampUs);
@@ -181,4 +187,27 @@ status_t AudioSource::read(
return OK; return OK;
} }
void AudioSource::trackMaxAmplitude(int16_t *data, int nSamples) {
for (int i = nSamples; i > 0; --i) {
int16_t value = *data++;
if (value < 0) {
value = -value;
}
if (mMaxAmplitude < value) {
mMaxAmplitude = value;
}
}
}
int16_t AudioSource::getMaxAmplitude() {
// First call activates the tracking.
if (!mTrackMaxAmplitude) {
mTrackMaxAmplitude = true;
}
int16_t value = mMaxAmplitude;
mMaxAmplitude = 0;
LOGV("max amplitude since last call: %d", value);
return value;
}
} // namespace android } // namespace android