summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display/source/PlaybackSession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/wifi-display/source/PlaybackSession.cpp')
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp71
1 files changed, 59 insertions, 12 deletions
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index 68aa9cb..715d0b5 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -27,6 +27,7 @@
#include "WifiDisplaySource.h"
#include <binder/IServiceManager.h>
+#include <cutils/properties.h>
#include <media/IHDCP.h>
#include <media/stagefright/foundation/ABitReader.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -66,6 +67,7 @@ struct WifiDisplaySource::PlaybackSession::Track : public AHandler {
bool isAudio() const;
const sp<Converter> &converter() const;
+ const sp<RepeaterSource> &repeaterSource() const;
ssize_t mediaSenderTrackIndex() const;
void setMediaSenderTrackIndex(size_t index);
@@ -171,6 +173,11 @@ const sp<Converter> &WifiDisplaySource::PlaybackSession::Track::converter() cons
return mConverter;
}
+const sp<RepeaterSource> &
+WifiDisplaySource::PlaybackSession::Track::repeaterSource() const {
+ return mRepeaterSource;
+}
+
ssize_t WifiDisplaySource::PlaybackSession::Track::mediaSenderTrackIndex() const {
CHECK_GE(mMediaSenderTrackIndex, 0);
return mMediaSenderTrackIndex;
@@ -663,27 +670,67 @@ void WifiDisplaySource::PlaybackSession::onSinkFeedback(const sp<AMessage> &msg)
if (mVideoTrackIndex >= 0) {
const sp<Track> &videoTrack = mTracks.valueFor(mVideoTrackIndex);
sp<Converter> converter = videoTrack->converter();
- if (converter != NULL) {
- int32_t videoBitrate = converter->getVideoBitrate();
- if (avgLatencyUs > 300000ll) {
- videoBitrate *= 0.6;
+ if (converter != NULL) {
+ int32_t videoBitrate =
+ Converter::GetInt32Property("media.wfd.video-bitrate", -1);
+
+ char val[PROPERTY_VALUE_MAX];
+ if (videoBitrate < 0
+ && property_get("media.wfd.video-bitrate", val, NULL)
+ && !strcasecmp("adaptive", val)) {
+ videoBitrate = converter->getVideoBitrate();
+
+ if (avgLatencyUs > 300000ll) {
+ videoBitrate *= 0.6;
+ } else if (avgLatencyUs < 100000ll) {
+ videoBitrate *= 1.1;
+ }
+ }
+ if (videoBitrate > 0) {
if (videoBitrate < 500000) {
- videoBitrate = 500000; // cap at 500kbit/sec
+ videoBitrate = 500000;
+ } else if (videoBitrate > 10000000) {
+ videoBitrate = 10000000;
+ }
+
+ if (videoBitrate != converter->getVideoBitrate()) {
+ ALOGI("setting video bitrate to %d bps", videoBitrate);
+
+ converter->setVideoBitrate(videoBitrate);
}
- } else if (avgLatencyUs < 100000ll) {
- videoBitrate *= 1.1;
+ }
+ }
+
+ sp<RepeaterSource> repeaterSource = videoTrack->repeaterSource();
+ if (repeaterSource != NULL) {
+ double rateHz =
+ Converter::GetInt32Property(
+ "media.wfd.video-framerate", -1);
- if (videoBitrate > 10000000) {
- videoBitrate = 10000000; // cap at 10Mbit/sec
+ if (rateHz < 0.0) {
+ rateHz = repeaterSource->getFrameRate();
+
+ if (avgLatencyUs > 300000ll) {
+ rateHz *= 0.9;
+ } else if (avgLatencyUs < 200000ll) {
+ rateHz *= 1.1;
}
}
- if (videoBitrate != converter->getVideoBitrate()) {
- ALOGI("setting video bitrate to %d bps", videoBitrate);
+ if (rateHz > 0) {
+ if (rateHz < 5.0) {
+ rateHz = 5.0;
+ } else if (rateHz > 30.0) {
+ rateHz = 30.0;
+ }
+
+ if (rateHz != repeaterSource->getFrameRate()) {
+ ALOGI("setting frame rate to %.2f Hz", rateHz);
- converter->setVideoBitrate(videoBitrate);
+ repeaterSource->setFrameRate(rateHz);
+ }
}
}
}