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 Original line Diff line number Diff line
@@ -283,8 +283,7 @@ sp<ICrypto> MediaPlayerService::makeCrypto() {


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


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


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

        status_t err = mRemoteDisplay->start(iface);

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

        return OK;
        return OK;
    }
    }


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


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


#include <media/IRemoteDisplayClient.h>

namespace android {
namespace android {


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

RemoteDisplay::~RemoteDisplay() {
}


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


    mSource->start(iface);
    mSource->start(iface);
}


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


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


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


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


#define REMOTE_DISPLAY_H_
#define REMOTE_DISPLAY_H_


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


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


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


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


protected:
protected:
    virtual ~RemoteDisplay();
    virtual ~RemoteDisplay();


private:
private:
    status_t mInitCheck;

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


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


    mPacketizer.clear();
    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) {
    if (mSerializer != NULL) {
        mSerializer->stop();
        mSerializer->stop();


@@ -257,7 +254,14 @@ WifiDisplaySource::PlaybackSession::~PlaybackSession() {
        mSerializerLooper.clear();
        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);
        service->connectDisplay(NULL);
    }


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


    // sp<SurfaceMediaSource> source = new SurfaceMediaSource(info.w, info.h);
    // 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
#if 0
    ssize_t index = mSerializer->addSource(source);
    ssize_t index = mSerializer->addSource(source);
@@ -641,7 +645,11 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
    err = source->setMaxAcquiredBufferCount(numInputBuffers + 1);
    err = source->setMaxAcquiredBufferCount(numInputBuffers + 1);
    CHECK_EQ(err, (status_t)OK);
    CHECK_EQ(err, (status_t)OK);


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

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


#if 0
#if 0
@@ -673,6 +681,18 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
    return OK;
    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() {
void WifiDisplaySource::PlaybackSession::scheduleSendSR() {
    if (mSendSRPending) {
    if (mSendSRPending) {
        return;
        return;
+11 −1
Original line number Original line Diff line number Diff line
@@ -23,6 +23,8 @@
namespace android {
namespace android {


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


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


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


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

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


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


    int64_t mLastLifesignUs;
    int64_t mLastLifesignUs;


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


    KeyedVector<size_t, sp<Track> > mTracks;
    KeyedVector<size_t, sp<Track> > mTracks;


Loading