MediaMuxer: throw exception if create() fails for muxer

This patch also updates the documentation for MediaMuxer()

Bug: 146417874
Test: atest CtsMediaV2TestCases:MuxerTest
Test: atest CtsMediaV2TestCases:MuxerUnitTest
Test: CtsMediaMuxerTestCases

Change-Id: Ia07a7e6864d6c27476b960069a6f4e8ac0de8255
diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java
index b8e7930e..ad4feec 100644
--- a/media/java/android/media/MediaMuxer.java
+++ b/media/java/android/media/MediaMuxer.java
@@ -335,13 +335,13 @@
     }
 
     /**
-     * Constructor.
      * Creates a media muxer that writes to the specified path.
+     * <p>The caller must not use the file {@code path} before calling {@link #stop}.
      * @param path The path of the output media file.
      * @param format The format of the output media file.
      * @see android.media.MediaMuxer.OutputFormat
      * @throws IllegalArgumentException if path is invalid or format is not supported.
-     * @throws IOException if failed to open the file for write.
+     * @throws IOException if an error occurs while opening or creating the output file.
      */
     public MediaMuxer(@NonNull String path, @Format int format) throws IOException {
         if (path == null) {
@@ -363,16 +363,19 @@
     }
 
     /**
-     * Constructor.
-     * Creates a media muxer that writes to the specified FileDescriptor. File descriptor
-     * must be seekable and writable. Application should not use the file referenced
-     * by this file descriptor until {@link #stop}. It is the application's responsibility
-     * to close the file descriptor. It is safe to do so as soon as this call returns.
-     * @param fd The FileDescriptor of the output media file.
+     * Creates a media muxer that writes to the specified FileDescriptor.
+     * <p>The caller must not use the file referenced by the specified {@code fd} before calling
+     * {@link #stop}.
+     * <p>It is the caller's responsibility to close the file descriptor, which is safe to do so
+     * as soon as this call returns.
+     * @param fd The FileDescriptor of the output media file. If {@code format} is
+     * {@link OutputFormat#MUXER_OUTPUT_WEBM}, {@code fd} must be open in read-write mode.
+     * Otherwise, write mode is sufficient, but read-write is also accepted.
      * @param format The format of the output media file.
      * @see android.media.MediaMuxer.OutputFormat
-     * @throws IllegalArgumentException if fd is invalid or format is not supported.
-     * @throws IOException if failed to open the file for write.
+     * @throws IllegalArgumentException if {@code format} is not supported, or if {@code fd} is
+     * not open in the expected mode.
+     * @throws IOException if an error occurs while performing an IO operation.
      */
     public MediaMuxer(@NonNull FileDescriptor fd, @Format int format) throws IOException {
         setUpMediaMuxer(fd, format);
diff --git a/media/jni/android_media_MediaMuxer.cpp b/media/jni/android_media_MediaMuxer.cpp
index 2679176..b664325 100644
--- a/media/jni/android_media_MediaMuxer.cpp
+++ b/media/jni/android_media_MediaMuxer.cpp
@@ -165,7 +165,11 @@
 
     MediaMuxer::OutputFormat fileFormat =
         static_cast<MediaMuxer::OutputFormat>(format);
-    sp<MediaMuxer> muxer = new MediaMuxer(fd, fileFormat);
+    sp<MediaMuxer> muxer = MediaMuxer::create(fd, fileFormat);
+    if (muxer == nullptr) {
+        jniThrowException(env, "java/lang/IllegalArgumentException", "Muxer creation failed");
+        return 0;
+    }
     muxer->incStrong(clazz);
     return reinterpret_cast<jlong>(muxer.get());
 }