summaryrefslogtreecommitdiffstats
path: root/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/VideoTrackDecoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/VideoTrackDecoder.java')
-rw-r--r--tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/VideoTrackDecoder.java108
1 files changed, 108 insertions, 0 deletions
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/VideoTrackDecoder.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/VideoTrackDecoder.java
new file mode 100644
index 0000000..06a4305
--- /dev/null
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/VideoTrackDecoder.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.media.filterfw.decoder;
+
+import android.annotation.TargetApi;
+import android.media.MediaFormat;
+import android.util.Log;
+
+import androidx.media.filterfw.FrameImage2D;
+
+/**
+ * Base class for all {@link TrackDecoder} classes that decode video.
+ */
+@TargetApi(16)
+public abstract class VideoTrackDecoder extends TrackDecoder {
+
+ private static final String LOG_TAG = "VideoTrackDecoder";
+
+ protected final Object mFrameMonitor = new Object();
+ protected volatile boolean mFrameAvailable; // Access guarded by mFrameMonitor.
+
+ protected VideoTrackDecoder(int trackIndex, MediaFormat format, Listener listener) {
+ super(trackIndex, format, listener);
+ if (!DecoderUtil.isVideoFormat(format)) {
+ throw new IllegalArgumentException(
+ "VideoTrackDecoder can only be used with video formats");
+ }
+ }
+
+ public void grabFrame(FrameImage2D outputVideoFrame, int rotation) {
+ synchronized (mFrameMonitor) {
+ if (!mFrameAvailable) {
+ Log.w(LOG_TAG, "frame is not ready - the caller has to wait for a corresponding " +
+ "onDecodedFrameAvailable() call");
+ return;
+ }
+
+ copyFrameDataTo(outputVideoFrame, rotation);
+
+ mFrameAvailable = false;
+ mFrameMonitor.notifyAll();
+ }
+ }
+
+
+ /**
+ * Waits for the frame to be picked up by the MFF thread, i.e. blocks until the
+ * {@link #grabFrame(FrameImage2D, int)}) method is called.
+ */
+ public boolean waitForFrameGrab() {
+ synchronized (mFrameMonitor) {
+ try {
+ while (mFrameAvailable) {
+ mFrameMonitor.wait();
+ }
+ return true;
+ } catch (InterruptedException e) {
+ return false;
+ }
+ }
+ }
+
+ protected final void markFrameAvailable() {
+ synchronized (mFrameMonitor) {
+ mFrameAvailable = true;
+ mFrameMonitor.notifyAll();
+ }
+ }
+
+ /**
+ * @return if the frame dimension needs to be swapped,
+ * i.e. (width,height) becomes (height, width)
+ */
+ protected static boolean needSwapDimension(int rotation) {
+ switch(rotation) {
+ case MediaDecoder.ROTATE_90_RIGHT:
+ case MediaDecoder.ROTATE_90_LEFT:
+ return true;
+ case MediaDecoder.ROTATE_NONE:
+ case MediaDecoder.ROTATE_180:
+ return false;
+ default:
+ throw new IllegalArgumentException("Unsupported rotation angle.");
+ }
+ }
+
+ /**
+ * Subclasses must implement this to copy the video frame data to an MFF frame.
+ *
+ * @param outputVideoFrame The destination frame
+ * @param rotation The desired rotation of the frame
+ */
+ protected abstract void copyFrameDataTo(FrameImage2D outputVideoFrame, int rotation);
+
+}