diff --git a/api/system-current.txt b/api/system-current.txt index b8fa299b01eb7..3a7a01d0c0b45 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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); diff --git a/api/test-current.txt b/api/test-current.txt index d57269e48e645..49c1e4101e6e0 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -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); diff --git a/media/java/android/media/MediaTranscodeManager.java b/media/java/android/media/MediaTranscodeManager.java index 451677f6a8bcb..5f1d69a2742a9 100644 --- a/media/java/android/media/MediaTranscodeManager.java +++ b/media/java/android/media/MediaTranscodeManager.java @@ -83,13 +83,13 @@ import java.util.concurrent.Executors;
  TranscodingRequest request =
-     new TranscodingRequest.Builder()
-         .setSourceUri(srcUri)
-         .setDestinationUri(dstUri)
-         .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-         .setPriority(REALTIME)
-         .setVideoTrackFormat(videoFormat)
-         .build();
+    new TranscodingRequest.Builder()
+        .setSourceUri(srcUri)
+        .setDestinationUri(dstUri)
+        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
+        .setPriority(REALTIME)
+        .setVideoTrackFormat(videoFormat)
+        .build();
  }
TODO(hkuang): Add architecture diagram showing the transcoding service and api. @@ -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(); diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java index 33d6d64c7f371..21ed840c7313a 100644 --- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java +++ b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java @@ -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, diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 38f745e95d223..991758f7c73f6 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -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);