summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/openmax/OMX_IVCommon.h2
-rw-r--r--media/libmediaplayerservice/StagefrightPlayer.cpp6
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp6
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp45
-rw-r--r--media/libstagefright/AACExtractor.cpp33
-rw-r--r--media/libstagefright/ACodec.cpp26
-rw-r--r--media/libstagefright/AwesomePlayer.cpp27
-rwxr-xr-xmedia/libstagefright/MPEG4Writer.cpp4
-rw-r--r--media/libstagefright/SurfaceMediaSource.cpp8
-rw-r--r--media/libstagefright/include/AwesomePlayer.h6
-rw-r--r--services/audioflinger/AudioFlinger.cpp14
-rw-r--r--services/audioflinger/AudioFlinger.h4
12 files changed, 120 insertions, 61 deletions
diff --git a/include/media/stagefright/openmax/OMX_IVCommon.h b/include/media/stagefright/openmax/OMX_IVCommon.h
index 65b6339..8bb4ded 100644
--- a/include/media/stagefright/openmax/OMX_IVCommon.h
+++ b/include/media/stagefright/openmax/OMX_IVCommon.h
@@ -156,7 +156,7 @@ typedef enum OMX_COLOR_FORMATTYPE {
* Android-specific OMX IL colorformats. Change this enum to
* an acceptable range once that is done.
* */
- OMX_COLOR_FormatAndroidOpaque = 0x7F000001,
+ OMX_COLOR_FormatAndroidOpaque = 0x7F000789,
OMX_TI_COLOR_FormatYUV420PackedSemiPlanar = 0x7F000100,
OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00,
OMX_COLOR_FormatMax = 0x7FFFFFFF
diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp
index 40e055c..cd4b1ef 100644
--- a/media/libmediaplayerservice/StagefrightPlayer.cpp
+++ b/media/libmediaplayerservice/StagefrightPlayer.cpp
@@ -72,16 +72,14 @@ status_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) {
status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) {
LOGV("setVideoSurface");
- mPlayer->setSurface(surface);
- return OK;
+ return mPlayer->setSurface(surface);
}
status_t StagefrightPlayer::setVideoSurfaceTexture(
const sp<ISurfaceTexture> &surfaceTexture) {
LOGV("setVideoSurfaceTexture");
- mPlayer->setSurfaceTexture(surfaceTexture);
- return OK;
+ return mPlayer->setSurfaceTexture(surfaceTexture);
}
status_t StagefrightPlayer::prepare() {
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 7fb141a..1f08a91 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -316,9 +316,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
&cropLeft, &cropTop, &cropRight, &cropBottom));
LOGV("Video output format changed to %d x %d "
- "(crop: %d, %d, %d, %d)",
+ "(crop: %d x %d @ (%d, %d))",
width, height,
- cropLeft, cropTop, cropRight, cropBottom);
+ (cropRight - cropLeft + 1),
+ (cropBottom - cropTop + 1),
+ cropLeft, cropTop);
notifyListener(
MEDIA_SET_VIDEO_SIZE,
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 35ed43f..8f213da 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -395,29 +395,40 @@ void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {
postDrainVideoQueue();
}
- if (mSyncQueues && !mAudioQueue.empty() && !mVideoQueue.empty()) {
- int64_t firstAudioTimeUs;
- int64_t firstVideoTimeUs;
- CHECK((*mAudioQueue.begin()).mBuffer->meta()
- ->findInt64("timeUs", &firstAudioTimeUs));
- CHECK((*mVideoQueue.begin()).mBuffer->meta()
- ->findInt64("timeUs", &firstVideoTimeUs));
+ if (!mSyncQueues || mAudioQueue.empty() || mVideoQueue.empty()) {
+ return;
+ }
- int64_t diff = firstVideoTimeUs - firstAudioTimeUs;
+ sp<ABuffer> firstAudioBuffer = (*mAudioQueue.begin()).mBuffer;
+ sp<ABuffer> firstVideoBuffer = (*mVideoQueue.begin()).mBuffer;
- LOGV("queueDiff = %.2f secs", diff / 1E6);
+ if (firstAudioBuffer == NULL || firstVideoBuffer == NULL) {
+ // EOS signalled on either queue.
+ syncQueuesDone();
+ return;
+ }
- if (diff > 100000ll) {
- // Audio data starts More than 0.1 secs before video.
- // Drop some audio.
+ int64_t firstAudioTimeUs;
+ int64_t firstVideoTimeUs;
+ CHECK(firstAudioBuffer->meta()
+ ->findInt64("timeUs", &firstAudioTimeUs));
+ CHECK(firstVideoBuffer->meta()
+ ->findInt64("timeUs", &firstVideoTimeUs));
- (*mAudioQueue.begin()).mNotifyConsumed->post();
- mAudioQueue.erase(mAudioQueue.begin());
- return;
- }
+ int64_t diff = firstVideoTimeUs - firstAudioTimeUs;
- syncQueuesDone();
+ LOGV("queueDiff = %.2f secs", diff / 1E6);
+
+ if (diff > 100000ll) {
+ // Audio data starts More than 0.1 secs before video.
+ // Drop some audio.
+
+ (*mAudioQueue.begin()).mNotifyConsumed->post();
+ mAudioQueue.erase(mAudioQueue.begin());
+ return;
}
+
+ syncQueuesDone();
}
void NuPlayer::Renderer::syncQueuesDone() {
diff --git a/media/libstagefright/AACExtractor.cpp b/media/libstagefright/AACExtractor.cpp
index a5a6b64..52b1200 100644
--- a/media/libstagefright/AACExtractor.cpp
+++ b/media/libstagefright/AACExtractor.cpp
@@ -33,8 +33,6 @@
namespace android {
-#define ADTS_HEADER_LENGTH 7
-
class AACSource : public MediaSource {
public:
AACSource(const sp<DataSource> &source,
@@ -88,7 +86,16 @@ uint32_t get_sample_rate(const uint8_t sf_index)
return 0;
}
-static size_t getFrameSize(const sp<DataSource> &source, off64_t offset) {
+// Returns the frame length in bytes as described in an ADTS header starting at the given offset,
+// or 0 if the size can't be read due to an error in the header or a read failure.
+// The returned value is the AAC frame size with the ADTS header length (regardless of
+// the presence of the CRC).
+// If headerSize is non-NULL, it will be used to return the size of the header of this ADTS frame.
+static size_t getAdtsFrameLength(const sp<DataSource> &source, off64_t offset, size_t* headerSize) {
+
+ const size_t kAdtsHeaderLengthNoCrc = 7;
+ const size_t kAdtsHeaderLengthWithCrc = 9;
+
size_t frameSize = 0;
uint8_t syncword[2];
@@ -111,7 +118,15 @@ static size_t getFrameSize(const sp<DataSource> &source, off64_t offset) {
}
frameSize = (header[0] & 0x3) << 11 | header[1] << 3 | header[2] >> 5;
- frameSize += ADTS_HEADER_LENGTH + protectionAbsent ? 0 : 2;
+
+ // protectionAbsent is 0 if there is CRC
+ size_t headSize = protectionAbsent ? kAdtsHeaderLengthNoCrc : kAdtsHeaderLengthWithCrc;
+ if (headSize > frameSize) {
+ return 0;
+ }
+ if (headerSize != NULL) {
+ *headerSize = headSize;
+ }
return frameSize;
}
@@ -148,7 +163,7 @@ AACExtractor::AACExtractor(const sp<DataSource> &source)
if (mDataSource->getSize(&streamSize) == OK) {
while (offset < streamSize) {
- if ((frameSize = getFrameSize(source, offset)) == 0) {
+ if ((frameSize = getAdtsFrameLength(source, offset, NULL)) == 0) {
return;
}
@@ -268,8 +283,8 @@ status_t AACSource::read(
}
}
- size_t frameSize, frameSizeWithoutHeader;
- if ((frameSize = getFrameSize(mDataSource, mOffset)) == 0) {
+ size_t frameSize, frameSizeWithoutHeader, headerSize;
+ if ((frameSize = getAdtsFrameLength(mDataSource, mOffset, &headerSize)) == 0) {
return ERROR_END_OF_STREAM;
}
@@ -279,8 +294,8 @@ status_t AACSource::read(
return err;
}
- frameSizeWithoutHeader = frameSize - ADTS_HEADER_LENGTH;
- if (mDataSource->readAt(mOffset + ADTS_HEADER_LENGTH, buffer->data(),
+ frameSizeWithoutHeader = frameSize - headerSize;
+ if (mDataSource->readAt(mOffset + headerSize, buffer->data(),
frameSizeWithoutHeader) != (ssize_t)frameSizeWithoutHeader) {
buffer->release();
buffer = NULL;
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 5d91f6a..e9dc61c 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -1738,7 +1738,17 @@ ACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec)
void ACodec::LoadedToIdleState::stateEntered() {
LOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());
- CHECK_EQ(allocateBuffers(), (status_t)OK);
+ status_t err;
+ if ((err = allocateBuffers()) != OK) {
+ LOGE("Failed to allocate buffers after transitioning to IDLE state "
+ "(error 0x%08x)",
+ err);
+
+ sp<AMessage> notify = mCodec->mNotify->dup();
+ notify->setInt32("what", ACodec::kWhatError);
+ notify->setInt32("omx-error", OMX_ErrorUndefined);
+ notify->post();
+ }
}
status_t ACodec::LoadedToIdleState::allocateBuffers() {
@@ -2046,8 +2056,18 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput),
(status_t)OK);
- CHECK_EQ(mCodec->allocateBuffersOnPort(kPortIndexOutput),
- (status_t)OK);
+ status_t err;
+ if ((err = mCodec->allocateBuffersOnPort(
+ kPortIndexOutput)) != OK) {
+ LOGE("Failed to allocate output port buffers after "
+ "port reconfiguration (error 0x%08x)",
+ err);
+
+ sp<AMessage> notify = mCodec->mNotify->dup();
+ notify->setInt32("what", ACodec::kWhatError);
+ notify->setInt32("omx-error", OMX_ErrorUndefined);
+ notify->post();
+ }
return true;
} else if (data1 == (OMX_U32)OMX_CommandPortEnable) {
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index bc42a42..142dda0 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -1152,22 +1152,26 @@ bool AwesomePlayer::isPlaying() const {
return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
}
-void AwesomePlayer::setSurface(const sp<Surface> &surface) {
+status_t AwesomePlayer::setSurface(const sp<Surface> &surface) {
Mutex::Autolock autoLock(mLock);
mSurface = surface;
- setNativeWindow_l(surface);
+ return setNativeWindow_l(surface);
}
-void AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
+status_t AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
Mutex::Autolock autoLock(mLock);
mSurface.clear();
+
+ status_t err;
if (surfaceTexture != NULL) {
- setNativeWindow_l(new SurfaceTextureClient(surfaceTexture));
+ err = setNativeWindow_l(new SurfaceTextureClient(surfaceTexture));
} else {
- setNativeWindow_l(NULL);
+ err = setNativeWindow_l(NULL);
}
+
+ return err;
}
void AwesomePlayer::shutdownVideoDecoder_l() {
@@ -1190,11 +1194,11 @@ void AwesomePlayer::shutdownVideoDecoder_l() {
LOGI("video decoder shutdown completed");
}
-void AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
+status_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
mNativeWindow = native;
if (mVideoSource == NULL) {
- return;
+ return OK;
}
LOGI("attempting to reconfigure to use new surface");
@@ -1206,7 +1210,12 @@ void AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
shutdownVideoDecoder_l();
- CHECK_EQ(initVideoDecoder(), (status_t)OK);
+ status_t err = initVideoDecoder();
+
+ if (err != OK) {
+ LOGE("failed to reinstantiate video decoder after surface change.");
+ return err;
+ }
if (mLastVideoTimeUs >= 0) {
mSeeking = SEEK;
@@ -1217,6 +1226,8 @@ void AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
if (wasPlaying) {
play_l();
}
+
+ return OK;
}
void AwesomePlayer::setAudioSink(
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 5f58090..46d87df 100755
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -1173,7 +1173,7 @@ void MPEG4Writer::Track::addOneSttsTableEntry(
size_t sampleCount, int32_t duration) {
if (duration == 0) {
- LOGW("%d 0-duration samples found: %d", sampleCount);
+ LOGW("0-duration samples found: %d", sampleCount);
}
SttsTableEntry sttsEntry(sampleCount, duration);
mSttsTableEntries.push_back(sttsEntry);
@@ -1304,7 +1304,7 @@ void MPEG4Writer::bufferChunk(const Chunk& chunk) {
void MPEG4Writer::writeChunkToFile(Chunk* chunk) {
LOGV("writeChunkToFile: %lld from %s track",
- chunk.mTimestampUs, chunk.mTrack->isAudio()? "audio": "video");
+ chunk->mTimeStampUs, chunk->mTrack->isAudio()? "audio": "video");
int32_t isFirstSample = true;
while (!chunk->mSamples.empty()) {
diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp
index c2e6707..91b81c2 100644
--- a/media/libstagefright/SurfaceMediaSource.cpp
+++ b/media/libstagefright/SurfaceMediaSource.cpp
@@ -179,9 +179,11 @@ status_t SurfaceMediaSource::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
// TODO: Currently just uses mDefaultWidth/Height. In the future
// we might declare mHeight and mWidth and check against those here.
if ((w != 0) || (h != 0)) {
- LOGE("dequeuebuffer: invalid buffer size! Req: %dx%d, Found: %dx%d",
- mDefaultWidth, mDefaultHeight, w, h);
- return BAD_VALUE;
+ if ((w != mDefaultWidth) || (h != mDefaultHeight)) {
+ LOGE("dequeuebuffer: invalid buffer size! Req: %dx%d, Found: %dx%d",
+ mDefaultWidth, mDefaultHeight, w, h);
+ return BAD_VALUE;
+ }
}
status_t returnFlags(OK);
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 14476d3..24cf77c 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -84,8 +84,8 @@ struct AwesomePlayer {
bool isPlaying() const;
- void setSurface(const sp<Surface> &surface);
- void setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture);
+ status_t setSurface(const sp<Surface> &surface);
+ status_t setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture);
void setAudioSink(const sp<MediaPlayerBase::AudioSink> &audioSink);
status_t setLooping(bool shouldLoop);
@@ -298,7 +298,7 @@ private:
void postAudioSeekComplete_l();
void shutdownVideoDecoder_l();
- void setNativeWindow_l(const sp<ANativeWindow> &native);
+ status_t setNativeWindow_l(const sp<ANativeWindow> &native);
bool isStreamingHTTP() const;
void sendCacheStats();
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 2260091..94efa74 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -151,7 +151,7 @@ static const char *audio_interfaces[] = {
AudioFlinger::AudioFlinger()
: BnAudioFlinger(),
mPrimaryHardwareDev(0), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1),
- mBtNrec(false)
+ mBtNrecIsOff(false)
{
}
@@ -751,15 +751,15 @@ status_t AudioFlinger::setParameters(int ioHandle, const String8& keyValuePairs)
String8 value;
if (param.get(String8(AUDIO_PARAMETER_KEY_BT_NREC), value) == NO_ERROR) {
Mutex::Autolock _l(mLock);
- bool btNrec = (value == AUDIO_PARAMETER_VALUE_ON);
- if (mBtNrec != btNrec) {
+ bool btNrecIsOff = (value == AUDIO_PARAMETER_VALUE_OFF);
+ if (mBtNrecIsOff != btNrecIsOff) {
for (size_t i = 0; i < mRecordThreads.size(); i++) {
sp<RecordThread> thread = mRecordThreads.valueAt(i);
RecordThread::RecordTrack *track = thread->track();
if (track != NULL) {
audio_devices_t device = (audio_devices_t)(
thread->device() & AUDIO_DEVICE_IN_ALL);
- bool suspend = audio_is_bluetooth_sco_device(device) && btNrec;
+ bool suspend = audio_is_bluetooth_sco_device(device) && btNrecIsOff;
thread->setEffectSuspended(FX_IID_AEC,
suspend,
track->sessionId());
@@ -768,7 +768,7 @@ status_t AudioFlinger::setParameters(int ioHandle, const String8& keyValuePairs)
track->sessionId());
}
}
- mBtNrec = btNrec;
+ mBtNrecIsOff = btNrecIsOff;
}
}
return final_result;
@@ -4411,7 +4411,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createR
mTrack = track.get();
// disable AEC and NS if the device is a BT SCO headset supporting those pre processings
bool suspend = audio_is_bluetooth_sco_device(
- (audio_devices_t)(mDevice & AUDIO_DEVICE_IN_ALL)) && mAudioFlinger->btNrec();
+ (audio_devices_t)(mDevice & AUDIO_DEVICE_IN_ALL)) && mAudioFlinger->btNrecIsOff();
setEffectSuspended_l(FX_IID_AEC, suspend, sessionId);
setEffectSuspended_l(FX_IID_NS, suspend, sessionId);
}
@@ -4636,7 +4636,7 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
// disable AEC and NS if the device is a BT SCO headset supporting those pre processings
if (mTrack != NULL) {
bool suspend = audio_is_bluetooth_sco_device(
- (audio_devices_t)value) && mAudioFlinger->btNrec();
+ (audio_devices_t)value) && mAudioFlinger->btNrecIsOff();
setEffectSuspended_l(FX_IID_AEC, suspend, mTrack->sessionId());
setEffectSuspended_l(FX_IID_NS, suspend, mTrack->sessionId());
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index c64fd4f..2e05593 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -210,7 +210,7 @@ public:
uint32_t getMode() { return mMode; }
- bool btNrec() { return mBtNrec; }
+ bool btNrecIsOff() { return mBtNrecIsOff; }
private:
AudioFlinger();
@@ -1393,7 +1393,7 @@ private:
DefaultKeyedVector< pid_t, sp<NotificationClient> > mNotificationClients;
volatile int32_t mNextUniqueId;
uint32_t mMode;
- bool mBtNrec;
+ bool mBtNrecIsOff;
Vector<AudioSessionRef*> mAudioSessionRefs;
};