mirror of
https://github.com/oxen-io/session-android.git
synced 2025-06-09 09:28:34 +00:00
Generalize media input for use with Audio.
This commit is contained in:
parent
5937a50b6d
commit
3db5da1c8d
@ -1,4 +1,4 @@
|
|||||||
package org.thoughtcrime.securesms.video;
|
package org.thoughtcrime.securesms.media;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.media.MediaDataSource;
|
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.PartAuthority;
|
||||||
import org.thoughtcrime.securesms.mms.PartUriParser;
|
import org.thoughtcrime.securesms.mms.PartUriParser;
|
||||||
import org.thoughtcrime.securesms.providers.BlobProvider;
|
import org.thoughtcrime.securesms.providers.BlobProvider;
|
||||||
import org.thoughtcrime.securesms.video.videoconverter.VideoInput;
|
import org.thoughtcrime.securesms.media.MediaInput;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@RequiresApi(api = 23)
|
@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)) {
|
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)) {
|
if (PartAuthority.isLocalUri(uri)) {
|
||||||
return createForAttachmentUri(context, 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();
|
AttachmentId partId = new PartUriParser(uri).getPartId();
|
||||||
|
|
||||||
if (!partId.isValid()) {
|
if (!partId.isValid()) {
|
||||||
@ -49,6 +49,6 @@ public final class DecryptableUriVideoInput {
|
|||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
|
|
||||||
return new VideoInput.MediaDataSourceVideoInput(mediaDataSource);
|
return new MediaInput.MediaDataSourceMediaInput(mediaDataSource);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.thoughtcrime.securesms.video.videoconverter;
|
package org.thoughtcrime.securesms.media;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.media.MediaDataSource;
|
import android.media.MediaDataSource;
|
||||||
@ -12,16 +12,16 @@ import java.io.Closeable;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public abstract class VideoInput implements Closeable {
|
public abstract class MediaInput implements Closeable {
|
||||||
|
|
||||||
@NonNull
|
@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;
|
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;
|
private final Uri uri;
|
||||||
final Context context;
|
private final Context context;
|
||||||
|
|
||||||
public UriVideoInput(final @NonNull Context context, final @NonNull Uri uri) {
|
public UriMediaInput(@NonNull Context context, @NonNull Uri uri) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,11 +60,11 @@ public abstract class VideoInput implements Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(23)
|
@RequiresApi(23)
|
||||||
public static class MediaDataSourceVideoInput extends VideoInput {
|
public static class MediaDataSourceMediaInput extends MediaInput {
|
||||||
|
|
||||||
private final MediaDataSource mediaDataSource;
|
private final MediaDataSource mediaDataSource;
|
||||||
|
|
||||||
public MediaDataSourceVideoInput(final @NonNull MediaDataSource mediaDataSource) {
|
public MediaDataSourceMediaInput(@NonNull MediaDataSource mediaDataSource) {
|
||||||
this.mediaDataSource = mediaDataSource;
|
this.mediaDataSource = mediaDataSource;
|
||||||
}
|
}
|
||||||
|
|
@ -15,7 +15,7 @@ import androidx.annotation.RequiresApi;
|
|||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
import org.thoughtcrime.securesms.mms.VideoSlide;
|
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 org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelectorView;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -69,7 +69,7 @@ public final class VideoEditorHud extends LinearLayout {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
videoTimeLine.setInput(DecryptableUriVideoInput.createForUri(getContext(), uri));
|
videoTimeLine.setInput(DecryptableUriMediaInput.createForUri(getContext(), uri));
|
||||||
|
|
||||||
videoTimeLine.setOnRangeChangeListener(new VideoThumbnailsRangeSelectorView.OnRangeChangeListener() {
|
videoTimeLine.setOnRangeChangeListener(new VideoThumbnailsRangeSelectorView.OnRangeChangeListener() {
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.mms.MediaStream;
|
|||||||
import org.thoughtcrime.securesms.util.MemoryFileDescriptor;
|
import org.thoughtcrime.securesms.util.MemoryFileDescriptor;
|
||||||
import org.thoughtcrime.securesms.video.videoconverter.EncodingException;
|
import org.thoughtcrime.securesms.video.videoconverter.EncodingException;
|
||||||
import org.thoughtcrime.securesms.video.videoconverter.MediaConverter;
|
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.Closeable;
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
@ -129,7 +129,7 @@ public final class InMemoryTranscoder implements Closeable {
|
|||||||
|
|
||||||
final MediaConverter converter = new MediaConverter();
|
final MediaConverter converter = new MediaConverter();
|
||||||
|
|
||||||
converter.setInput(new VideoInput.MediaDataSourceVideoInput(dataSource));
|
converter.setInput(new MediaInput.MediaDataSourceMediaInput(dataSource));
|
||||||
converter.setOutput(memoryFileFileDescriptor);
|
converter.setOutput(memoryFileFileDescriptor);
|
||||||
converter.setVideoResolution(outputFormat);
|
converter.setVideoResolution(outputFormat);
|
||||||
converter.setVideoBitrate(targetVideoBitRate);
|
converter.setVideoBitrate(targetVideoBitRate);
|
||||||
|
@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
|
import org.thoughtcrime.securesms.media.MediaInput;
|
||||||
import org.thoughtcrime.securesms.video.VideoUtil;
|
import org.thoughtcrime.securesms.video.VideoUtil;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@ -62,7 +63,7 @@ final class AudioTrackConverter {
|
|||||||
|
|
||||||
static @Nullable
|
static @Nullable
|
||||||
AudioTrackConverter create(
|
AudioTrackConverter create(
|
||||||
final @NonNull VideoInput input,
|
final @NonNull MediaInput input,
|
||||||
final long timeFrom,
|
final long timeFrom,
|
||||||
final long timeTo,
|
final long timeTo,
|
||||||
final int audioBitrate) throws IOException {
|
final int audioBitrate) throws IOException {
|
||||||
|
@ -29,6 +29,7 @@ import androidx.annotation.StringDef;
|
|||||||
import androidx.annotation.WorkerThread;
|
import androidx.annotation.WorkerThread;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
|
import org.thoughtcrime.securesms.media.MediaInput;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileDescriptor;
|
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_H264 = "video/avc";
|
||||||
public static final String VIDEO_CODEC_H265 = "video/hevc";
|
public static final String VIDEO_CODEC_H265 = "video/hevc";
|
||||||
|
|
||||||
private VideoInput mInput;
|
private MediaInput mInput;
|
||||||
private Output mOutput;
|
private Output mOutput;
|
||||||
|
|
||||||
private long mTimeFrom;
|
private long mTimeFrom;
|
||||||
@ -69,7 +70,7 @@ public final class MediaConverter {
|
|||||||
public MediaConverter() {
|
public MediaConverter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInput(final @NonNull VideoInput videoInput) {
|
public void setInput(final @NonNull MediaInput videoInput) {
|
||||||
mInput = videoInput;
|
mInput = videoInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
|
import org.thoughtcrime.securesms.media.MediaInput;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@ -28,7 +29,7 @@ final class VideoThumbnailsExtractor {
|
|||||||
void failed();
|
void failed();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void extractThumbnails(final @NonNull VideoInput input,
|
static void extractThumbnails(final @NonNull MediaInput input,
|
||||||
final int thumbnailCount,
|
final int thumbnailCount,
|
||||||
final int thumbnailResolution,
|
final int thumbnailResolution,
|
||||||
final @NonNull Callback callback)
|
final @NonNull Callback callback)
|
||||||
|
@ -15,6 +15,7 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
|
import org.thoughtcrime.securesms.media.MediaInput;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
@ -26,7 +27,7 @@ public class VideoThumbnailsView extends View {
|
|||||||
|
|
||||||
private static final String TAG = Log.tag(VideoThumbnailsView.class);
|
private static final String TAG = Log.tag(VideoThumbnailsView.class);
|
||||||
|
|
||||||
private VideoInput input;
|
private MediaInput input;
|
||||||
private ArrayList<Bitmap> thumbnails;
|
private ArrayList<Bitmap> thumbnails;
|
||||||
private AsyncTask<Void, Bitmap, Void> thumbnailsTask;
|
private AsyncTask<Void, Bitmap, Void> thumbnailsTask;
|
||||||
private OnDurationListener durationListener;
|
private OnDurationListener durationListener;
|
||||||
@ -49,9 +50,9 @@ public class VideoThumbnailsView extends View {
|
|||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInput(VideoInput input) {
|
public void setInput(@NonNull MediaInput input) {
|
||||||
this.input = input;
|
this.input = input;
|
||||||
thumbnails = null;
|
this.thumbnails = null;
|
||||||
if (thumbnailsTask != null) {
|
if (thumbnailsTask != null) {
|
||||||
thumbnailsTask.cancel(true);
|
thumbnailsTask.cancel(true);
|
||||||
thumbnailsTask = null;
|
thumbnailsTask = null;
|
||||||
@ -164,14 +165,14 @@ public class VideoThumbnailsView extends View {
|
|||||||
private static class ThumbnailsTask extends AsyncTask<Void, Bitmap, Void> {
|
private static class ThumbnailsTask extends AsyncTask<Void, Bitmap, Void> {
|
||||||
|
|
||||||
final WeakReference<VideoThumbnailsView> viewReference;
|
final WeakReference<VideoThumbnailsView> viewReference;
|
||||||
final VideoInput input;
|
final MediaInput input;
|
||||||
final float thumbnailWidth;
|
final float thumbnailWidth;
|
||||||
final float thumbnailHeight;
|
final float thumbnailHeight;
|
||||||
final int thumbnailCount;
|
final int thumbnailCount;
|
||||||
long duration;
|
long duration;
|
||||||
|
|
||||||
ThumbnailsTask(final @NonNull VideoThumbnailsView view, final @NonNull VideoInput input, final float thumbnailWidth, final float thumbnailHeight, final int thumbnailCount) {
|
ThumbnailsTask(final @NonNull VideoThumbnailsView view, final @NonNull MediaInput input, final float thumbnailWidth, final float thumbnailHeight, final int thumbnailCount) {
|
||||||
viewReference = new WeakReference<>(view);
|
this.viewReference = new WeakReference<>(view);
|
||||||
this.input = input;
|
this.input = input;
|
||||||
this.thumbnailWidth = thumbnailWidth;
|
this.thumbnailWidth = thumbnailWidth;
|
||||||
this.thumbnailHeight = thumbnailHeight;
|
this.thumbnailHeight = thumbnailHeight;
|
||||||
|
@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.logging.Log;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
|
import org.thoughtcrime.securesms.media.MediaInput;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -66,7 +67,7 @@ final class VideoTrackConverter {
|
|||||||
|
|
||||||
@RequiresApi(23)
|
@RequiresApi(23)
|
||||||
static @Nullable VideoTrackConverter create(
|
static @Nullable VideoTrackConverter create(
|
||||||
final @NonNull VideoInput input,
|
final @NonNull MediaInput input,
|
||||||
final long timeFrom,
|
final long timeFrom,
|
||||||
final long timeTo,
|
final long timeTo,
|
||||||
final int videoResolution,
|
final int videoResolution,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user