Generalize media input for use with Audio.
parent
5937a50b6d
commit
3db5da1c8d
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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() {
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue