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

Commit 4fc3e841 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

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

parents 6386b50b eaf5381f
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();