summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display/source/PlaybackSession.cpp
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2013-02-12 22:30:27 -0800
committerSteve Kondik <shade@chemlab.org>2013-02-12 22:30:27 -0800
commit001a7b82e04646682170d4b946529ebc0b956c16 (patch)
treefb3784437f93380f21b6d69e9c819fc1305104da /media/libstagefright/wifi-display/source/PlaybackSession.cpp
parentd852697190e617c43930723bbb446375394b4194 (diff)
parentf0ff908da019a44115109f1b4d1b6864b35a8a29 (diff)
downloadframeworks_av-001a7b82e04646682170d4b946529ebc0b956c16.zip
frameworks_av-001a7b82e04646682170d4b946529ebc0b956c16.tar.gz
frameworks_av-001a7b82e04646682170d4b946529ebc0b956c16.tar.bz2
Merge tag 'android-4.2.2_r1' of https://android.googlesource.com/platform/frameworks/av into 1.1
Android 4.2.2 release 1
Diffstat (limited to 'media/libstagefright/wifi-display/source/PlaybackSession.cpp')
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp112
1 files changed, 105 insertions, 7 deletions
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index f1e7140..916f797 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -26,6 +26,7 @@
#include "Sender.h"
#include "TSPacketizer.h"
#include "include/avc_utils.h"
+#include "WifiDisplaySource.h"
#include <binder/IServiceManager.h>
#include <gui/ISurfaceComposer.h>
@@ -75,13 +76,19 @@ struct WifiDisplaySource::PlaybackSession::Track : public AHandler {
status_t start();
void stopAsync();
+ void pause();
+ void resume();
+
void queueAccessUnit(const sp<ABuffer> &accessUnit);
sp<ABuffer> dequeueAccessUnit();
bool hasOutputBuffer(int64_t *timeUs) const;
void queueOutputBuffer(const sp<ABuffer> &accessUnit);
sp<ABuffer> dequeueOutputBuffer();
+
+#if SUSPEND_VIDEO_IF_IDLE
bool isSuspended() const;
+#endif
size_t countQueuedOutputBuffers() const {
return mQueuedOutputBuffers.size();
@@ -204,6 +211,14 @@ void WifiDisplaySource::PlaybackSession::Track::stopAsync() {
}
}
+void WifiDisplaySource::PlaybackSession::Track::pause() {
+ mMediaPuller->pause();
+}
+
+void WifiDisplaySource::PlaybackSession::Track::resume() {
+ mMediaPuller->resume();
+}
+
void WifiDisplaySource::PlaybackSession::Track::onMessageReceived(
const sp<AMessage> &msg) {
switch (msg->what()) {
@@ -279,7 +294,6 @@ bool WifiDisplaySource::PlaybackSession::Track::hasOutputBuffer(
void WifiDisplaySource::PlaybackSession::Track::queueOutputBuffer(
const sp<ABuffer> &accessUnit) {
mQueuedOutputBuffers.push_back(accessUnit);
-
mLastOutputBufferQueuedTimeUs = ALooper::GetNowUs();
}
@@ -292,6 +306,7 @@ sp<ABuffer> WifiDisplaySource::PlaybackSession::Track::dequeueOutputBuffer() {
return outputBuffer;
}
+#if SUSPEND_VIDEO_IF_IDLE
bool WifiDisplaySource::PlaybackSession::Track::isSuspended() const {
if (!mQueuedOutputBuffers.empty()) {
return false;
@@ -307,6 +322,7 @@ bool WifiDisplaySource::PlaybackSession::Track::isSuspended() const {
// this track suspended for the time being.
return (ALooper::GetNowUs() - mLastOutputBufferQueuedTimeUs) > 60000ll;
}
+#endif
////////////////////////////////////////////////////////////////////////////////
@@ -320,6 +336,7 @@ WifiDisplaySource::PlaybackSession::PlaybackSession(
mInterfaceAddr(interfaceAddr),
mHDCP(hdcp),
mWeAreDead(false),
+ mPaused(false),
mLastLifesignUs(),
mVideoTrackIndex(-1),
mPrevTimeUs(-1ll),
@@ -378,6 +395,8 @@ void WifiDisplaySource::PlaybackSession::updateLiveness() {
status_t WifiDisplaySource::PlaybackSession::play() {
updateLiveness();
+ (new AMessage(kWhatResume, id()))->post();
+
return OK;
}
@@ -408,6 +427,8 @@ status_t WifiDisplaySource::PlaybackSession::onFinishPlay2() {
status_t WifiDisplaySource::PlaybackSession::pause() {
updateLiveness();
+ (new AMessage(kWhatPause, id()))->post();
+
return OK;
}
@@ -443,8 +464,13 @@ void WifiDisplaySource::PlaybackSession::onMessageReceived(
ssize_t packetizerTrackIndex = track->packetizerTrackIndex();
if (packetizerTrackIndex < 0) {
- packetizerTrackIndex =
- mPacketizer->addTrack(track->getFormat());
+ sp<AMessage> trackFormat = track->getFormat()->dup();
+ if (mHDCP != NULL && !track->isAudio()) {
+ // HDCP2.0 _and_ HDCP 2.1 specs say to set the version
+ // inside the HDCP descriptor to 0x20!!!
+ trackFormat->setInt32("hdcp-version", 0x20);
+ }
+ packetizerTrackIndex = mPacketizer->addTrack(trackFormat);
CHECK_GE(packetizerTrackIndex, 0);
@@ -580,6 +606,34 @@ void WifiDisplaySource::PlaybackSession::onMessageReceived(
break;
}
+ case kWhatPause:
+ {
+ if (mPaused) {
+ break;
+ }
+
+ for (size_t i = 0; i < mTracks.size(); ++i) {
+ mTracks.editValueAt(i)->pause();
+ }
+
+ mPaused = true;
+ break;
+ }
+
+ case kWhatResume:
+ {
+ if (!mPaused) {
+ break;
+ }
+
+ for (size_t i = 0; i < mTracks.size(); ++i) {
+ mTracks.editValueAt(i)->resume();
+ }
+
+ mPaused = false;
+ break;
+ }
+
default:
TRESPASS();
}
@@ -642,8 +696,10 @@ status_t WifiDisplaySource::PlaybackSession::addSource(
sp<Converter> converter =
new Converter(notify, codecLooper, format, usePCMAudio);
- if (converter->initCheck() != OK) {
- return converter->initCheck();
+ err = converter->initCheck();
+ if (err != OK) {
+ ALOGE("%s converter returned err %d", isVideo ? "video" : "audio", err);
+ return err;
}
looper()->registerHandler(converter);
@@ -735,11 +791,19 @@ sp<ISurfaceTexture> WifiDisplaySource::PlaybackSession::getSurfaceTexture() {
}
int32_t WifiDisplaySource::PlaybackSession::width() const {
+#if USE_1080P
+ return 1920;
+#else
return 1280;
+#endif
}
int32_t WifiDisplaySource::PlaybackSession::height() const {
+#if USE_1080P
+ return 1080;
+#else
return 720;
+#endif
}
void WifiDisplaySource::PlaybackSession::requestIDRFrame() {
@@ -767,7 +831,7 @@ bool WifiDisplaySource::PlaybackSession::allTracksHavePacketizerIndex() {
}
status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit(
- size_t trackIndex, const sp<ABuffer> &accessUnit,
+ size_t trackIndex, sp<ABuffer> accessUnit,
sp<ABuffer> *packets) {
const sp<Track> &track = mTracks.valueFor(trackIndex);
@@ -776,9 +840,20 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit(
bool isHDCPEncrypted = false;
uint64_t inputCTR;
uint8_t HDCP_private_data[16];
+
+ bool manuallyPrependSPSPPS =
+ !track->isAudio()
+ && track->converter()->needToManuallyPrependSPSPPS()
+ && IsIDR(accessUnit);
+
if (mHDCP != NULL && !track->isAudio()) {
isHDCPEncrypted = true;
+ if (manuallyPrependSPSPPS) {
+ accessUnit = mPacketizer->prependCSD(
+ track->packetizerTrackIndex(), accessUnit);
+ }
+
status_t err = mHDCP->encrypt(
accessUnit->data(), accessUnit->size(),
trackIndex /* streamCTR */,
@@ -858,6 +933,8 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit(
#endif
flags |= TSPacketizer::IS_ENCRYPTED;
+ } else if (manuallyPrependSPSPPS) {
+ flags |= TSPacketizer::PREPEND_SPS_PPS_TO_IDR_FRAMES;
}
int64_t timeUs = ALooper::GetNowUs();
@@ -930,12 +1007,21 @@ bool WifiDisplaySource::PlaybackSession::drainAccessUnit() {
minTrackIndex = mTracks.keyAt(i);
minTimeUs = timeUs;
}
- } else if (!track->isSuspended()) {
+ }
+#if SUSPEND_VIDEO_IF_IDLE
+ else if (!track->isSuspended()) {
// We still consider this track "live", so it should keep
// delivering output data whose time stamps we'll have to
// consider for proper interleaving.
return false;
}
+#else
+ else {
+ // We need access units available on all tracks to be able to
+ // dequeue the earliest one.
+ return false;
+ }
+#endif
}
if (minTrackIndex < 0) {
@@ -950,6 +1036,7 @@ bool WifiDisplaySource::PlaybackSession::drainAccessUnit() {
if (err != OK) {
notifySessionDead();
+ return false;
}
if ((ssize_t)minTrackIndex == mVideoTrackIndex) {
@@ -957,6 +1044,17 @@ bool WifiDisplaySource::PlaybackSession::drainAccessUnit() {
}
mSender->queuePackets(minTimeUs, packets);
+#if 0
+ if (minTrackIndex == mVideoTrackIndex) {
+ int64_t nowUs = ALooper::GetNowUs();
+
+ // Latency from "data acquired" to "ready to send if we wanted to".
+ ALOGI("[%s] latencyUs = %lld ms",
+ minTrackIndex == mVideoTrackIndex ? "video" : "audio",
+ (nowUs - minTimeUs) / 1000ll);
+ }
+#endif
+
return true;
}