Generalize media input for use with Audio.

master
Alan Evans 2020-05-11 10:40:59 -03:00 committed by Alex Hart
parent 5937a50b6d
commit 3db5da1c8d
9 changed files with 43 additions and 38 deletions

View File

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.video;
package org.thoughtcrime.securesms.media;
import android.content.Context;
import android.media.MediaDataSource;
@ -12,30 +12,30 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.mms.PartUriParser;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.video.videoconverter.VideoInput;
import org.thoughtcrime.securesms.media.MediaInput;
import java.io.IOException;
@RequiresApi(api = 23)
public final class DecryptableUriVideoInput {
public final class DecryptableUriMediaInput {
private DecryptableUriVideoInput() {
private DecryptableUriMediaInput() {
}
public static VideoInput createForUri(@NonNull Context context, @NonNull Uri uri) throws IOException {
public static @NonNull MediaInput createForUri(@NonNull Context context, @NonNull Uri uri) throws IOException {
if (BlobProvider.isAuthority(uri)) {
return new VideoInput.MediaDataSourceVideoInput(BlobProvider.getInstance().getMediaDataSource(context, uri));
return new MediaInput.MediaDataSourceMediaInput(BlobProvider.getInstance().getMediaDataSource(context, uri));
}
if (PartAuthority.isLocalUri(uri)) {
return createForAttachmentUri(context, uri);
}
return new VideoInput.UriVideoInput(context, uri);
return new MediaInput.UriMediaInput(context, uri);
}
private static VideoInput createForAttachmentUri(@NonNull Context context, @NonNull Uri uri) {
private static @NonNull MediaInput createForAttachmentUri(@NonNull Context context, @NonNull Uri uri) {
AttachmentId partId = new PartUriParser(uri).getPartId();
if (!partId.isValid()) {
@ -49,6 +49,6 @@ public final class DecryptableUriVideoInput {
throw new AssertionError();
}
return new VideoInput.MediaDataSourceVideoInput(mediaDataSource);
return new MediaInput.MediaDataSourceMediaInput(mediaDataSource);
}
}

View File

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.video.videoconverter;
package org.thoughtcrime.securesms.media;
import android.content.Context;
import android.media.MediaDataSource;
@ -12,16 +12,16 @@ import java.io.Closeable;
import java.io.File;
import java.io.IOException;
public abstract class VideoInput implements Closeable {
public abstract class MediaInput implements Closeable {
@NonNull
abstract MediaExtractor createExtractor() throws IOException;
public abstract MediaExtractor createExtractor() throws IOException;
public static class FileVideoInput extends VideoInput {
public static class FileMediaInput extends MediaInput {
final File file;
private final File file;
public FileVideoInput(final @NonNull File file) {
public FileMediaInput(@NonNull File file) {
this.file = file;
}
@ -37,13 +37,13 @@ public abstract class VideoInput implements Closeable {
}
}
public static class UriVideoInput extends VideoInput {
public static class UriMediaInput extends MediaInput {
final Uri uri;
final Context context;
private final Uri uri;
private final Context context;
public UriVideoInput(final @NonNull Context context, final @NonNull Uri uri) {
this.uri = uri;
public UriMediaInput(@NonNull Context context, @NonNull Uri uri) {
this.uri = uri;
this.context = context;
}
@ -60,11 +60,11 @@ public abstract class VideoInput implements Closeable {
}
@RequiresApi(23)
public static class MediaDataSourceVideoInput extends VideoInput {
public static class MediaDataSourceMediaInput extends MediaInput {
private final MediaDataSource mediaDataSource;
public MediaDataSourceVideoInput(final @NonNull MediaDataSource mediaDataSource) {
public MediaDataSourceMediaInput(@NonNull MediaDataSource mediaDataSource) {
this.mediaDataSource = mediaDataSource;
}

View File

@ -15,7 +15,7 @@ import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.VideoSlide;
import org.thoughtcrime.securesms.video.DecryptableUriVideoInput;
import org.thoughtcrime.securesms.media.DecryptableUriMediaInput;
import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelectorView;
import java.io.IOException;
@ -69,7 +69,7 @@ public final class VideoEditorHud extends LinearLayout {
return;
}
videoTimeLine.setInput(DecryptableUriVideoInput.createForUri(getContext(), uri));
videoTimeLine.setInput(DecryptableUriMediaInput.createForUri(getContext(), uri));
videoTimeLine.setOnRangeChangeListener(new VideoThumbnailsRangeSelectorView.OnRangeChangeListener() {

View File

@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.mms.MediaStream;
import org.thoughtcrime.securesms.util.MemoryFileDescriptor;
import org.thoughtcrime.securesms.video.videoconverter.EncodingException;
import org.thoughtcrime.securesms.video.videoconverter.MediaConverter;
import org.thoughtcrime.securesms.video.videoconverter.VideoInput;
import org.thoughtcrime.securesms.media.MediaInput;
import java.io.Closeable;
import java.io.FileDescriptor;
@ -129,7 +129,7 @@ public final class InMemoryTranscoder implements Closeable {
final MediaConverter converter = new MediaConverter();
converter.setInput(new VideoInput.MediaDataSourceVideoInput(dataSource));
converter.setInput(new MediaInput.MediaDataSourceMediaInput(dataSource));
converter.setOutput(memoryFileFileDescriptor);
converter.setVideoResolution(outputFormat);
converter.setVideoBitrate(targetVideoBitRate);

View File

@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.media.MediaInput;
import org.thoughtcrime.securesms.video.VideoUtil;
import java.io.FileNotFoundException;
@ -62,7 +63,7 @@ final class AudioTrackConverter {
static @Nullable
AudioTrackConverter create(
final @NonNull VideoInput input,
final @NonNull MediaInput input,
final long timeFrom,
final long timeTo,
final int audioBitrate) throws IOException {

View File

@ -29,6 +29,7 @@ import androidx.annotation.StringDef;
import androidx.annotation.WorkerThread;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.media.MediaInput;
import java.io.File;
import java.io.FileDescriptor;
@ -49,7 +50,7 @@ public final class MediaConverter {
public static final String VIDEO_CODEC_H264 = "video/avc";
public static final String VIDEO_CODEC_H265 = "video/hevc";
private VideoInput mInput;
private MediaInput mInput;
private Output mOutput;
private long mTimeFrom;
@ -69,7 +70,7 @@ public final class MediaConverter {
public MediaConverter() {
}
public void setInput(final @NonNull VideoInput videoInput) {
public void setInput(final @NonNull MediaInput videoInput) {
mInput = videoInput;
}

View File

@ -10,6 +10,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.media.MediaInput;
import java.io.IOException;
import java.nio.ByteBuffer;
@ -28,7 +29,7 @@ final class VideoThumbnailsExtractor {
void failed();
}
static void extractThumbnails(final @NonNull VideoInput input,
static void extractThumbnails(final @NonNull MediaInput input,
final int thumbnailCount,
final int thumbnailResolution,
final @NonNull Callback callback)

View File

@ -15,6 +15,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.media.MediaInput;
import java.io.IOException;
import java.lang.ref.WeakReference;
@ -26,7 +27,7 @@ public class VideoThumbnailsView extends View {
private static final String TAG = Log.tag(VideoThumbnailsView.class);
private VideoInput input;
private MediaInput input;
private ArrayList<Bitmap> thumbnails;
private AsyncTask<Void, Bitmap, Void> thumbnailsTask;
private OnDurationListener durationListener;
@ -49,9 +50,9 @@ public class VideoThumbnailsView extends View {
super(context, attrs, defStyleAttr);
}
public void setInput(VideoInput input) {
this.input = input;
thumbnails = null;
public void setInput(@NonNull MediaInput input) {
this.input = input;
this.thumbnails = null;
if (thumbnailsTask != null) {
thumbnailsTask.cancel(true);
thumbnailsTask = null;
@ -164,14 +165,14 @@ public class VideoThumbnailsView extends View {
private static class ThumbnailsTask extends AsyncTask<Void, Bitmap, Void> {
final WeakReference<VideoThumbnailsView> viewReference;
final VideoInput input;
final MediaInput input;
final float thumbnailWidth;
final float thumbnailHeight;
final int thumbnailCount;
long duration;
ThumbnailsTask(final @NonNull VideoThumbnailsView view, final @NonNull VideoInput input, final float thumbnailWidth, final float thumbnailHeight, final int thumbnailCount) {
viewReference = new WeakReference<>(view);
ThumbnailsTask(final @NonNull VideoThumbnailsView view, final @NonNull MediaInput input, final float thumbnailWidth, final float thumbnailHeight, final int thumbnailCount) {
this.viewReference = new WeakReference<>(view);
this.input = input;
this.thumbnailWidth = thumbnailWidth;
this.thumbnailHeight = thumbnailHeight;

View File

@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.media.MediaInput;
import java.io.FileNotFoundException;
import java.io.IOException;
@ -66,7 +67,7 @@ final class VideoTrackConverter {
@RequiresApi(23)
static @Nullable VideoTrackConverter create(
final @NonNull VideoInput input,
final @NonNull MediaInput input,
final long timeFrom,
final long timeTo,
final int videoResolution,