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

Commit e1045960 authored by Jeff Brown's avatar Jeff Brown Committed by Andreas Huber
Browse files

Implement remote display service stubs.

Change-Id: I582ed000026bba6d116db8304e15a3c52f8a9a01
parent 6c75ad21
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ namespace android {
struct ICrypto;
class IMediaRecorder;
class IOMX;
class IRemoteDisplay;
class IRemoteDisplayClient;
struct IStreamSource;

class IMediaPlayerService: public IInterface
@@ -50,6 +52,16 @@ public:
    virtual sp<IOMX>            getOMX() = 0;
    virtual sp<ICrypto>         makeCrypto() = 0;

    // Connects to a remote display.
    // 'iface' specifies the address of the local interface on which to listen for
    // a connection from the remote display as an ip address and port number
    // of the form "x.x.x.x:y".  The media server should call back into the provided remote
    // display client when display connection, disconnection or errors occur.
    // The assumption is that at most one remote display will be connected to the
    // provided interface at a time.
    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const sp<IRemoteDisplayClient>& client,
            const String8& iface) = 0;

    // If iface == NULL, disable remote display, otherwise
    // iface should be of the form "x.x.x.x:y", i.e. ip address
    // of the local interface to bind to and the port number
+62 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_IREMOTEDISPLAY_H
#define ANDROID_IREMOTEDISPLAY_H

#include <stdint.h>
#include <sys/types.h>

#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>

namespace android {

/*
 * Represents a remote display, such as a Wifi display.
 *
 * When the remote display is created, it may not yet be connected to the
 * display.  The remote display asynchronously reports events such as successful
 * connection, disconnection and errors to an IRemoteDisplayClient interface provided by
 * the client.
 */
class IRemoteDisplay : public IInterface
{
public:
    DECLARE_META_INTERFACE(RemoteDisplay);

    // Disconnects the remote display.
    // The remote display should respond back to the IRemoteDisplayClient with an
    // onDisplayDisconnected() event when the disconnection is complete.
    virtual status_t disconnect() = 0;
};


// ----------------------------------------------------------------------------

class BnRemoteDisplay : public BnInterface<IRemoteDisplay>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

}; // namespace android

#endif // ANDROID_IREMOTEDISPLAY_H
+80 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_IREMOTEDISPLAYCLIENT_H
#define ANDROID_IREMOTEDISPLAYCLIENT_H

#include <stdint.h>
#include <sys/types.h>

#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>

namespace android {

class ISurfaceTexture;

class IRemoteDisplayClient : public IInterface
{
public:
    DECLARE_META_INTERFACE(RemoteDisplayClient);

    enum {
        // Flag: The remote display is using a secure transport protocol such as HDCP.
        kDisplayFlagSecure = 1 << 0,
    };

    enum {
        // Error: An unknown / generic error occurred.
        kErrorUnknown = 0,
        // Error: The connection was dropped unexpectedly.
        kErrorConnectionDropped = 1,
    };

    // Indicates that the remote display has been connected successfully.
    // Provides a surface texture that the client should use to stream buffers to
    // the remote display.
    virtual void onDisplayConnected(const sp<ISurfaceTexture>& surfaceTexture,
            uint32_t width, uint32_t height, uint32_t flags) = 0; // one-way

    // Indicates that the remote display has been disconnected normally.
    // This method should only be called once the client has called 'disconnect()'.
    // It is currently an error for the display to disconnect for any other reason.
    virtual void onDisplayDisconnected() = 0; // one-way

    // Indicates that a connection could not be established to the remote display
    // or an unrecoverable error occurred and the connection was severed.
    // The media server should continue listening for connection attempts from the
    // remote display.
    virtual void onDisplayError(int32_t error) = 0; // one-way
};


// ----------------------------------------------------------------------------

class BnRemoteDisplayClient : public BnInterface<IRemoteDisplayClient>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

}; // namespace android

#endif // ANDROID_IREMOTEDISPLAYCLIENT_H
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ LOCAL_SRC_FILES:= \
    IMediaRecorderClient.cpp \
    IMediaPlayer.cpp \
    IMediaRecorder.cpp \
    IRemoteDisplay.cpp \
    IRemoteDisplayClient.cpp \
    IStreamSource.cpp \
    Metadata.cpp \
    mediarecorder.cpp \
+25 −1
Original line number Diff line number Diff line
@@ -24,9 +24,12 @@
#include <media/IMediaPlayerService.h>
#include <media/IMediaRecorder.h>
#include <media/IOMX.h>
#include <media/IRemoteDisplay.h>
#include <media/IRemoteDisplayClient.h>
#include <media/IStreamSource.h>

#include <utils/Errors.h>  // for status_t
#include <utils/String8.h>

namespace android {

@@ -40,7 +43,8 @@ enum {
    MAKE_CRYPTO,
    ENABLE_REMOTE_DISPLAY,
    ADD_BATTERY_DATA,
    PULL_BATTERY_DATA
    PULL_BATTERY_DATA,
    LISTEN_FOR_REMOTE_DISPLAY,
};

class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
@@ -148,6 +152,17 @@ public:
        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
        return remote()->transact(PULL_BATTERY_DATA, data, reply);
    }

    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const sp<IRemoteDisplayClient>& client,
            const String8& iface)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
        data.writeStrongBinder(client->asBinder());
        data.writeString8(iface);
        remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
        return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
    }
};

IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
@@ -242,6 +257,15 @@ status_t BnMediaPlayerService::onTransact(
            pullBatteryData(reply);
            return NO_ERROR;
        } break;
        case LISTEN_FOR_REMOTE_DISPLAY: {
            CHECK_INTERFACE(IMediaPlayerService, data, reply);
            sp<IRemoteDisplayClient> client(
                    interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
            String8 iface(data.readString8());
            sp<IRemoteDisplay> display(listenForRemoteDisplay(client, iface));
            reply->writeStrongBinder(display->asBinder());
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
Loading