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

Commit 9e0c2513 authored by hkuang's avatar hkuang Committed by Hangyu Kuang
Browse files

transcoding: Add forClientUid in TranscodingRequest.

This is used to let MediaProvider could specify the request is
on behalf of which client.

CTS-Coverage-Bug: 168990206

Bug: 154733526
Test: Unit test.
Change-Id: Id1a2c4cccff12dd1d979fa9350120e2ddad9ff5b
parent f1897983
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -4396,6 +4396,8 @@ package android.media {
  }
  public static final class MediaTranscodeManager.TranscodingRequest {
    method public int getClientPid();
    method public int getClientUid();
    method @NonNull public android.net.Uri getDestinationUri();
    method public int getPriority();
    method @NonNull public android.net.Uri getSourceUri();
@@ -4406,6 +4408,8 @@ package android.media {
  public static final class MediaTranscodeManager.TranscodingRequest.Builder {
    ctor public MediaTranscodeManager.TranscodingRequest.Builder();
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest build();
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientPid(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientUid(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setDestinationUri(@NonNull android.net.Uri);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setPriority(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setSourceUri(@NonNull android.net.Uri);
+4 −0
Original line number Diff line number Diff line
@@ -1850,6 +1850,8 @@ package android.media {
  }

  public static final class MediaTranscodeManager.TranscodingRequest {
    method public int getClientPid();
    method public int getClientUid();
    method @NonNull public android.net.Uri getDestinationUri();
    method public int getPriority();
    method @NonNull public android.net.Uri getSourceUri();
@@ -1860,6 +1862,8 @@ package android.media {
  public static final class MediaTranscodeManager.TranscodingRequest.Builder {
    ctor public MediaTranscodeManager.TranscodingRequest.Builder();
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest build();
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientPid(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientUid(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setDestinationUri(@NonNull android.net.Uri);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setPriority(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setSourceUri(@NonNull android.net.Uri);
+71 −7
Original line number Diff line number Diff line
@@ -490,6 +490,20 @@ public final class MediaTranscodeManager {
        /** Uri of the destination media file. */
        private @NonNull Uri mDestinationUri;

        /**
         *  The UID of the client that the TranscodingRequest is for. Only privileged caller could
         *  set this Uid as only they could do the transcoding on behalf of the client.
         *  -1 means not available.
         */
        private int mClientUid = -1;

        /**
         *  The Pid of the client that the TranscodingRequest is for. Only privileged caller could
         *  set this Uid as only they could do the transcoding on behalf of the client.
         *  -1 means not available.
         */
        private int mClientPid = -1;

        /** Type of the transcoding. */
        private @TranscodingType int mType = TRANSCODING_TYPE_UNKNOWN;

@@ -526,6 +540,8 @@ public final class MediaTranscodeManager {
        private TranscodingRequest(Builder b) {
            mSourceUri = b.mSourceUri;
            mDestinationUri = b.mDestinationUri;
            mClientUid = b.mClientUid;
            mClientPid = b.mClientPid;
            mPriority = b.mPriority;
            mType = b.mType;
            mVideoTrackFormat = b.mVideoTrackFormat;
@@ -546,6 +562,16 @@ public final class MediaTranscodeManager {
            return mSourceUri;
        }

        /** Return the UID of the client that this request is for. -1 means not available. */
        public int getClientUid() {
            return mClientUid;
        }

        /** Return the PID of the client that this request is for. -1 means not available. */
        public int getClientPid() {
            return mClientPid;
        }

        /** Return destination uri of the transcoding. */
        @NonNull
        public Uri getDestinationUri() {
@@ -584,6 +610,8 @@ public final class MediaTranscodeManager {
            parcel.transcodingType = mType;
            parcel.sourceFilePath = mSourceUri.toString();
            parcel.destinationFilePath = mDestinationUri.toString();
            parcel.clientUid = mClientUid;
            parcel.clientPid = mClientPid;
            parcel.requestedVideoTrackFormat = convertToVideoTrackFormat(mVideoTrackFormat);
            if (mTestConfig != null) {
                parcel.isForTesting = true;
@@ -659,6 +687,8 @@ public final class MediaTranscodeManager {
        public static final class Builder {
            private @NonNull Uri mSourceUri;
            private @NonNull Uri mDestinationUri;
            private int mClientUid = -1;
            private int mClientPid = -1;
            private @TranscodingType int mType = TRANSCODING_TYPE_UNKNOWN;
            private @TranscodingPriority int mPriority = PRIORITY_UNKNOWN;
            private @Nullable MediaFormat mVideoTrackFormat;
@@ -701,6 +731,38 @@ public final class MediaTranscodeManager {
                return this;
            }

            /**
             * Specify the UID of the client that this request is for.
             * @param uid client Uid.
             * @return The same builder instance.
             * @throws IllegalArgumentException if uid is invalid.
             * TODO(hkuang): Check the permission if it is allowed.
             */
            @NonNull
            public Builder setClientUid(int uid) {
                if (uid <= 0) {
                    throw new IllegalArgumentException("Invalid Uid");
                }
                mClientUid = uid;
                return this;
            }

            /**
             * Specify the PID of the client that this request is for.
             * @param pid client Pid.
             * @return The same builder instance.
             * @throws IllegalArgumentException if pid is invalid.
             * TODO(hkuang): Check the permission if it is allowed.
             */
            @NonNull
            public Builder setClientPid(int pid) {
                if (pid <= 0) {
                    throw new IllegalArgumentException("Invalid pid");
                }
                mClientPid = pid;
                return this;
            }

            /**
             * Specifies the priority of the transcoding.
             *
@@ -1200,6 +1262,8 @@ public final class MediaTranscodeManager {
        // Converts the request to TranscodingRequestParcel.
        TranscodingRequestParcel requestParcel = transcodingRequest.writeToParcel();

        Log.i(TAG, "Getting transcoding request " + transcodingRequest.getSourceUri());

        // Submits the request to MediaTranscoding service.
        try {
            TranscodingJobParcel jobParcel = new TranscodingJobParcel();
+44 −0
Original line number Diff line number Diff line
@@ -202,6 +202,42 @@ public class MediaTranscodeManagerTest
        });
    }

    /**
     * Verify that setting invalid pid will throw exception.
     */
    @Test
    public void testCreateTranscodingWithInvalidClientPid() throws Exception {
        assertThrows(IllegalArgumentException.class, () -> {
            TranscodingRequest request =
                    new TranscodingRequest.Builder()
                            .setSourceUri(mSourceHEVCVideoUri)
                            .setDestinationUri(mDestinationUri)
                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
                            .setClientPid(-1)
                            .setVideoTrackFormat(createMediaFormat())
                            .build();
        });
    }

    /**
     * Verify that setting invalid uid will throw exception.
     */
    @Test
    public void testCreateTranscodingWithInvalidClientUid() throws Exception {
        assertThrows(IllegalArgumentException.class, () -> {
            TranscodingRequest request =
                    new TranscodingRequest.Builder()
                            .setSourceUri(mSourceHEVCVideoUri)
                            .setDestinationUri(mDestinationUri)
                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
                            .setClientUid(-1)
                            .setVideoTrackFormat(createMediaFormat())
                            .build();
        });
    }

    /**
     * Verify that setting null source uri will throw exception.
     */
@@ -425,16 +461,24 @@ public class MediaTranscodeManagerTest
        MediaFormat videoTrackFormat = resolver.resolveVideoFormat();
        assertNotNull(videoTrackFormat);

        int pid = android.os.Process.myPid();
        int uid = android.os.Process.myUid();

        TranscodingRequest request =
                new TranscodingRequest.Builder()
                        .setSourceUri(mSourceHEVCVideoUri)
                        .setDestinationUri(destinationUri)
                        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
                        .setClientPid(pid)
                        .setClientUid(uid)
                        .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
                        .setVideoTrackFormat(videoTrackFormat)
                        .build();
        Executor listenerExecutor = Executors.newSingleThreadExecutor();

        assertEquals(pid, request.getClientPid());
        assertEquals(uid, request.getClientUid());

        Log.i(TAG, "transcoding to " + videoTrackFormat);

        TranscodingJob job = mMediaTranscodeManager.enqueueRequest(request, listenerExecutor,
+4 −0
Original line number Diff line number Diff line
@@ -4336,6 +4336,8 @@ package android.media {
  }
  public static final class MediaTranscodeManager.TranscodingRequest {
    method public int getClientPid();
    method public int getClientUid();
    method @NonNull public android.net.Uri getDestinationUri();
    method public int getPriority();
    method @NonNull public android.net.Uri getSourceUri();
@@ -4346,6 +4348,8 @@ package android.media {
  public static final class MediaTranscodeManager.TranscodingRequest.Builder {
    ctor public MediaTranscodeManager.TranscodingRequest.Builder();
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest build();
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientPid(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientUid(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setDestinationUri(@NonNull android.net.Uri);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setPriority(int);
    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setSourceUri(@NonNull android.net.Uri);