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

Commit 9b80c2bd authored by Andreas Huber's avatar Andreas Huber
Browse files

Charge network traffic to the uid of the process using the MediaPlayer.

Change-Id: I2bcb54b8232afd3fc7ee16289f37c7a7b3f23067
related-to-bug: 4517282
parent cebcdaef
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -103,6 +103,10 @@ public:
    virtual status_t    initCheck() = 0;
    virtual status_t    initCheck() = 0;
    virtual bool        hardwareOutput() = 0;
    virtual bool        hardwareOutput() = 0;


    virtual status_t    setUID(uid_t uid) {
        return INVALID_OPERATION;
    }

    virtual status_t    setDataSource(
    virtual status_t    setDataSource(
            const char *url,
            const char *url,
            const KeyedVector<String8, String8> *headers = NULL) = 0;
            const KeyedVector<String8, String8> *headers = NULL) = 0;
+22 −5
Original line number Original line Diff line number Diff line
@@ -250,7 +250,11 @@ sp<IMediaPlayer> MediaPlayerService::create(
        const KeyedVector<String8, String8> *headers, int audioSessionId)
        const KeyedVector<String8, String8> *headers, int audioSessionId)
{
{
    int32_t connId = android_atomic_inc(&mNextConnId);
    int32_t connId = android_atomic_inc(&mNextConnId);
    sp<Client> c = new Client(this, pid, connId, client, audioSessionId);

    sp<Client> c = new Client(
            this, pid, connId, client, audioSessionId,
            IPCThreadState::self()->getCallingUid());

    LOGV("Create new client(%d) from pid %d, url=%s, connId=%d, audioSessionId=%d",
    LOGV("Create new client(%d) from pid %d, url=%s, connId=%d, audioSessionId=%d",
            connId, pid, url, connId, audioSessionId);
            connId, pid, url, connId, audioSessionId);
    if (NO_ERROR != c->setDataSource(url, headers))
    if (NO_ERROR != c->setDataSource(url, headers))
@@ -268,7 +272,11 @@ sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClie
        int fd, int64_t offset, int64_t length, int audioSessionId)
        int fd, int64_t offset, int64_t length, int audioSessionId)
{
{
    int32_t connId = android_atomic_inc(&mNextConnId);
    int32_t connId = android_atomic_inc(&mNextConnId);
    sp<Client> c = new Client(this, pid, connId, client, audioSessionId);

    sp<Client> c = new Client(
            this, pid, connId, client, audioSessionId,
            IPCThreadState::self()->getCallingUid());

    LOGV("Create new client(%d) from pid %d, fd=%d, offset=%lld, length=%lld, audioSessionId=%d",
    LOGV("Create new client(%d) from pid %d, fd=%d, offset=%lld, length=%lld, audioSessionId=%d",
            connId, pid, fd, offset, length, audioSessionId);
            connId, pid, fd, offset, length, audioSessionId);
    if (NO_ERROR != c->setDataSource(fd, offset, length)) {
    if (NO_ERROR != c->setDataSource(fd, offset, length)) {
@@ -286,7 +294,10 @@ sp<IMediaPlayer> MediaPlayerService::create(
        pid_t pid, const sp<IMediaPlayerClient> &client,
        pid_t pid, const sp<IMediaPlayerClient> &client,
        const sp<IStreamSource> &source, int audioSessionId) {
        const sp<IStreamSource> &source, int audioSessionId) {
    int32_t connId = android_atomic_inc(&mNextConnId);
    int32_t connId = android_atomic_inc(&mNextConnId);
    sp<Client> c = new Client(this, pid, connId, client, audioSessionId);

    sp<Client> c = new Client(
            this, pid, connId, client, audioSessionId,
            IPCThreadState::self()->getCallingUid());


    LOGV("Create new client(%d) from pid %d, audioSessionId=%d",
    LOGV("Create new client(%d) from pid %d, audioSessionId=%d",
         connId, pid, audioSessionId);
         connId, pid, audioSessionId);
@@ -496,8 +507,10 @@ void MediaPlayerService::removeClient(wp<Client> client)
    mClients.remove(client);
    mClients.remove(client);
}
}


MediaPlayerService::Client::Client(const sp<MediaPlayerService>& service, pid_t pid,
MediaPlayerService::Client::Client(
        int32_t connId, const sp<IMediaPlayerClient>& client, int audioSessionId)
        const sp<MediaPlayerService>& service, pid_t pid,
        int32_t connId, const sp<IMediaPlayerClient>& client,
        int audioSessionId, uid_t uid)
{
{
    LOGV("Client(%d) constructor", connId);
    LOGV("Client(%d) constructor", connId);
    mPid = pid;
    mPid = pid;
@@ -507,6 +520,7 @@ MediaPlayerService::Client::Client(const sp<MediaPlayerService>& service, pid_t
    mLoop = false;
    mLoop = false;
    mStatus = NO_INIT;
    mStatus = NO_INIT;
    mAudioSessionId = audioSessionId;
    mAudioSessionId = audioSessionId;
    mUID = uid;


#if CALLBACK_ANTAGONIZER
#if CALLBACK_ANTAGONIZER
    LOGD("create Antagonizer");
    LOGD("create Antagonizer");
@@ -671,6 +685,9 @@ sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerT
    if (p == NULL) {
    if (p == NULL) {
        p = android::createPlayer(playerType, this, notify);
        p = android::createPlayer(playerType, this, notify);
    }
    }

    p->setUID(mUID);

    return p;
    return p;
}
}


+3 −1
Original line number Original line Diff line number Diff line
@@ -306,7 +306,8 @@ private:
                                        pid_t pid,
                                        pid_t pid,
                                        int32_t connId,
                                        int32_t connId,
                                        const sp<IMediaPlayerClient>& client,
                                        const sp<IMediaPlayerClient>& client,
                                        int audioSessionId);
                                        int audioSessionId,
                                        uid_t uid);
                                Client();
                                Client();
        virtual                 ~Client();
        virtual                 ~Client();


@@ -336,6 +337,7 @@ private:
                    bool                        mLoop;
                    bool                        mLoop;
                    int32_t                     mConnId;
                    int32_t                     mConnId;
                    int                         mAudioSessionId;
                    int                         mAudioSessionId;
                    uid_t                       mUID;


        // Metadata filters.
        // Metadata filters.
        media::Metadata::Filter mMetadataAllow;  // protected by mLock
        media::Metadata::Filter mMetadataAllow;  // protected by mLock
+6 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,12 @@ status_t StagefrightPlayer::initCheck() {
    return OK;
    return OK;
}
}


status_t StagefrightPlayer::setUID(uid_t uid) {
    mPlayer->setUID(uid);

    return OK;
}

status_t StagefrightPlayer::setDataSource(
status_t StagefrightPlayer::setDataSource(
        const char *url, const KeyedVector<String8, String8> *headers) {
        const char *url, const KeyedVector<String8, String8> *headers) {
    return mPlayer->setDataSource(url, headers);
    return mPlayer->setDataSource(url, headers);
+2 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,8 @@ public:


    virtual status_t initCheck();
    virtual status_t initCheck();


    virtual status_t setUID(uid_t uid);

    virtual status_t setDataSource(
    virtual status_t setDataSource(
            const char *url, const KeyedVector<String8, String8> *headers);
            const char *url, const KeyedVector<String8, String8> *headers);


Loading