From 52f03d1cfb319b58a6ba0d757a49829e9d07833b Mon Sep 17 00:00:00 2001 From: Siddharth Rao Date: Wed, 16 Jun 2021 15:56:40 -0400 Subject: [PATCH 1/2] Increase height of toggle switch view so the switch isn't cut off --- videokit/build.gradle | 6 +++--- .../com/android/gallery3d/app/CommonControllerOverlay.java | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/videokit/build.gradle b/videokit/build.gradle index 8b6af4b..d3e61d9 100644 --- a/videokit/build.gradle +++ b/videokit/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 29 - buildToolsVersion "28.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion 19 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" } diff --git a/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java b/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java index 82f68d5..24ea242 100644 --- a/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java +++ b/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java @@ -117,12 +117,13 @@ public CommonControllerOverlay(Context context) { mToggleSwitch = new Switch(context); mToggleSwitch.setTextColor(getResources().getColor(R.color.white)); mToggleSwitch.setTextSize(16); + mToggleSwitch.setMinimumHeight(64); ColorStateList trackColor = ColorStateList.valueOf(getResources().getColor(R.color.white)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mToggleSwitch.setTrackTintList(trackColor); } mToggleSwitchView.addView(mToggleSwitch, wrapContent); - mToggleSwitchView.setMinimumHeight(64); + mToggleSwitchView.setMinimumHeight(mToggleSwitch.getMinimumHeight() + 8); addView(mToggleSwitchView, matchParent); hide(); } From 3ab534518d439e8f7853eda9bae00d5b7df306f6 Mon Sep 17 00:00:00 2001 From: Siddharth Rao Date: Wed, 16 Jun 2021 17:15:43 -0400 Subject: [PATCH 2/2] Whole lot of code cleanup --- .../app/CommonControllerOverlay.java | 5 +- .../com/android/gallery3d/app/TimeBar.java | 22 ++-- .../gallery3d/app/TrimControllerOverlay.java | 59 +++++----- .../android/gallery3d/app/TrimTimeBar.java | 19 ++-- .../com/android/gallery3d/app/TrimVideo.java | 14 +-- .../android/videokit/VideoTranscoder.java | 106 ++++++++---------- .../android/videokit/support/Component.java | 27 ++--- .../videokit/support/InputSurface.java | 3 - .../videokit/support/OutputSurface.java | 4 +- .../videokit/support/TextureRender.java | 11 +- .../android/videokit/util/MediaInfo.java | 16 +-- 11 files changed, 121 insertions(+), 165 deletions(-) diff --git a/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java b/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java index 24ea242..d22bc0b 100644 --- a/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java +++ b/videokit/src/main/java/com/android/gallery3d/app/CommonControllerOverlay.java @@ -226,10 +226,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { } @Override public boolean onTouchEvent(MotionEvent event) { - if (super.onTouchEvent(event)) { - return true; - } - return false; + return super.onTouchEvent(event); } // The paddings of 4 sides which covered by system components. E.g. // +-----------------+\ diff --git a/videokit/src/main/java/com/android/gallery3d/app/TimeBar.java b/videokit/src/main/java/com/android/gallery3d/app/TimeBar.java index af98c65..4bd334b 100644 --- a/videokit/src/main/java/com/android/gallery3d/app/TimeBar.java +++ b/videokit/src/main/java/com/android/gallery3d/app/TimeBar.java @@ -26,6 +26,8 @@ import com.groupme.android.videokit.R; +import java.util.Locale; + /** * The time bar view, which includes the current and total time, the progress * bar, and the scrubber. @@ -41,7 +43,7 @@ public interface Listener { // The total padding, top plus bottom private static final int V_PADDING_IN_DP = 30; private static final int TEXT_SIZE_IN_DP = 14; - protected final Listener mListener; + protected Listener mListener; // the bars we use for displaying the progress protected final Rect mProgressBar; protected final Rect mPlayedBar; @@ -61,9 +63,9 @@ public interface Listener { protected int mCurrentTime; protected final Rect mTimeBounds; protected int mVPaddingInPx; - public TimeBar(Context context, Listener listener) { + + TimeBar(Context context) { super(context); - mListener = checkNotNull(listener); mShowTimes = true; mShowScrubber = true; mProgressBar = new Rect(); @@ -84,6 +86,10 @@ public TimeBar(Context context, Listener listener) { mScrubberPadding = (int) (metrics.density * SCRUBBER_PADDING_IN_DP); mVPaddingInPx = (int) (metrics.density * V_PADDING_IN_DP); } + public TimeBar(Context context, Listener listener) { + this(context); + mListener = checkNotNull(listener); + } private void update() { mPlayedBar.set(mProgressBar); if (mTotalTime > 0) { @@ -165,13 +171,13 @@ protected void onDraw(Canvas canvas) { if (mShowTimes) { canvas.drawText( stringForTime(mCurrentTime), - mTimeBounds.width() / 2 + getPaddingLeft(), - mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1, + mTimeBounds.width() / 2f + getPaddingLeft(), + mTimeBounds.height() + mVPaddingInPx / 2f + mScrubberPadding + 1, mTimeTextPaint); canvas.drawText( stringForTime(mTotalTime), getWidth() - getPaddingRight() - mTimeBounds.width() / 2, - mTimeBounds.height() + mVPaddingInPx / 2 + mScrubberPadding + 1, + mTimeBounds.height() + mVPaddingInPx / 2f + mScrubberPadding + 1, mTimeTextPaint); } } @@ -213,9 +219,9 @@ protected String stringForTime(long millis) { int minutes = (totalSeconds / 60) % 60; int hours = totalSeconds / 3600; if (hours > 0) { - return String.format("%d:%02d:%02d", hours, minutes, seconds).toString(); + return String.format(Locale.US, "%d:%02d:%02d", hours, minutes, seconds); } else { - return String.format("%02d:%02d", minutes, seconds).toString(); + return String.format(Locale.US, "%02d:%02d", minutes, seconds); } } public void setSeekable(boolean canSeek) { diff --git a/videokit/src/main/java/com/android/gallery3d/app/TrimControllerOverlay.java b/videokit/src/main/java/com/android/gallery3d/app/TrimControllerOverlay.java index 8c3adab..d6ce6a4 100644 --- a/videokit/src/main/java/com/android/gallery3d/app/TrimControllerOverlay.java +++ b/videokit/src/main/java/com/android/gallery3d/app/TrimControllerOverlay.java @@ -18,7 +18,6 @@ import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.content.Context; -import android.os.Build; import android.view.MotionEvent; import android.view.View; @@ -28,8 +27,12 @@ * The controller for the Trimming Video. */ public class TrimControllerOverlay extends CommonControllerOverlay { - public TrimControllerOverlay(Context context, int maxDuration) { + + TrimControllerOverlay(Context context) { super(context); + } + public TrimControllerOverlay(Context context, int maxDuration) { + this(context); ((TrimTimeBar) mTimeBar).setMaxDuration(maxDuration); } @Override @@ -40,9 +43,7 @@ private void hidePlayButtonIfPlaying() { if (mState == State.PLAYING) { mPlayPauseReplayView.setVisibility(View.INVISIBLE); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mPlayPauseReplayView.setAlpha(1f); - } + mPlayPauseReplayView.setAlpha(1f); } public void hideToggle() { mToggleSwitchView.setVisibility(View.GONE); @@ -52,10 +53,6 @@ public void showToggle() { mToggleSwitchView.setVisibility(View.VISIBLE); } - public boolean getToggleState() { - return mToggleSwitch.isChecked(); - } - public void setMaxDuration(int maxDuration) { ((TrimTimeBar) mTimeBar).setMaxDuration(maxDuration); } @@ -75,30 +72,26 @@ public void setSwitchText(String text) { @Override public void showPlaying() { super.showPlaying(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - // Add animation to hide the play button while playing. - ObjectAnimator anim = ObjectAnimator.ofFloat(mPlayPauseReplayView, "alpha", 1f, 0f); - anim.setDuration(200); - anim.start(); - anim.addListener(new AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - } - @Override - public void onAnimationEnd(Animator animation) { - hidePlayButtonIfPlaying(); - } - @Override - public void onAnimationCancel(Animator animation) { - hidePlayButtonIfPlaying(); - } - @Override - public void onAnimationRepeat(Animator animation) { - } - }); - } else { - hidePlayButtonIfPlaying(); - } + // Add animation to hide the play button while playing. + ObjectAnimator anim = ObjectAnimator.ofFloat(mPlayPauseReplayView, "alpha", 1f, 0f); + anim.setDuration(200); + anim.start(); + anim.addListener(new AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + @Override + public void onAnimationEnd(Animator animation) { + hidePlayButtonIfPlaying(); + } + @Override + public void onAnimationCancel(Animator animation) { + hidePlayButtonIfPlaying(); + } + @Override + public void onAnimationRepeat(Animator animation) { + } + }); } @Override public void setTimes(int currentTime, int totalTime, int trimStartTime, int trimEndTime) { diff --git a/videokit/src/main/java/com/android/gallery3d/app/TrimTimeBar.java b/videokit/src/main/java/com/android/gallery3d/app/TrimTimeBar.java index 74b683a..f8f8ac6 100644 --- a/videokit/src/main/java/com/android/gallery3d/app/TrimTimeBar.java +++ b/videokit/src/main/java/com/android/gallery3d/app/TrimTimeBar.java @@ -22,8 +22,6 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; -import android.util.DisplayMetrics; -import android.util.Log; import android.view.MotionEvent; import com.groupme.android.videokit.R; @@ -58,8 +56,8 @@ public class TrimTimeBar extends TimeBar { private final Bitmap mTrimEndScrubber; private int mMaxDuration; private int mProgressY; - private Rect mSelectionBar; - private int mMinDuration = 1 * 1000; // 1 second + private final Rect mSelectionBar; + private final int mMinDuration = 1000; // 1 second public TrimTimeBar(Context context, Listener listener) { super(context, listener); @@ -192,8 +190,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { margin += mTimeBounds.width(); } mProgressY = h / 2; - int scrubberY = mProgressY - mScrubber.getHeight() / 2 + 1; - mScrubberTop = scrubberY; + mScrubberTop = mProgressY - mScrubber.getHeight() / 2 + 1; mTrimStartScrubberTop = mProgressY - mTrimStartScrubber.getHeight() / 2 + 1; mTrimEndScrubberTop = mProgressY - mTrimEndScrubber.getHeight() / 2 + 1; mProgressBar.set( @@ -213,13 +210,13 @@ protected void onDraw(Canvas canvas) { if (mShowTimes) { canvas.drawText( stringForTime(mCurrentTime), - mTimeBounds.width() / 2 + getPaddingLeft(), - mTimeBounds.height() / 2 + mProgressY, + mTimeBounds.width() / 2f + getPaddingLeft(), + mTimeBounds.height() / 2f + mProgressY, mTimeTextPaint); canvas.drawText( stringForTime(mTotalTime), - getWidth() - getPaddingRight() - mTimeBounds.width() / 2, - mTimeBounds.height() / 2 + mProgressY, + getWidth() - getPaddingRight() - mTimeBounds.width() / 2f, + mTimeBounds.height() / 2f + mProgressY, mTimeTextPaint); } @@ -264,7 +261,7 @@ public boolean onTouchEvent(MotionEvent event) { mScrubberCorrection = x - mTrimEndScrubberLeft; break; } - if (mScrubbing == true) { + if (mScrubbing) { mListener.onScrubbingStart(); return true; } diff --git a/videokit/src/main/java/com/android/gallery3d/app/TrimVideo.java b/videokit/src/main/java/com/android/gallery3d/app/TrimVideo.java index aa8a880..09bbd9d 100644 --- a/videokit/src/main/java/com/android/gallery3d/app/TrimVideo.java +++ b/videokit/src/main/java/com/android/gallery3d/app/TrimVideo.java @@ -36,7 +36,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.Window; -import android.widget.CompoundButton; import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; @@ -61,7 +60,6 @@ public class TrimVideo extends Activity implements private int mMaxDuration = 30 * 1000; // 30 seconds private VideoView mVideoView; private TrimControllerOverlay mController; - private Context mContext; private Uri mUri; private final Handler mHandler = new Handler(); public ProgressDialog mProgress; @@ -118,7 +116,7 @@ protected void hideProcessing() { @Override public void onCreate(Bundle savedInstanceState) { try { - mContext = getApplicationContext(); + Context context = getApplicationContext(); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_ACTION_BAR); requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); @@ -146,7 +144,7 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.trim_view); View rootView = findViewById(R.id.trim_view_root); mVideoView = (VideoView) rootView.findViewById(R.id.surface_view); - mController = new TrimControllerOverlay(mContext, mMaxDuration); + mController = new TrimControllerOverlay(context, mMaxDuration); ((ViewGroup) rootView).addView(mController.getView()); mController.setListener(this); mController.setCanReplay(true); @@ -156,7 +154,7 @@ public void onCreate(Bundle savedInstanceState) { if (ContentResolver.SCHEME_FILE.equals(mUri.getScheme())) { retriever.setDataSource(mUri.getPath()); } else { - retriever.setDataSource(mContext, mUri); + retriever.setDataSource(context, mUri); } mDuration = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); @@ -181,11 +179,7 @@ public void onCreate(Bundle savedInstanceState) { } else { mMaxDuration = getIntent().getIntExtra(EXTRA_MAX_DURATION, mMaxDuration); } - if(mTrimStartTime + mMaxDuration > mDuration) { - mTrimEndTime = mDuration; - } else { - mTrimEndTime = mTrimStartTime + mMaxDuration; - } + mTrimEndTime = Math.min(mTrimStartTime + mMaxDuration, mDuration); mController.setMaxDuration(mMaxDuration); mController.setTimes(mTrimStartTime, mDuration, mTrimStartTime, mTrimEndTime); }); diff --git a/videokit/src/main/java/com/groupme/android/videokit/VideoTranscoder.java b/videokit/src/main/java/com/groupme/android/videokit/VideoTranscoder.java index 7a57d55..9d9842c 100644 --- a/videokit/src/main/java/com/groupme/android/videokit/VideoTranscoder.java +++ b/videokit/src/main/java/com/groupme/android/videokit/VideoTranscoder.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; public class VideoTranscoder { @@ -56,7 +57,7 @@ public class VideoTranscoder { private int mOutputVideoFrameRate; private int mOutputVideoIFrameInterval; - private int mOutputAudioBitRate = Defaults.OUTPUT_AUDIO_BIT_RATE; + private final int mOutputAudioBitRate = Defaults.OUTPUT_AUDIO_BIT_RATE; private long mTrimStartTime = 0; private long mTrimEndTime = TRIM_TIME_END; @@ -114,7 +115,7 @@ private void shouldIncludeAudio(boolean copyAudio) { mIncludeAudio = copyAudio; } - public void start(final Listener listener) throws IOException { + public void start(final Listener listener) { if (mContext == null) { throw new IllegalStateException("Context cannot be null"); } @@ -123,24 +124,18 @@ public void start(final Listener listener) throws IOException { throw new IllegalStateException("Source Uri cannot be null. Make sure to call source()"); } - new Thread(new Runnable() { - @Override - public void run() { - final boolean success = startSync(); - - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - if (listener != null) { - if (success) { - listener.onSuccess(mStats); - } else { - listener.onFailure(); - } - } + new Thread(() -> { + final boolean success = startSync(); + + new Handler(Looper.getMainLooper()).post(() -> { + if (listener != null) { + if (success) { + listener.onSuccess(mStats); + } else { + listener.onFailure(); } - }); - } + } + }); }).start(); } @@ -475,18 +470,18 @@ private boolean extractAndFeedDecoder(MediaCodec decoder, ByteBuffer[] buffers, int decoderInputBufferIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC); if (decoderInputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) { - mLogger.d(String.format("no %s decoder input buffer", type)); + mLogger.d(String.format(Locale.US, "no %s decoder input buffer", type)); return false; } - mLogger.d(String.format("%s decoder: returned input buffer: %d", type, decoderInputBufferIndex)); + mLogger.d(String.format(Locale.US, "%s decoder: returned input buffer: %d", type, decoderInputBufferIndex)); MediaExtractor extractor = component.getMediaExtractor(); int size = extractor.readSampleData(buffers[decoderInputBufferIndex], 0); long presentationTime = extractor.getSampleTime(); - mLogger.d(String.format("%s extractor: returned buffer of size %d", type, size)); - mLogger.d(String.format("%s extractor: returned buffer for time %d", type, presentationTime)); + mLogger.d(String.format(Locale.US, "%s extractor: returned buffer of size %d", type, size)); + mLogger.d(String.format(Locale.US, "%s extractor: returned buffer for time %d", type, presentationTime)); if (mTrimEndTime > 0 && presentationTime > (mTrimEndTime * 1000)) { mLogger.d("The current sample is over the trim time. Lets stop."); @@ -536,8 +531,8 @@ private boolean extractAndFeedDecoder(MediaCodec decoder, ByteBuffer[] buffers, /** * Extract frame for decoder and feed to encoder. - * @param videoDecoderOutputBufferInfo - * @return + * @param videoDecoderOutputBufferInfo BufferInfo from the video decoder + * @return true if video was completely polled from decoder and fed to encoder, false otherwise */ private boolean pollVideoFromDecoderAndFeedToEncoder(MediaCodec.BufferInfo videoDecoderOutputBufferInfo) { int decoderOutputBufferIndex = mVideoDecoder.dequeueOutputBuffer(videoDecoderOutputBufferInfo, TIMEOUT_USEC); @@ -564,9 +559,9 @@ private boolean pollVideoFromDecoderAndFeedToEncoder(MediaCodec.BufferInfo video return false; } - mLogger.d(String.format("video decoder: returned output buffer: %s", decoderOutputBufferIndex)); - mLogger.d(String.format("video decoder: returned buffer of size %s", videoDecoderOutputBufferInfo.size)); - mLogger.d(String.format("video decoder: returned buffer for time %d", videoDecoderOutputBufferInfo.presentationTimeUs)); + mLogger.d(String.format(Locale.US, "video decoder: returned output buffer: %s", decoderOutputBufferIndex)); + mLogger.d(String.format(Locale.US, "video decoder: returned buffer of size %s", videoDecoderOutputBufferInfo.size)); + mLogger.d(String.format(Locale.US, "video decoder: returned buffer for time %d", videoDecoderOutputBufferInfo.presentationTimeUs)); boolean render = videoDecoderOutputBufferInfo.size != 0; @@ -594,7 +589,7 @@ private boolean pollVideoFromDecoderAndFeedToEncoder(MediaCodec.BufferInfo video /** * - * @param audioDecoderOutputBufferInfo + * @param audioDecoderOutputBufferInfo BufferInfo from the audio decoder */ private void pollAudioFromDecoder(MediaCodec.BufferInfo audioDecoderOutputBufferInfo) { int decoderOutputBufferIndex = mAudioDecoder.dequeueOutputBuffer(audioDecoderOutputBufferInfo, TIMEOUT_USEC); @@ -612,12 +607,12 @@ private void pollAudioFromDecoder(MediaCodec.BufferInfo audioDecoderOutputBuffer if (decoderOutputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { mDecoderOutputAudioFormat = mAudioDecoder.getOutputFormat(); - mLogger.d(String.format("audio decoder: output format changed: %s", mDecoderOutputAudioFormat)); + mLogger.d(String.format(Locale.US, "audio decoder: output format changed: %s", mDecoderOutputAudioFormat)); return; } - mLogger.d(String.format("audio decoder: returned output buffer: %d", decoderOutputBufferIndex)); - mLogger.d(String.format("audio decoder: returned buffer of size %d", audioDecoderOutputBufferInfo.size)); + mLogger.d(String.format(Locale.US, "audio decoder: returned output buffer: %d", decoderOutputBufferIndex)); + mLogger.d(String.format(Locale.US, "audio decoder: returned buffer of size %d", audioDecoderOutputBufferInfo.size)); if ((audioDecoderOutputBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) { mLogger.d("audio decoder: codec config buffer"); @@ -634,29 +629,28 @@ private void pollAudioFromDecoder(MediaCodec.BufferInfo audioDecoderOutputBuffer /** * - * @param audioDecoderOutputBufferInfo - * @return + * @param audioDecoderOutputBufferInfo Audio buffer to be processed */ - private boolean feedPendingAudioBufferToEncoder(MediaCodec.BufferInfo audioDecoderOutputBufferInfo) { - mLogger.d(String.format("audio decoder: attempting to process pending buffer: %d", mPendingAudioDecoderOutputBufferIndex)); + private void feedPendingAudioBufferToEncoder(MediaCodec.BufferInfo audioDecoderOutputBufferInfo) { + mLogger.d(String.format(Locale.US, "audio decoder: attempting to process pending buffer: %d", mPendingAudioDecoderOutputBufferIndex)); int encoderInputBufferIndex = mAudioEncoder.dequeueInputBuffer(TIMEOUT_USEC); if (encoderInputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) { mLogger.d("no audio encoder input buffer"); - return false; + return; } - mLogger.d(String.format("audio encoder: returned input buffer: %d", encoderInputBufferIndex)); + mLogger.d(String.format(Locale.US, "audio encoder: returned input buffer: %d", encoderInputBufferIndex)); ByteBuffer encoderInputBuffer = mAudioEncoderInputBuffers[encoderInputBufferIndex]; int size = audioDecoderOutputBufferInfo.size; long presentationTime = audioDecoderOutputBufferInfo.presentationTimeUs; - mLogger.d(String.format("audio decoder: processing pending buffer: %d", mPendingAudioDecoderOutputBufferIndex)); - mLogger.d(String.format("audio decoder: pending buffer of size %s", size)); - mLogger.d(String.format("audio decoder: pending buffer for time %s", presentationTime)); + mLogger.d(String.format(Locale.US, "audio decoder: processing pending buffer: %d", mPendingAudioDecoderOutputBufferIndex)); + mLogger.d(String.format(Locale.US, "audio decoder: pending buffer of size %s", size)); + mLogger.d(String.format(Locale.US, "audio decoder: pending buffer for time %s", presentationTime)); if (size >= 0) { ByteBuffer decoderOutputBuffer = mAudioDecoderOutputBuffers[mPendingAudioDecoderOutputBufferIndex].duplicate(); @@ -678,16 +672,13 @@ private boolean feedPendingAudioBufferToEncoder(MediaCodec.BufferInfo audioDecod if ((audioDecoderOutputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { mLogger.d("audio decoder: EOS"); - return true; } - - return false; } /** * - * @param videoEncoderOutputBufferInfo - * @return + * @param videoEncoderOutputBufferInfo BufferInfo from the video encoder + * @return true if video was successfully polled from encoder and fed to muxer, false otherwise */ private boolean pollVideoFromEncoderAndFeedToMuxer(MediaCodec.BufferInfo videoEncoderOutputBufferInfo) { int encoderOutputBufferIndex = mVideoEncoder.dequeueOutputBuffer(videoEncoderOutputBufferInfo, TIMEOUT_USEC); @@ -724,9 +715,9 @@ private boolean pollVideoFromEncoderAndFeedToMuxer(MediaCodec.BufferInfo videoEn // throw new IllegalStateException("should have added track before processing output"); // } - mLogger.d(String.format("video encoder: returned output buffer: %d", encoderOutputBufferIndex)); - mLogger.d(String.format("video encoder: returned buffer of size %d", videoEncoderOutputBufferInfo.size)); - mLogger.d(String.format("video encoder: returned buffer for time %d", videoEncoderOutputBufferInfo.presentationTimeUs)); + mLogger.d(String.format(Locale.US, "video encoder: returned output buffer: %d", encoderOutputBufferIndex)); + mLogger.d(String.format(Locale.US, "video encoder: returned buffer of size %d", videoEncoderOutputBufferInfo.size)); + mLogger.d(String.format(Locale.US, "video encoder: returned buffer for time %d", videoEncoderOutputBufferInfo.presentationTimeUs)); ByteBuffer encoderOutputBuffer = mVideoEncoderOutputBuffers[encoderOutputBufferIndex]; if (videoEncoderOutputBufferInfo.size != 0) { @@ -781,9 +772,9 @@ private boolean pollAudioFromEncoderAndFeedToMuxer(MediaCodec.BufferInfo audioEn // throw new IllegalStateException("should have added track before processing output"); // } - mLogger.d(String.format("audio encoder: returned output buffer: %d", encoderOutputBufferIndex)); - mLogger.d(String.format("audio encoder: returned buffer of size %d", audioEncoderOutputBufferInfo.size)); - mLogger.d(String.format("audio encoder: returned buffer for time %d", audioEncoderOutputBufferInfo.presentationTimeUs)); + mLogger.d(String.format(Locale.US, "audio encoder: returned output buffer: %d", encoderOutputBufferIndex)); + mLogger.d(String.format(Locale.US, "audio encoder: returned buffer of size %d", audioEncoderOutputBufferInfo.size)); + mLogger.d(String.format(Locale.US, "audio encoder: returned buffer for time %d", audioEncoderOutputBufferInfo.presentationTimeUs)); if (audioEncoderOutputBufferInfo.size != 0) { ByteBuffer encoderOutputBuffer = mAudioEncoderOutputBuffers[encoderOutputBufferIndex]; @@ -824,11 +815,8 @@ private void setupMuxer() { } /** - * Returns the first codec capable of encoding the specified MIME type, - * or null if no match was found. - * * @param mimeType specified MIME type - * @return + * @return The first codec capable of encoding the specified MIME type, or null if no match was found. */ private MediaCodecInfo selectCodec(String mimeType) { int numCodecs = MediaCodecList.getCodecCount(); @@ -840,8 +828,8 @@ private MediaCodecInfo selectCodec(String mimeType) { } String[] types = codecInfo.getSupportedTypes(); - for (int j = 0; j < types.length; j++) { - if (types[j].equalsIgnoreCase(mimeType)) { + for (String type : types) { + if (type.equalsIgnoreCase(mimeType)) { mLogger.d(String.format("Codec %s found for mime type %s", codecInfo.getName(), mimeType)); return codecInfo; } @@ -946,7 +934,7 @@ private void createVideoOutputFormat() { private void createVideoEncoder() throws IOException { // Create a MediaCodec for the desired codec, then configure it as an encoder with // our desired properties. Request a Surface to use for input. - AtomicReference inputSurfaceReference = new AtomicReference(); + AtomicReference inputSurfaceReference = new AtomicReference<>(); MediaCodecInfo codecInfo = selectCodec(Defaults.OUTPUT_VIDEO_MIME_TYPE); diff --git a/videokit/src/main/java/com/groupme/android/videokit/support/Component.java b/videokit/src/main/java/com/groupme/android/videokit/support/Component.java index a750901..0080f5e 100644 --- a/videokit/src/main/java/com/groupme/android/videokit/support/Component.java +++ b/videokit/src/main/java/com/groupme/android/videokit/support/Component.java @@ -1,17 +1,14 @@ package com.groupme.android.videokit.support; -import android.annotation.TargetApi; import android.content.Context; import android.media.MediaExtractor; import android.media.MediaFormat; import android.net.Uri; -import android.os.Build; import com.groupme.android.videokit.util.MediaInfo; import java.io.IOException; -@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public class Component { public static int COMPONENT_TYPE_AUDIO = 0; public static int COMPONENT_TYPE_VIDEO = 1; @@ -28,10 +25,10 @@ public class Component { /** * - * @param context - * @param srcUri - * @param type - * @throws IOException + * @param context Context that this component is in + * @param srcUri Source uri for the component + * @param type Type of component - either audio or video + * @throws IOException Thrown if the component type is invalid */ public Component(Context context, Uri srcUri, int type) throws IOException { mContext = context; @@ -47,32 +44,28 @@ public Component(Context context, Uri srcUri, int type) throws IOException { } /** - * The MediaExtractor instance to use to for this component. - * @return + * @return The MediaExtractor instance to use to for this component. */ public MediaExtractor getMediaExtractor() { return mMediaExtractor; } /** - * The MediaFormat for the selected track of this component. - * @return + * @return The MediaFormat for the selected track of this component. */ public MediaFormat getTrackFormat() { return mTrackFormat; } /** - * The index of the selected track for this component. - * @return + * @return The index of the selected track for this component. */ public int getSelectedTrackIndex() { return mSelectedTrackIndex; } /** - * The component type. - * @return COMPONENT_TYPE_AUDIO or COMPONENT_TYPE_VIDEO + * @return The component type. Either COMPONENT_TYPE_AUDIO or COMPONENT_TYPE_VIDEO */ public int getType() { return mType; @@ -86,7 +79,7 @@ public void release() { /** * create me! - * @throws IOException + * @throws IOException If unable to create this component */ private void init() throws IOException { createExtractor(); @@ -96,7 +89,7 @@ private void init() throws IOException { /** * Creates an extractor that reads its frames from {@link #mSrcUri} * - * @throws java.io.IOException + * @throws IOException If unable to create a media extractor for this component */ private void createExtractor() throws IOException { mMediaExtractor = new MediaExtractor(); diff --git a/videokit/src/main/java/com/groupme/android/videokit/support/InputSurface.java b/videokit/src/main/java/com/groupme/android/videokit/support/InputSurface.java index 2518107..4d101a2 100644 --- a/videokit/src/main/java/com/groupme/android/videokit/support/InputSurface.java +++ b/videokit/src/main/java/com/groupme/android/videokit/support/InputSurface.java @@ -16,14 +16,12 @@ package com.groupme.android.videokit.support; -import android.annotation.TargetApi; import android.opengl.EGL14; import android.opengl.EGLExt; import android.opengl.EGLConfig; import android.opengl.EGLContext; import android.opengl.EGLDisplay; import android.opengl.EGLSurface; -import android.util.Log; import android.view.Surface; @@ -34,7 +32,6 @@ * to create an EGL window surface. Calls to eglSwapBuffers() cause a frame of data to be sent * to the video encoder. */ -@TargetApi(17) public class InputSurface { private static final String TAG = "InputSurface"; diff --git a/videokit/src/main/java/com/groupme/android/videokit/support/OutputSurface.java b/videokit/src/main/java/com/groupme/android/videokit/support/OutputSurface.java index 5d82a00..3c699ac 100644 --- a/videokit/src/main/java/com/groupme/android/videokit/support/OutputSurface.java +++ b/videokit/src/main/java/com/groupme/android/videokit/support/OutputSurface.java @@ -53,7 +53,7 @@ public class OutputSurface implements SurfaceTexture.OnFrameAvailableListener { private SurfaceTexture mSurfaceTexture; private Surface mSurface; - private Object mFrameSyncObject = new Object(); // guards mFrameAvailable + private final Object mFrameSyncObject = new Object(); // guards mFrameAvailable private boolean mFrameAvailable; private TextureRender mTextureRender; @@ -252,7 +252,7 @@ public void awaitNewImage() { /** * Wait up to given timeout until new image become available. - * @param timeoutMs + * @param timeoutMs The amount of time to wait in milliseconds * @return true if new image is available. false for no new image until timeout. */ public boolean checkForNewImage(int timeoutMs) { diff --git a/videokit/src/main/java/com/groupme/android/videokit/support/TextureRender.java b/videokit/src/main/java/com/groupme/android/videokit/support/TextureRender.java index 89f6a94..b735094 100644 --- a/videokit/src/main/java/com/groupme/android/videokit/support/TextureRender.java +++ b/videokit/src/main/java/com/groupme/android/videokit/support/TextureRender.java @@ -16,14 +16,12 @@ package com.groupme.android.videokit.support; -import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; -import android.annotation.TargetApi; import android.graphics.Bitmap; import android.graphics.SurfaceTexture; import android.opengl.GLES11Ext; @@ -36,7 +34,6 @@ * Code for rendering a texture onto a surface using OpenGL ES 2.0. */ -@TargetApi(11) public class TextureRender { private static final String TAG = "TextureRender"; @@ -52,7 +49,7 @@ public class TextureRender { 1.0f, 1.0f, 0, 1.f, 1.f, }; - private FloatBuffer mTriangleVertices; + private final FloatBuffer mTriangleVertices; private static final String VERTEX_SHADER = "uniform mat4 uMVPMatrix;\n" + @@ -74,8 +71,8 @@ public class TextureRender { " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + "}\n"; - private float[] mMVPMatrix = new float[16]; - private float[] mSTMatrix = new float[16]; + private final float[] mMVPMatrix = new float[16]; + private final float[] mSTMatrix = new float[16]; private int mProgram; private int mTextureID = -12345; @@ -254,7 +251,7 @@ public void checkGlError(String op) { *

