Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2abf9374 authored by Andreas Huber's avatar Andreas Huber Committed by Android Git Automerger
Browse files

am 4fc3e841: Merge "Adapt frame rate instead of keeping that constant and...

am 4fc3e841: Merge "Adapt frame rate instead of keeping that constant and tweaking bitrate" into jb-mr2-dev

* commit '4fc3e841':
  Adapt frame rate instead of keeping that constant and tweaking bitrate
parents 4eff193a c9e58fcf
Loading
Loading
Loading
Loading
+5 −17
Original line number Original line Diff line number Diff line
@@ -135,7 +135,9 @@ bool Converter::needToManuallyPrependSPSPPS() const {
    return mNeedToManuallyPrependSPSPPS;
    return mNeedToManuallyPrependSPSPPS;
}
}


static int32_t getBitrate(const char *propName, int32_t defaultValue) {
// static
int32_t Converter::GetInt32Property(
        const char *propName, int32_t defaultValue) {
    char val[PROPERTY_VALUE_MAX];
    char val[PROPERTY_VALUE_MAX];
    if (property_get(propName, val, NULL)) {
    if (property_get(propName, val, NULL)) {
        char *end;
        char *end;
@@ -185,8 +187,8 @@ status_t Converter::initEncoder() {


    mOutputFormat->setString("mime", outputMIME.c_str());
    mOutputFormat->setString("mime", outputMIME.c_str());


    int32_t audioBitrate = getBitrate("media.wfd.audio-bitrate", 128000);
    int32_t audioBitrate = GetInt32Property("media.wfd.audio-bitrate", 128000);
    int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000);
    int32_t videoBitrate = GetInt32Property("media.wfd.video-bitrate", 5000000);
    mPrevVideoBitrate = videoBitrate;
    mPrevVideoBitrate = videoBitrate;


    ALOGI("using audio bitrate of %d bps, video bitrate of %d bps",
    ALOGI("using audio bitrate of %d bps, video bitrate of %d bps",
@@ -622,20 +624,6 @@ status_t Converter::feedEncoderInputBuffers() {
}
}


status_t Converter::doMoreWork() {
status_t Converter::doMoreWork() {
#if 0
    if (mIsVideo) {
        int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000);
        if (videoBitrate != mPrevVideoBitrate) {
            sp<AMessage> params = new AMessage;

            params->setInt32("videoBitrate", videoBitrate);
            mEncoder->setParameters(params);

            mPrevVideoBitrate = videoBitrate;
        }
    }
#endif

    status_t err;
    status_t err;


    for (;;) {
    for (;;) {
+2 −0
Original line number Original line Diff line number Diff line
@@ -73,6 +73,8 @@ struct Converter : public AHandler {
    int32_t getVideoBitrate() const;
    int32_t getVideoBitrate() const;
    void setVideoBitrate(int32_t bitrate);
    void setVideoBitrate(int32_t bitrate);


    static int32_t GetInt32Property(const char *propName, int32_t defaultValue);

protected:
protected:
    virtual ~Converter();
    virtual ~Converter();
    virtual void onMessageReceived(const sp<AMessage> &msg);
    virtual void onMessageReceived(const sp<AMessage> &msg);
+59 −12
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@
#include "WifiDisplaySource.h"
#include "WifiDisplaySource.h"


#include <binder/IServiceManager.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <media/IHDCP.h>
#include <media/IHDCP.h>
#include <media/stagefright/foundation/ABitReader.h>
#include <media/stagefright/foundation/ABitReader.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -66,6 +67,7 @@ struct WifiDisplaySource::PlaybackSession::Track : public AHandler {
    bool isAudio() const;
    bool isAudio() const;


    const sp<Converter> &converter() const;
    const sp<Converter> &converter() const;
    const sp<RepeaterSource> &repeaterSource() const;


    ssize_t mediaSenderTrackIndex() const;
    ssize_t mediaSenderTrackIndex() const;
    void setMediaSenderTrackIndex(size_t index);
    void setMediaSenderTrackIndex(size_t index);
@@ -171,6 +173,11 @@ const sp<Converter> &WifiDisplaySource::PlaybackSession::Track::converter() cons
    return mConverter;
    return mConverter;
}
}


const sp<RepeaterSource> &
WifiDisplaySource::PlaybackSession::Track::repeaterSource() const {
    return mRepeaterSource;
}

ssize_t WifiDisplaySource::PlaybackSession::Track::mediaSenderTrackIndex() const {
ssize_t WifiDisplaySource::PlaybackSession::Track::mediaSenderTrackIndex() const {
    CHECK_GE(mMediaSenderTrackIndex, 0);
    CHECK_GE(mMediaSenderTrackIndex, 0);
    return mMediaSenderTrackIndex;
    return mMediaSenderTrackIndex;
@@ -663,23 +670,31 @@ void WifiDisplaySource::PlaybackSession::onSinkFeedback(const sp<AMessage> &msg)
    if (mVideoTrackIndex >= 0) {
    if (mVideoTrackIndex >= 0) {
        const sp<Track> &videoTrack = mTracks.valueFor(mVideoTrackIndex);
        const sp<Track> &videoTrack = mTracks.valueFor(mVideoTrackIndex);
        sp<Converter> converter = videoTrack->converter();
        sp<Converter> converter = videoTrack->converter();

        if (converter != NULL) {
        if (converter != NULL) {
            int32_t videoBitrate = converter->getVideoBitrate();
            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) {
                if (avgLatencyUs > 300000ll) {
                    videoBitrate *= 0.6;
                    videoBitrate *= 0.6;

                if (videoBitrate < 500000) {
                    videoBitrate = 500000;  // cap at 500kbit/sec
                }
                } else if (avgLatencyUs < 100000ll) {
                } else if (avgLatencyUs < 100000ll) {
                    videoBitrate *= 1.1;
                    videoBitrate *= 1.1;

                if (videoBitrate > 10000000) {
                    videoBitrate = 10000000;  // cap at 10Mbit/sec
                }
                }
            }
            }


            if (videoBitrate > 0) {
                if (videoBitrate < 500000) {
                    videoBitrate = 500000;
                } else if (videoBitrate > 10000000) {
                    videoBitrate = 10000000;
                }

                if (videoBitrate != converter->getVideoBitrate()) {
                if (videoBitrate != converter->getVideoBitrate()) {
                    ALOGI("setting video bitrate to %d bps", videoBitrate);
                    ALOGI("setting video bitrate to %d bps", videoBitrate);


@@ -687,6 +702,38 @@ void WifiDisplaySource::PlaybackSession::onSinkFeedback(const sp<AMessage> &msg)
                }
                }
            }
            }
        }
        }

        sp<RepeaterSource> repeaterSource = videoTrack->repeaterSource();
        if (repeaterSource != NULL) {
            double rateHz =
                Converter::GetInt32Property(
                        "media.wfd.video-framerate", -1);

            if (rateHz < 0.0) {
                rateHz = repeaterSource->getFrameRate();

                if (avgLatencyUs > 300000ll) {
                    rateHz *= 0.9;
                } else if (avgLatencyUs < 200000ll) {
                    rateHz *= 1.1;
                }
            }

            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);

                    repeaterSource->setFrameRate(rateHz);
                }
            }
        }
    }
}
}


status_t WifiDisplaySource::PlaybackSession::setupMediaPacketizer(
status_t WifiDisplaySource::PlaybackSession::setupMediaPacketizer(
+19 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,25 @@ RepeaterSource::~RepeaterSource() {
    CHECK(!mStarted);
    CHECK(!mStarted);
}
}


double RepeaterSource::getFrameRate() const {
    return mRateHz;
}

void RepeaterSource::setFrameRate(double rateHz) {
    Mutex::Autolock autoLock(mLock);

    if (rateHz == mRateHz) {
        return;
    }

    if (mStartTimeUs >= 0ll) {
        int64_t nextTimeUs = mStartTimeUs + (mFrameCount * 1000000ll) / mRateHz;
        mStartTimeUs = nextTimeUs;
        mFrameCount = 0;
    }
    mRateHz = rateHz;
}

status_t RepeaterSource::start(MetaData *params) {
status_t RepeaterSource::start(MetaData *params) {
    CHECK(!mStarted);
    CHECK(!mStarted);


+3 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,9 @@ struct RepeaterSource : public MediaSource {
    // send updates in a while, this is its wakeup call.
    // send updates in a while, this is its wakeup call.
    void wakeUp();
    void wakeUp();


    double getFrameRate() const;
    void setFrameRate(double rateHz);

protected:
protected:
    virtual ~RepeaterSource();
    virtual ~RepeaterSource();