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

Commit 0b73d473 authored by Andreas Huber's avatar Andreas Huber
Browse files

Expose an IRemoteDisplay to trigger wifi display connections setup and feedback.

Change-Id: I7602cda0e38073c9f0e63fa4de238ca0d4b4ce8e
parent e1045960
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -283,8 +283,7 @@ sp<ICrypto> MediaPlayerService::makeCrypto() {

sp<IRemoteDisplay> MediaPlayerService::listenForRemoteDisplay(
        const sp<IRemoteDisplayClient>& client, const String8& iface) {
    // TODO: implement me!
    return NULL;
    return new RemoteDisplay(client, iface.string());;
}

status_t MediaPlayerService::enableRemoteDisplay(const char *iface) {
@@ -295,20 +294,12 @@ status_t MediaPlayerService::enableRemoteDisplay(const char *iface) {
            return INVALID_OPERATION;
        }

        mRemoteDisplay = new RemoteDisplay;

        status_t err = mRemoteDisplay->start(iface);

        if (err != OK) {
            mRemoteDisplay.clear();
            return err;
        }

        mRemoteDisplay = new RemoteDisplay(NULL /* client */, iface);
        return OK;
    }

    if (mRemoteDisplay != NULL) {
        mRemoteDisplay->stop();
        mRemoteDisplay->disconnect();
        mRemoteDisplay.clear();
    }

+9 −12
Original line number Diff line number Diff line
@@ -19,29 +19,27 @@
#include "ANetworkSession.h"
#include "source/WifiDisplaySource.h"

#include <media/IRemoteDisplayClient.h>

namespace android {

RemoteDisplay::RemoteDisplay()
    : mInitCheck(NO_INIT),
      mLooper(new ALooper),
RemoteDisplay::RemoteDisplay(
        const sp<IRemoteDisplayClient> &client, const char *iface)
    : mLooper(new ALooper),
      mNetSession(new ANetworkSession),
      mSource(new WifiDisplaySource(mNetSession)) {
      mSource(new WifiDisplaySource(mNetSession, client)) {
    mLooper->registerHandler(mSource);
}

RemoteDisplay::~RemoteDisplay() {
}

status_t RemoteDisplay::start(const char *iface) {
    mNetSession->start();
    mLooper->start();

    mSource->start(iface);
}

    return OK;
RemoteDisplay::~RemoteDisplay() {
}

status_t RemoteDisplay::stop() {
status_t RemoteDisplay::disconnect() {
    mSource->stop();

    mLooper->stop();
@@ -51,4 +49,3 @@ status_t RemoteDisplay::stop() {
}

}  // namespace android
+5 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#define REMOTE_DISPLAY_H_

#include <media/IRemoteDisplay.h>
#include <media/stagefright/foundation/ABase.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
@@ -26,20 +27,18 @@ namespace android {

struct ALooper;
struct ANetworkSession;
struct IRemoteDisplayClient;
struct WifiDisplaySource;

struct RemoteDisplay : public RefBase {
    RemoteDisplay();
struct RemoteDisplay : public BnRemoteDisplay {
    RemoteDisplay(const sp<IRemoteDisplayClient> &client, const char *iface);

    status_t start(const char *iface);
    status_t stop();
    virtual status_t disconnect();

protected:
    virtual ~RemoteDisplay();

private:
    status_t mInitCheck;

    sp<ALooper> mNetLooper;
    sp<ALooper> mLooper;
    sp<ANetworkSession> mNetSession;
+29 −9
Original line number Diff line number Diff line
@@ -113,9 +113,11 @@ void WifiDisplaySource::PlaybackSession::Track::setPacketizerTrackIndex(size_t i

WifiDisplaySource::PlaybackSession::PlaybackSession(
        const sp<ANetworkSession> &netSession,
        const sp<AMessage> &notify)
        const sp<AMessage> &notify,
        bool legacyMode)
    : mNetSession(netSession),
      mNotify(notify),
      mLegacyMode(legacyMode),
      mLastLifesignUs(),
      mTSQueue(new ABuffer(12 + kMaxNumTSPacketsPerRTPPacket * 188)),
      mPrevTimeUs(-1ll),
@@ -240,11 +242,6 @@ WifiDisplaySource::PlaybackSession::~PlaybackSession() {

    mPacketizer.clear();

    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> binder = sm->getService(String16("SurfaceFlinger"));
    sp<ISurfaceComposer> service = interface_cast<ISurfaceComposer>(binder);
    CHECK(service != NULL);

    if (mSerializer != NULL) {
        mSerializer->stop();

@@ -257,7 +254,14 @@ WifiDisplaySource::PlaybackSession::~PlaybackSession() {
        mSerializerLooper.clear();
    }

    if (mLegacyMode) {
        sp<IServiceManager> sm = defaultServiceManager();
        sp<IBinder> binder = sm->getService(String16("SurfaceFlinger"));
        sp<ISurfaceComposer> service = interface_cast<ISurfaceComposer>(binder);
        CHECK(service != NULL);

        service->connectDisplay(NULL);
    }

    if (mRTCPSessionID != 0) {
        mNetSession->destroySession(mRTCPSessionID);
@@ -598,7 +602,7 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
    SurfaceComposerClient::getDisplayInfo(0, &info);

    // sp<SurfaceMediaSource> source = new SurfaceMediaSource(info.w, info.h);
    sp<SurfaceMediaSource> source = new SurfaceMediaSource(720, 1280);
    sp<SurfaceMediaSource> source = new SurfaceMediaSource(width(), height());

#if 0
    ssize_t index = mSerializer->addSource(source);
@@ -641,7 +645,11 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
    err = source->setMaxAcquiredBufferCount(numInputBuffers + 1);
    CHECK_EQ(err, (status_t)OK);

    service->connectDisplay(source->getBufferQueue());
    mBufferQueue = source->getBufferQueue();

    if (mLegacyMode) {
        service->connectDisplay(mBufferQueue);
    }
#endif

#if 0
@@ -673,6 +681,18 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
    return OK;
}

sp<ISurfaceTexture> WifiDisplaySource::PlaybackSession::getSurfaceTexture() {
    return mBufferQueue;
}

int32_t WifiDisplaySource::PlaybackSession::width() const {
    return 720;
}

int32_t WifiDisplaySource::PlaybackSession::height() const {
    return 1280;
}

void WifiDisplaySource::PlaybackSession::scheduleSendSR() {
    if (mSendSRPending) {
        return;
+11 −1
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
namespace android {

struct ABuffer;
struct BufferQueue;
struct ISurfaceTexture;
struct Serializer;
struct TSPacketizer;

@@ -32,7 +34,9 @@ struct TSPacketizer;
// display.
struct WifiDisplaySource::PlaybackSession : public AHandler {
    PlaybackSession(
            const sp<ANetworkSession> &netSession, const sp<AMessage> &notify);
            const sp<ANetworkSession> &netSession,
            const sp<AMessage> &notify,
            bool legacyMode);

    status_t init(
            const char *clientIP, int32_t clientRtp, int32_t clientRtcp,
@@ -46,6 +50,10 @@ struct WifiDisplaySource::PlaybackSession : public AHandler {
    status_t play();
    status_t pause();

    sp<ISurfaceTexture> getSurfaceTexture();
    int32_t width() const;
    int32_t height() const;

    enum {
        kWhatSessionDead,
        kWhatBinaryData,
@@ -73,6 +81,7 @@ private:

    sp<ANetworkSession> mNetSession;
    sp<AMessage> mNotify;
    bool mLegacyMode;

    int64_t mLastLifesignUs;

@@ -80,6 +89,7 @@ private:
    sp<Serializer> mSerializer;
    sp<TSPacketizer> mPacketizer;
    sp<ALooper> mCodecLooper;
    sp<BufferQueue> mBufferQueue;

    KeyedVector<size_t, sp<Track> > mTracks;

Loading