summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-12-23 10:27:40 -0800
committerAndreas Huber <andih@google.com>2010-12-23 10:27:40 -0800
commit5bc087c573c70c84c6a39946457590b42d392a33 (patch)
treea9326bfa5027a152a5a21dd9de86d228c7d92330 /media/libstagefright
parent53df1a460bcfdd129ca2bc416dee2009e35c042e (diff)
downloadframeworks_av-5bc087c573c70c84c6a39946457590b42d392a33.zip
frameworks_av-5bc087c573c70c84c6a39946457590b42d392a33.tar.gz
frameworks_av-5bc087c573c70c84c6a39946457590b42d392a33.tar.bz2
Squashed commit of the following:
commit eaeaa2672d4e0a82891493b2bde8bdd0c0e79a1b Author: Andreas Huber <andih@google.com> Date: Thu Dec 23 10:26:48 2010 -0800 Remove lowest bandwidth stream if using the legacy player. Change-Id: I2f885e26344996de9152f8fda9fd6bdef89bf953 commit 7d652972615b2750fd8f1c21b9fab0e136df2b82 Author: Andreas Huber <andih@google.com> Date: Thu Dec 23 10:14:36 2010 -0800 Don't clear the packet source's format for legacy discontinuities. Change-Id: I9bd5a21b9bd28043ad38bd0658ccc8eda3c1079a commit 2b18a45aac17cbfe1aa089d0f6510957d438dd64 Author: Andreas Huber <andih@google.com> Date: Thu Dec 23 10:13:55 2010 -0800 Use NuPlayer for HTTP live streaming based on runtime property. adb shell setprop media.httplive.enable-nuplayer true Change-Id: I22738df3403985dc8e6992b1ab5da5747309f773 commit 50d899fb7b9ea52c3994b0a58e993998d926aeed Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 16:25:22 2010 -0800 Make ACodec a lot less verbose. Change-Id: I94c7e499b61032321ffaf999f5ad2c913cde6a48 commit b19e1740cb4d02990a56844654b5d019987c6405 Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 16:22:22 2010 -0800 Wait until we have fresh codec-specific-data before instantiating the decoders after a discontinuity involving a format change. Change-Id: I7bcf9b5ae3319f08bf8978a117e8ee5220902e37 commit 06428c006906c9099e430aface3b439ff1d36ecc Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 15:20:38 2010 -0800 Disable random seeks in the streaming tool for now. Change-Id: Ie86fde422dcfc4b2c7a01be51a193fda9c88cd71 commit e19db68f3bea8a61c191f60f6940f30e3a0d5f1b Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 15:20:27 2010 -0800 Tweak HTTP live parameters. Change-Id: If4b71e12485facc523a8a43d8213d0feb190daab commit 1e9942791538c2256b579d96c6c04264b0d8b087 Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 14:48:23 2010 -0800 Enable http live streaming through NuPlayer for http URLs containing the string m3u8 Change-Id: I1691fe12ae8f1507fe3673313959cd50bc324624 commit 4c33f96a6e499ee0efe0e70b687094430cb7c1c0 Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 14:40:27 2010 -0800 Support for HTTP live streaming in NuPlayer. Change-Id: Iacba1c3ebaeb8d3b972185deaf4cff18c8009c54 commit ddf705ce553708bc5b13d89a878484cf839bd674 Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 13:42:47 2010 -0800 StreamingSource now a subclass of abstract NuPlayer::Source Change-Id: Ia6c7c639628910b9d1f37decc55da48b07a70de3 commit 9e04a8406b1882a8e3fdeb7b4d52db5ae70b970a Author: Andreas Huber <andih@google.com> Date: Wed Dec 22 13:33:52 2010 -0800 Refactor media data sourcing to NuPlayer::Source. Change-Id: I1db9fb08c4e527bf7b19c29978cf342c2b0a0bc9 Change-Id: I9610a097481dda58f22142eacda3ac2dba0b63f9
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/ACodec.cpp22
-rw-r--r--media/libstagefright/avc_utils.cpp4
-rw-r--r--media/libstagefright/httplive/LiveDataSource.cpp31
-rw-r--r--media/libstagefright/httplive/LiveDataSource.h3
-rw-r--r--media/libstagefright/httplive/LiveSession.cpp15
-rw-r--r--media/libstagefright/include/LiveSession.h2
-rw-r--r--media/libstagefright/mpeg2ts/ATSParser.cpp8
-rw-r--r--media/libstagefright/mpeg2ts/AnotherPacketSource.cpp29
-rw-r--r--media/libstagefright/mpeg2ts/AnotherPacketSource.h6
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.cpp8
10 files changed, 99 insertions, 29 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 3bb61f2..39e0c51 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -1082,7 +1082,7 @@ bool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) {
bool ACodec::BaseState::onOMXEvent(
OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
if (event != OMX_EventError) {
- LOGI("[%s] EVENT(%d, 0x%08lx, 0x%08lx)",
+ LOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)",
mCodec->mComponentName.c_str(), event, data1, data2);
return false;
@@ -1520,7 +1520,7 @@ ACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec)
}
void ACodec::LoadedToIdleState::stateEntered() {
- LOGI("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());
CHECK_EQ(allocateBuffers(), (status_t)OK);
}
@@ -1577,7 +1577,7 @@ ACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec)
}
void ACodec::IdleToExecutingState::stateEntered() {
- LOGI("[%s] Now Idle->Executing", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str());
}
bool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) {
@@ -1661,7 +1661,7 @@ void ACodec::ExecutingState::resume() {
}
void ACodec::ExecutingState::stateEntered() {
- LOGI("[%s] Now Executing", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Executing", mCodec->mComponentName.c_str());
mCodec->processDeferredMessages();
}
@@ -1787,7 +1787,7 @@ bool ACodec::OutputPortSettingsChangedState::onMessageReceived(
}
void ACodec::OutputPortSettingsChangedState::stateEntered() {
- LOGI("[%s] Now handling output port settings change",
+ LOGV("[%s] Now handling output port settings change",
mCodec->mComponentName.c_str());
}
@@ -1868,7 +1868,7 @@ bool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) {
}
void ACodec::ExecutingToIdleState::stateEntered() {
- LOGI("[%s] Now Executing->Idle", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str());
}
bool ACodec::ExecutingToIdleState::onOMXEvent(
@@ -1950,7 +1950,7 @@ bool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) {
}
void ACodec::IdleToLoadedState::stateEntered() {
- LOGI("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str());
}
bool ACodec::IdleToLoadedState::onOMXEvent(
@@ -1961,7 +1961,7 @@ bool ACodec::IdleToLoadedState::onOMXEvent(
CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet);
CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded);
- LOGI("[%s] Now Loaded", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Loaded", mCodec->mComponentName.c_str());
CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK);
@@ -1995,12 +1995,12 @@ bool ACodec::ErrorState::onMessageReceived(const sp<AMessage> &msg) {
}
void ACodec::ErrorState::stateEntered() {
- LOGI("[%s] Now in ErrorState", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now in ErrorState", mCodec->mComponentName.c_str());
}
bool ACodec::ErrorState::onOMXEvent(
OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
- LOGI("EVENT(%d, 0x%08lx, 0x%08lx)", event, data1, data2);
+ LOGV("EVENT(%d, 0x%08lx, 0x%08lx)", event, data1, data2);
return true;
}
@@ -2011,7 +2011,7 @@ ACodec::FlushingState::FlushingState(ACodec *codec)
}
void ACodec::FlushingState::stateEntered() {
- LOGI("[%s] Now Flushing", mCodec->mComponentName.c_str());
+ LOGV("[%s] Now Flushing", mCodec->mComponentName.c_str());
mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false;
}
diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp
index 2fe5e18..fa12cf0 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -14,6 +14,10 @@
* limitations under the License.
*/
+//#define LOG_NDEBUG 0
+#define LOG_TAG "avc_utils"
+#include <utils/Log.h>
+
#include "include/avc_utils.h"
#include <media/stagefright/foundation/ABitReader.h>
diff --git a/media/libstagefright/httplive/LiveDataSource.cpp b/media/libstagefright/httplive/LiveDataSource.cpp
index 25e2902..5f5c6d4 100644
--- a/media/libstagefright/httplive/LiveDataSource.cpp
+++ b/media/libstagefright/httplive/LiveDataSource.cpp
@@ -54,9 +54,40 @@ size_t LiveDataSource::countQueuedBuffers() {
return mBufferQueue.size();
}
+ssize_t LiveDataSource::readAtNonBlocking(
+ off64_t offset, void *data, size_t size) {
+ Mutex::Autolock autoLock(mLock);
+
+ if (offset != mOffset) {
+ LOGE("Attempt at reading non-sequentially from LiveDataSource.");
+ return -EPIPE;
+ }
+
+ size_t totalAvailable = 0;
+ for (List<sp<ABuffer> >::iterator it = mBufferQueue.begin();
+ it != mBufferQueue.end(); ++it) {
+ sp<ABuffer> buffer = *it;
+
+ totalAvailable += buffer->size();
+
+ if (totalAvailable >= size) {
+ break;
+ }
+ }
+
+ if (totalAvailable < size) {
+ return mFinalResult == OK ? -EWOULDBLOCK : mFinalResult;
+ }
+
+ return readAt_l(offset, data, size);
+}
+
ssize_t LiveDataSource::readAt(off64_t offset, void *data, size_t size) {
Mutex::Autolock autoLock(mLock);
+ return readAt_l(offset, data, size);
+}
+ssize_t LiveDataSource::readAt_l(off64_t offset, void *data, size_t size) {
if (offset != mOffset) {
LOGE("Attempt at reading non-sequentially from LiveDataSource.");
return -EPIPE;
diff --git a/media/libstagefright/httplive/LiveDataSource.h b/media/libstagefright/httplive/LiveDataSource.h
index a489ec6..b7be637 100644
--- a/media/libstagefright/httplive/LiveDataSource.h
+++ b/media/libstagefright/httplive/LiveDataSource.h
@@ -33,6 +33,7 @@ struct LiveDataSource : public DataSource {
virtual status_t initCheck() const;
virtual ssize_t readAt(off64_t offset, void *data, size_t size);
+ ssize_t readAtNonBlocking(off64_t offset, void *data, size_t size);
void queueBuffer(const sp<ABuffer> &buffer);
void queueEOS(status_t finalResult);
@@ -53,6 +54,8 @@ private:
FILE *mBackupFile;
+ ssize_t readAt_l(off64_t offset, void *data, size_t size);
+
DISALLOW_EVIL_CONSTRUCTORS(LiveDataSource);
};
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp
index 5c4c5df..5b1f14d 100644
--- a/media/libstagefright/httplive/LiveSession.cpp
+++ b/media/libstagefright/httplive/LiveSession.cpp
@@ -157,9 +157,16 @@ void LiveSession::onConnect(const sp<AMessage> &msg) {
mBandwidthItems.sort(SortByBandwidth);
- if (mBandwidthItems.size() > 1) {
- // XXX Remove the lowest bitrate stream for now...
- mBandwidthItems.removeAt(0);
+ char value[PROPERTY_VALUE_MAX];
+ if (!property_get("media.httplive.enable-nuplayer", value, NULL)
+ || (strcasecmp(value, "true") && strcmp(value, "1"))) {
+ // The "legacy" player cannot deal with audio format changes,
+ // some streams use different audio encoding parameters for
+ // their lowest bandwidth stream.
+ if (mBandwidthItems.size() > 1) {
+ // XXX Remove the lowest bitrate stream for now...
+ mBandwidthItems.removeAt(0);
+ }
}
}
@@ -421,7 +428,7 @@ void LiveSession::onDownloadNext() {
++mNumRetries;
mLastPlaylistFetchTimeUs = -1;
- postMonitorQueue(1000000ll);
+ postMonitorQueue(3000000ll);
return;
}
diff --git a/media/libstagefright/include/LiveSession.h b/media/libstagefright/include/LiveSession.h
index 50c0a99..3873d5d 100644
--- a/media/libstagefright/include/LiveSession.h
+++ b/media/libstagefright/include/LiveSession.h
@@ -50,7 +50,7 @@ protected:
private:
enum {
kMaxNumQueuedFragments = 2,
- kMaxNumRetries = 3,
+ kMaxNumRetries = 5,
};
static const int64_t kMaxPlaylistAgeUs;
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index ee9b573..7c81ffd 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -334,7 +334,7 @@ void ATSParser::Stream::signalDiscontinuity(DiscontinuityType type) {
if (mStreamType == 0x1b && mSource != NULL) {
// Don't signal discontinuities on audio streams.
- mSource->queueDiscontinuity(true /* formatChange */);
+ mSource->queueDiscontinuity(type);
}
break;
}
@@ -348,7 +348,7 @@ void ATSParser::Stream::signalDiscontinuity(DiscontinuityType type) {
if (mSource != NULL) {
mSource->clear();
- mSource->queueDiscontinuity(!isASeek);
+ mSource->queueDiscontinuity(type);
}
break;
}
@@ -561,6 +561,10 @@ void ATSParser::Stream::onPayloadData(
// After a discontinuity we invalidate the queue's format
// and won't enqueue any access units to the source until
// the queue has reestablished the new format.
+
+ if (mSource->getFormat() == NULL) {
+ mSource->setFormat(mQueue.getFormat());
+ }
mSource->queueAccessUnit(accessUnit);
}
}
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
index a8fe2c1..c6edf0a 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
@@ -33,6 +33,11 @@ AnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta)
mEOSResult(OK) {
}
+void AnotherPacketSource::setFormat(const sp<MetaData> &meta) {
+ CHECK(mFormat == NULL);
+ mFormat = meta;
+}
+
AnotherPacketSource::~AnotherPacketSource() {
}
@@ -61,8 +66,12 @@ status_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
mBuffers.erase(mBuffers.begin());
int32_t discontinuity;
- if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)
- && discontinuity) {
+ if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
+
+ if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) {
+ mFormat.clear();
+ }
+
return INFO_DISCONTINUITY;
}
@@ -86,8 +95,11 @@ status_t AnotherPacketSource::read(
mBuffers.erase(mBuffers.begin());
int32_t discontinuity;
- if (buffer->meta()->findInt32("discontinuity", &discontinuity)
- && discontinuity) {
+ if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
+ if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) {
+ mFormat.clear();
+ }
+
return INFO_DISCONTINUITY;
} else {
int64_t timeUs;
@@ -123,13 +135,10 @@ void AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
mCondition.signal();
}
-void AnotherPacketSource::queueDiscontinuity(bool formatChange) {
+void AnotherPacketSource::queueDiscontinuity(
+ ATSParser::DiscontinuityType type) {
sp<ABuffer> buffer = new ABuffer(0);
- buffer->meta()->setInt32("discontinuity", true);
-
- if (formatChange) {
- buffer->meta()->setInt32("format-change", true);
- }
+ buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
Mutex::Autolock autoLock(mLock);
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
index f25a067..c20fca3 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
@@ -23,6 +23,8 @@
#include <utils/threads.h>
#include <utils/List.h>
+#include "ATSParser.h"
+
namespace android {
struct ABuffer;
@@ -30,6 +32,8 @@ struct ABuffer;
struct AnotherPacketSource : public MediaSource {
AnotherPacketSource(const sp<MetaData> &meta);
+ void setFormat(const sp<MetaData> &meta);
+
virtual status_t start(MetaData *params = NULL);
virtual status_t stop();
virtual sp<MetaData> getFormat();
@@ -42,7 +46,7 @@ struct AnotherPacketSource : public MediaSource {
status_t nextBufferTime(int64_t *timeUs);
void queueAccessUnit(const sp<ABuffer> &buffer);
- void queueDiscontinuity(bool formatChange);
+ void queueDiscontinuity(ATSParser::DiscontinuityType type);
void signalEOS(status_t result);
void clear();
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index 4e7759d..73efdfe 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -225,6 +225,14 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
mFormat = MakeAACCodecSpecificData(
profile, sampling_freq_index, channel_configuration);
+
+ int32_t sampleRate;
+ int32_t numChannels;
+ CHECK(mFormat->findInt32(kKeySampleRate, &sampleRate));
+ CHECK(mFormat->findInt32(kKeyChannelCount, &numChannels));
+
+ LOGI("found AAC codec config (%d Hz, %d channels)",
+ sampleRate, numChannels);
} else {
// profile_ObjectType, sampling_frequency_index, private_bits,
// channel_configuration, original_copy, home