summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2013-03-25 13:25:39 -0700
committerAndreas Huber <andih@google.com>2013-03-25 13:25:39 -0700
commitcc8623a7af8c1f7f40dd7810e2b5cf24a008faf3 (patch)
treee5b2c7f03349f4c417d4554209cf254cab53a8d4 /media/libstagefright/wifi-display
parent09bfd026b9f4fe004cba05e2eaf2dee38913bc7e (diff)
downloadframeworks_av-cc8623a7af8c1f7f40dd7810e2b5cf24a008faf3.zip
frameworks_av-cc8623a7af8c1f7f40dd7810e2b5cf24a008faf3.tar.gz
frameworks_av-cc8623a7af8c1f7f40dd7810e2b5cf24a008faf3.tar.bz2
Misc debugging support and handling of latency changes.
Change-Id: I682944f793690842219cf1adbae5e61e061b6b62
Diffstat (limited to 'media/libstagefright/wifi-display')
-rw-r--r--media/libstagefright/wifi-display/MediaSender.cpp31
-rw-r--r--media/libstagefright/wifi-display/sink/DirectRenderer.cpp24
-rw-r--r--media/libstagefright/wifi-display/sink/DirectRenderer.h5
-rw-r--r--media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp78
-rw-r--r--media/libstagefright/wifi-display/sink/WifiDisplaySink.h6
-rw-r--r--media/libstagefright/wifi-display/wfd.cpp15
6 files changed, 68 insertions, 91 deletions
diff --git a/media/libstagefright/wifi-display/MediaSender.cpp b/media/libstagefright/wifi-display/MediaSender.cpp
index 6fc50f7..123bc1c 100644
--- a/media/libstagefright/wifi-display/MediaSender.cpp
+++ b/media/libstagefright/wifi-display/MediaSender.cpp
@@ -267,37 +267,6 @@ status_t MediaSender::queueAccessUnit(
tsPackets,
33 /* packetType */,
RTPSender::PACKETIZATION_TRANSPORT_STREAM);
-
-#if 0
- {
- int64_t nowUs = ALooper::GetNowUs();
-
- int64_t timeUs;
- CHECK(accessUnit->meta()->findInt64("timeUs", &timeUs));
-
- int64_t delayMs = (nowUs - timeUs) / 1000ll;
-
- static const int64_t kMinDelayMs = 0;
- static const int64_t kMaxDelayMs = 300;
-
- const char *kPattern = "########################################";
- size_t kPatternSize = strlen(kPattern);
-
- int n = (kPatternSize * (delayMs - kMinDelayMs))
- / (kMaxDelayMs - kMinDelayMs);
-
- if (n < 0) {
- n = 0;
- } else if ((size_t)n > kPatternSize) {
- n = kPatternSize;
- }
-
- ALOGI("[%lld]: (%4lld ms) %s\n",
- timeUs / 1000,
- delayMs,
- kPattern + kPatternSize - n);
- }
-#endif
}
if (err != OK) {
diff --git a/media/libstagefright/wifi-display/sink/DirectRenderer.cpp b/media/libstagefright/wifi-display/sink/DirectRenderer.cpp
index 12338e9..15f9c88 100644
--- a/media/libstagefright/wifi-display/sink/DirectRenderer.cpp
+++ b/media/libstagefright/wifi-display/sink/DirectRenderer.cpp
@@ -467,8 +467,6 @@ DirectRenderer::DirectRenderer(
const sp<IGraphicBufferProducer> &bufferProducer)
: mSurfaceTex(bufferProducer),
mVideoRenderPending(false),
- mLatencySum(0ll),
- mLatencyCount(0),
mNumFramesLate(0),
mNumFrames(0) {
}
@@ -476,25 +474,6 @@ DirectRenderer::DirectRenderer(
DirectRenderer::~DirectRenderer() {
}
-int64_t DirectRenderer::getAvgLatenessUs() {
- if (mLatencyCount == 0) {
- return 0ll;
- }
-
- int64_t avgLatencyUs = mLatencySum / mLatencyCount;
-
- mLatencySum = 0ll;
- mLatencyCount = 0;
-
- if (mNumFrames > 0) {
- ALOGI("%d / %d frames late", mNumFramesLate, mNumFrames);
- mNumFramesLate = 0;
- mNumFrames = 0;
- }
-
- return avgLatencyUs;
-}
-
void DirectRenderer::onMessageReceived(const sp<AMessage> &msg) {
switch (msg->what()) {
case kWhatDecoderNotify:
@@ -632,9 +611,6 @@ void DirectRenderer::onRenderVideo() {
}
++mNumFrames;
- mLatencySum += nowUs - info.mTimeUs;
- ++mLatencyCount;
-
status_t err =
mDecoderContext[0]->renderOutputBufferAndRelease(info.mIndex);
CHECK_EQ(err, (status_t)OK);
diff --git a/media/libstagefright/wifi-display/sink/DirectRenderer.h b/media/libstagefright/wifi-display/sink/DirectRenderer.h
index 92c176a..c5a4a83 100644
--- a/media/libstagefright/wifi-display/sink/DirectRenderer.h
+++ b/media/libstagefright/wifi-display/sink/DirectRenderer.h
@@ -34,8 +34,6 @@ struct DirectRenderer : public AHandler {
void setFormat(size_t trackIndex, const sp<AMessage> &format);
void queueAccessUnit(size_t trackIndex, const sp<ABuffer> &accessUnit);
- int64_t getAvgLatenessUs();
-
protected:
virtual void onMessageReceived(const sp<AMessage> &msg);
virtual ~DirectRenderer();
@@ -64,9 +62,6 @@ private:
sp<AudioRenderer> mAudioRenderer;
- int64_t mLatencySum;
- size_t mLatencyCount;
-
int32_t mNumFramesLate;
int32_t mNumFrames;
diff --git a/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp b/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp
index 62021c0..bc98402 100644
--- a/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp
+++ b/media/libstagefright/wifi-display/sink/WifiDisplaySink.cpp
@@ -51,8 +51,10 @@ WifiDisplaySink::WifiDisplaySink(
mIDRFrameRequestPending(false),
mTimeOffsetUs(0ll),
mTimeOffsetValid(false),
- mTargetLatencyUs(-1ll),
- mSetupDeferred(false) {
+ mSetupDeferred(false),
+ mLatencyCount(0),
+ mLatencySumUs(0ll),
+ mLatencyMaxUs(0ll) {
// We support any and all resolutions, but prefer 720p30
mSinkSupportedVideoFormats.setNativeResolution(
VideoFormats::RESOLUTION_CEA, 5); // 1280 x 720 p30
@@ -265,13 +267,20 @@ void WifiDisplaySink::onMessageReceived(const sp<AMessage> &msg) {
case kWhatReportLateness:
{
- int64_t latenessUs = mRenderer->getAvgLatenessUs();
+ if (mLatencyCount > 0) {
+ int64_t avgLatencyUs = mLatencySumUs / mLatencyCount;
- ALOGI("avg. lateness = %lld ms",
- (latenessUs + mTargetLatencyUs) / 1000ll);
+ ALOGI("avg. latency = %lld ms (max %lld ms)",
+ avgLatencyUs / 1000ll,
+ mLatencyMaxUs / 1000ll);
- mMediaReceiver->notifyLateness(
- 0 /* trackIndex */, latenessUs);
+ mMediaReceiver->notifyLateness(
+ 0 /* trackIndex */, avgLatencyUs);
+ }
+
+ mLatencyCount = 0;
+ mLatencySumUs = 0ll;
+ mLatencyMaxUs = 0ll;
msg->post(kReportLatenessEveryUs);
break;
@@ -282,6 +291,30 @@ void WifiDisplaySink::onMessageReceived(const sp<AMessage> &msg) {
}
}
+static void dumpDelay(size_t trackIndex, int64_t timeUs) {
+ int64_t delayMs = (ALooper::GetNowUs() - timeUs) / 1000ll;
+
+ static const int64_t kMinDelayMs = 0;
+ static const int64_t kMaxDelayMs = 300;
+
+ const char *kPattern = "########################################";
+ size_t kPatternSize = strlen(kPattern);
+
+ int n = (kPatternSize * (delayMs - kMinDelayMs))
+ / (kMaxDelayMs - kMinDelayMs);
+
+ if (n < 0) {
+ n = 0;
+ } else if ((size_t)n > kPatternSize) {
+ n = kPatternSize;
+ }
+
+ ALOGI("[%lld]: (%4lld ms) %s",
+ timeUs / 1000,
+ delayMs,
+ kPattern + kPatternSize - n);
+}
+
void WifiDisplaySink::onMediaReceiverNotify(const sp<AMessage> &msg) {
int32_t what;
CHECK(msg->findInt32("what", &what));
@@ -319,24 +352,6 @@ void WifiDisplaySink::onMediaReceiverNotify(const sp<AMessage> &msg) {
CHECK(mTimeOffsetValid);
- int64_t latencyUs = 200000ll; // 200ms by default
-
- char val[PROPERTY_VALUE_MAX];
- if (property_get("media.wfd-sink.latency", val, NULL)) {
- char *end;
- int64_t x = strtoll(val, &end, 10);
-
- if (end > val && *end == '\0' && x >= 0ll) {
- latencyUs = x;
- }
- }
-
- if (latencyUs != mTargetLatencyUs) {
- mTargetLatencyUs = latencyUs;
-
- ALOGI("Assuming %lld ms of latency.", latencyUs / 1000ll);
- }
-
sp<ABuffer> accessUnit;
CHECK(msg->findBuffer("accessUnit", &accessUnit));
@@ -345,13 +360,24 @@ void WifiDisplaySink::onMediaReceiverNotify(const sp<AMessage> &msg) {
// We are the timesync _client_,
// client time = server time - time offset.
- timeUs += mTargetLatencyUs - mTimeOffsetUs;
+ timeUs -= mTimeOffsetUs;
accessUnit->meta()->setInt64("timeUs", timeUs);
size_t trackIndex;
CHECK(msg->findSize("trackIndex", &trackIndex));
+ int64_t nowUs = ALooper::GetNowUs();
+ int64_t delayUs = nowUs - timeUs;
+
+ mLatencySumUs += delayUs;
+ if (mLatencyCount == 0 || delayUs > mLatencyMaxUs) {
+ mLatencyMaxUs = delayUs;
+ }
+ ++mLatencyCount;
+
+ // dumpDelay(trackIndex, timeUs);
+
#if USE_TUNNEL_RENDERER
mRenderer->queueBuffer(accessUnit);
#else
diff --git a/media/libstagefright/wifi-display/sink/WifiDisplaySink.h b/media/libstagefright/wifi-display/sink/WifiDisplaySink.h
index 2b8c6f7..f515177 100644
--- a/media/libstagefright/wifi-display/sink/WifiDisplaySink.h
+++ b/media/libstagefright/wifi-display/sink/WifiDisplaySink.h
@@ -132,10 +132,12 @@ private:
int64_t mTimeOffsetUs;
bool mTimeOffsetValid;
- int64_t mTargetLatencyUs;
-
bool mSetupDeferred;
+ size_t mLatencyCount;
+ int64_t mLatencySumUs;
+ int64_t mLatencyMaxUs;
+
status_t sendM2(int32_t sessionID);
status_t sendSetup(int32_t sessionID, const char *uri);
status_t sendPlay(int32_t sessionID, const char *uri);
diff --git a/media/libstagefright/wifi-display/wfd.cpp b/media/libstagefright/wifi-display/wfd.cpp
index 4f7dcc8..9fee4d0 100644
--- a/media/libstagefright/wifi-display/wfd.cpp
+++ b/media/libstagefright/wifi-display/wfd.cpp
@@ -43,7 +43,8 @@ static void usage(const char *me) {
" -u uri \tconnect to an rtsp uri\n"
" -l ip[:port] \tlisten on the specified port "
" -f(ilename) \tstream media "
- "(create a sink)\n",
+ "(create a sink)\n"
+ " -s(pecial) \trun in 'special' mode\n",
me);
}
@@ -222,8 +223,10 @@ int main(int argc, char **argv) {
AString path;
+ bool specialMode = false;
+
int res;
- while ((res = getopt(argc, argv, "hc:l:u:f:")) >= 0) {
+ while ((res = getopt(argc, argv, "hc:l:u:f:s")) >= 0) {
switch (res) {
case 'c':
{
@@ -281,6 +284,12 @@ int main(int argc, char **argv) {
break;
}
+ case 's':
+ {
+ specialMode = true;
+ break;
+ }
+
case '?':
case 'h':
default:
@@ -357,7 +366,7 @@ int main(int argc, char **argv) {
sp<ALooper> looper = new ALooper;
sp<WifiDisplaySink> sink = new WifiDisplaySink(
- 0 /* flags */,
+ specialMode ? WifiDisplaySink::FLAG_SPECIAL_MODE : 0 /* flags */,
session,
surface->getIGraphicBufferProducer());