* Useful for debugging. */ - public static void saveFrame(String filename, int width, int height) { + public static void saveFrame(String filename, int width, int height) throws RuntimeException { // glReadPixels gives us a ByteBuffer filled with what is essentially big-endian RGBA // data (i.e. a byte of red, followed by a byte of green...). We need an int[] filled // with native-order ARGB data to feed to Bitmap. diff --git a/videokit/src/main/java/com/groupme/android/videokit/util/MediaInfo.java b/videokit/src/main/java/com/groupme/android/videokit/util/MediaInfo.java index 4ad83d0..b2906ce 100644 --- a/videokit/src/main/java/com/groupme/android/videokit/util/MediaInfo.java +++ b/videokit/src/main/java/com/groupme/android/videokit/util/MediaInfo.java @@ -1,6 +1,5 @@ package com.groupme.android.videokit.util; -import android.annotation.TargetApi; import android.content.Context; import android.media.MediaExtractor; import android.media.MediaFormat; @@ -9,15 +8,11 @@ import java.io.IOException; import java.util.concurrent.TimeUnit; -@TargetApi(16) public class MediaInfo { - public static int VALUE_NOT_AVAILABLE = -1; private final Context mContext; private final Uri mMediaUri; - private MediaExtractor mMediaExtractor; - private MediaFormat mAudioTrackFormat; private MediaFormat mVideoTrackFormat; @@ -53,8 +48,7 @@ public boolean hasVideoTrack() { } /** - * Returns the track duration in seconds. - * @return + * @return The track duration in seconds */ public long getDuration() { long duration = -1; @@ -85,12 +79,12 @@ public int getDurationMilliseconds() { } private void extract() throws IOException { - mMediaExtractor = new MediaExtractor(); - mMediaExtractor.setDataSource(mContext, mMediaUri, null); + MediaExtractor mediaExtractor = new MediaExtractor(); + mediaExtractor.setDataSource(mContext, mMediaUri, null); - int trackCount = mMediaExtractor.getTrackCount(); + int trackCount = mediaExtractor.getTrackCount(); for (int i = 0; i < trackCount; i++) { - MediaFormat track = mMediaExtractor.getTrackFormat(i); + MediaFormat track = mediaExtractor.getTrackFormat(i); if (isAudioFormat(track)) { mAudioTrackFormat = track;