summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-07-13 09:36:11 -0700
committerAndreas Huber <andih@google.com>2011-07-13 09:47:09 -0700
commit42e549e4ab54802d788c43e3a04a85b7a1a95e97 (patch)
tree6bf620f639533f345089df3902a93109028bed4e
parent9cded98816c40fd55053b1e38fc7fd8a68da8866 (diff)
downloadframeworks_av-42e549e4ab54802d788c43e3a04a85b7a1a95e97.zip
frameworks_av-42e549e4ab54802d788c43e3a04a85b7a1a95e97.tar.gz
frameworks_av-42e549e4ab54802d788c43e3a04a85b7a1a95e97.tar.bz2
Enable signalling of a stream discontinuity involving a format-change
through IStreamListener. Change-Id: Ic0409cdc4891ad26b61f2f98bdda3c7fb2e2de6a related-to-bug: 5022434
-rw-r--r--include/media/IStreamSource.h11
-rw-r--r--media/libmedia/IStreamSource.cpp3
-rw-r--r--media/libmediaplayerservice/nuplayer/StreamingSource.cpp13
3 files changed, 25 insertions, 2 deletions
diff --git a/include/media/IStreamSource.h b/include/media/IStreamSource.h
index d310cee..cc63356 100644
--- a/include/media/IStreamSource.h
+++ b/include/media/IStreamSource.h
@@ -51,6 +51,17 @@ struct IStreamListener : public IInterface {
// will be suppressed until media time reaches this timestamp.
static const char *const kKeyResumeAtPTS;
+ // When signalling a discontinuity you can optionally
+ // signal that this is a "hard" discontinuity, i.e. the format
+ // or configuration of subsequent stream data differs from that
+ // currently active. To do so, include a non-zero int32_t value
+ // under the key "kKeyFormatChange" when issuing the DISCONTINUITY
+ // command.
+ // The new logical stream must start with proper codec initialization
+ // information for playback to continue, i.e. SPS and PPS in the case
+ // of AVC video etc.
+ static const char *const kKeyFormatChange;
+
virtual void issueCommand(
Command cmd, bool synchronous, const sp<AMessage> &msg = NULL) = 0;
};
diff --git a/media/libmedia/IStreamSource.cpp b/media/libmedia/IStreamSource.cpp
index c14ee82..b311f35 100644
--- a/media/libmedia/IStreamSource.cpp
+++ b/media/libmedia/IStreamSource.cpp
@@ -29,6 +29,9 @@ namespace android {
// static
const char *const IStreamListener::kKeyResumeAtPTS = "resume-at-PTS";
+// static
+const char *const IStreamListener::kKeyFormatChange = "format-change";
+
enum {
// IStreamSource
SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION,
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
index bbc8a6e..a6a3a18 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
@@ -63,8 +63,17 @@ bool NuPlayer::StreamingSource::feedMoreTSData() {
mEOS = true;
break;
} else if (n == INFO_DISCONTINUITY) {
- mTSParser->signalDiscontinuity(
- ATSParser::DISCONTINUITY_SEEK, extra);
+ ATSParser::DiscontinuityType type = ATSParser::DISCONTINUITY_SEEK;
+
+ int32_t formatChange;
+ if (extra != NULL
+ && extra->findInt32(
+ IStreamListener::kKeyFormatChange, &formatChange)
+ && formatChange != 0) {
+ type = ATSParser::DISCONTINUITY_FORMATCHANGE;
+ }
+
+ mTSParser->signalDiscontinuity(type, extra);
} else if (n < 0) {
CHECK_EQ(n, -EWOULDBLOCK);
break;