From 520ae3e8d37b9950144e12e14dd988fab77dcf57 Mon Sep 17 00:00:00 2001 From: Mudar Noufal Date: Sat, 16 May 2020 11:38:57 -0400 Subject: [PATCH] DataSink, added fileDescriptor support --- .../otaliastudios/transcoder/Transcoder.java | 16 ++++++++++++++++ .../transcoder/TranscoderOptions.java | 7 +++++++ .../transcoder/sink/DefaultDataSink.java | 17 +++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/lib/src/main/java/com/otaliastudios/transcoder/Transcoder.java b/lib/src/main/java/com/otaliastudios/transcoder/Transcoder.java index 91618d62..840f3086 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/Transcoder.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/Transcoder.java @@ -15,6 +15,7 @@ */ package com.otaliastudios.transcoder; +import android.os.Build; import android.os.Handler; import com.otaliastudios.transcoder.engine.Engine; @@ -24,6 +25,7 @@ import com.otaliastudios.transcoder.validator.Validator; import com.otaliastudios.transcoder.internal.ValidatorException; +import java.io.FileDescriptor; import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; @@ -33,6 +35,7 @@ import java.util.concurrent.atomic.AtomicInteger; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; public class Transcoder { private static final String TAG = Transcoder.class.getSimpleName(); @@ -99,6 +102,19 @@ public static TranscoderOptions.Builder into(@NonNull String outPath) { return new TranscoderOptions.Builder(outPath); } + /** + * Starts building transcoder options. + * Requires a non null fileDescriptor to the output file or stream + * + * @param fileDescriptor descriptor of the output file or stream + * @return an options builder + */ + @RequiresApi(api = Build.VERSION_CODES.O) + @NonNull + public static TranscoderOptions.Builder into(@NonNull FileDescriptor fileDescriptor) { + return new TranscoderOptions.Builder(fileDescriptor); + } + /** * Starts building transcoder options. * Requires a non null sink. diff --git a/lib/src/main/java/com/otaliastudios/transcoder/TranscoderOptions.java b/lib/src/main/java/com/otaliastudios/transcoder/TranscoderOptions.java index 81c12a4d..8b54ed4c 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/TranscoderOptions.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/TranscoderOptions.java @@ -2,6 +2,7 @@ import android.content.Context; import android.net.Uri; +import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -33,6 +34,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; /** * Collects transcoding options consumed by {@link Transcoder}. @@ -122,6 +124,11 @@ public static class Builder { this.dataSink = new DefaultDataSink(outPath); } + @RequiresApi(api = Build.VERSION_CODES.O) + Builder(@NonNull FileDescriptor fileDescriptor) { + this.dataSink = new DefaultDataSink(fileDescriptor); + } + Builder(@NonNull DataSink dataSink) { this.dataSink = dataSink; } diff --git a/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java b/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java index a2c86305..07a0e1bc 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java @@ -6,12 +6,14 @@ import android.os.Build; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import com.otaliastudios.transcoder.engine.TrackStatus; import com.otaliastudios.transcoder.engine.TrackType; import com.otaliastudios.transcoder.internal.TrackTypeMap; import com.otaliastudios.transcoder.internal.Logger; +import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -74,6 +76,21 @@ public DefaultDataSink(@NonNull String outputFilePath, int format) { } } + @RequiresApi(api = Build.VERSION_CODES.O) + public DefaultDataSink(@NonNull FileDescriptor fileDescriptor) { + this(fileDescriptor, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + @SuppressWarnings("WeakerAccess") + public DefaultDataSink(@NonNull FileDescriptor fileDescriptor, int format) { + try { + mMuxer = new MediaMuxer(fileDescriptor, format); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @Override public void setOrientation(int rotation) { mMuxer.setOrientationHint(rotation);