Skip to content

Scale canvas video strategy #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
- Add a video strategy to change the way that the videos are scaled t…
…o be the same resolution

- Add a method in VideoDecoderOutput to scale the canvas instead of the frame
  • Loading branch information
Christian Bernier committed Apr 29, 2020
commit 406c51c77e0d084e218b9949bfa1ec7f3222b5a2
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.otaliastudios.transcoder.strategy.DefaultVideoStrategy;
import com.otaliastudios.transcoder.strategy.RemoveTrackStrategy;
import com.otaliastudios.transcoder.strategy.TrackStrategy;
import com.otaliastudios.transcoder.strategy.VideoTrackStrategy;
import com.otaliastudios.transcoder.strategy.size.AspectRatioResizer;
import com.otaliastudios.transcoder.strategy.size.FractionResizer;
import com.otaliastudios.transcoder.strategy.size.PassThroughResizer;
Expand Down Expand Up @@ -78,7 +79,7 @@ public class TranscoderActivity extends AppCompatActivity implements
private Uri mAudioReplacementUri;
private File mTranscodeOutputFile;
private long mTranscodeStartTime;
private TrackStrategy mTranscodeVideoStrategy;
private VideoTrackStrategy mTranscodeVideoStrategy;
private TrackStrategy mTranscodeAudioStrategy;
private long mTrimStartUs = 0;
private long mTrimEndUs = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.otaliastudios.transcoder.strategy.DefaultAudioStrategy;
import com.otaliastudios.transcoder.strategy.DefaultVideoStrategies;
import com.otaliastudios.transcoder.strategy.TrackStrategy;
import com.otaliastudios.transcoder.strategy.VideoTrackStrategy;
import com.otaliastudios.transcoder.stretch.AudioStretcher;
import com.otaliastudios.transcoder.stretch.DefaultAudioStretcher;
import com.otaliastudios.transcoder.time.DefaultTimeInterpolator;
Expand Down Expand Up @@ -45,7 +46,7 @@ private TranscoderOptions() {}
private List<DataSource> videoDataSources;
private List<DataSource> audioDataSources;
private TrackStrategy audioTrackStrategy;
private TrackStrategy videoTrackStrategy;
private VideoTrackStrategy videoTrackStrategy;
private Validator validator;
private int rotation;
private TimeInterpolator timeInterpolator;
Expand Down Expand Up @@ -76,7 +77,7 @@ public TrackStrategy getAudioTrackStrategy() {
}

@NonNull
public TrackStrategy getVideoTrackStrategy() {
public VideoTrackStrategy getVideoTrackStrategy() {
return videoTrackStrategy;
}

Expand Down Expand Up @@ -111,7 +112,7 @@ public static class Builder {
private TranscoderListener listener;
private Handler listenerHandler;
private TrackStrategy audioTrackStrategy;
private TrackStrategy videoTrackStrategy;
private VideoTrackStrategy videoTrackStrategy;
private Validator validator;
private int rotation;
private TimeInterpolator timeInterpolator;
Expand Down Expand Up @@ -199,13 +200,13 @@ public Builder setAudioTrackStrategy(@Nullable TrackStrategy trackStrategy) {
* Sets the video output strategy. If absent, this defaults to the 16:9
* strategy returned by {@link DefaultVideoStrategies#for720x1280()}.
*
* @param trackStrategy the desired strategy
* @param videoTrackStrategy the desired strategy
* @return this for chaining
*/
@NonNull
@SuppressWarnings("unused")
public Builder setVideoTrackStrategy(@Nullable TrackStrategy trackStrategy) {
this.videoTrackStrategy = trackStrategy;
public Builder setVideoTrackStrategy(@Nullable VideoTrackStrategy videoTrackStrategy) {
this.videoTrackStrategy = videoTrackStrategy;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ private void openCurrentStep(@NonNull TrackType type, @NonNull TranscoderOptions
case VIDEO:
transcoder = new VideoTrackTranscoder(dataSource, mDataSink,
interpolator,
options.getVideoTrackStrategy(),
options.getVideoRotation());
break;
case AUDIO:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.otaliastudios.transcoder.strategy.size.Resizer;
import com.otaliastudios.transcoder.internal.Logger;
import com.otaliastudios.transcoder.internal.MediaFormatConstants;
import com.otaliastudios.transcoder.transcode.internal.VideoDecoderOutput;

import androidx.annotation.NonNull;

Expand All @@ -25,7 +26,7 @@
* An {@link TrackStrategy} for video that converts it AVC with the given size.
* The input and output aspect ratio must match.
*/
public class DefaultVideoStrategy implements TrackStrategy {
public class DefaultVideoStrategy implements VideoTrackStrategy {
private final static String TAG = DefaultVideoStrategy.class.getSimpleName();
private final static Logger LOG = new Logger(TAG);

Expand Down Expand Up @@ -290,6 +291,11 @@ public TrackStatus createOutputFormat(@NonNull List<MediaFormat> inputFormats,
return TrackStatus.COMPRESSING;
}

@Override
public void scaleOutput(@NonNull VideoDecoderOutput videoDecoderOutput, float scaleX, float scaleY) {
videoDecoderOutput.setScale(scaleX, scaleY);
}

private boolean checkMimeType(@NonNull List<MediaFormat> formats) {
for (MediaFormat format : formats) {
if (!format.getString(MediaFormat.KEY_MIME).equalsIgnoreCase(options.targetMimeType)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

import android.media.MediaFormat;

import androidx.annotation.NonNull;

import com.otaliastudios.transcoder.engine.TrackStatus;
import com.otaliastudios.transcoder.strategy.size.Resizer;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.List;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.otaliastudios.transcoder.strategy;

import androidx.annotation.NonNull;
import com.otaliastudios.transcoder.transcode.internal.VideoDecoderOutput;

public interface VideoTrackStrategy extends TrackStrategy {

/**
* Apply the scaling to the video decoder output
*
* It can be done using VideoDecoderOutput.setScale or VideoDecoderOutput.setDrawableScale
*
* @param videoDecoderOutput the video decoder output
* @param scaleX the expected x scaling
* @param scaleY the expected y scaling
*/
void scaleOutput(@NonNull VideoDecoderOutput videoDecoderOutput, float scaleX, float scaleY);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,20 @@
package com.otaliastudios.transcoder.transcode;

import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;

import androidx.annotation.NonNull;

import com.otaliastudios.transcoder.engine.TrackType;
import com.otaliastudios.transcoder.internal.Logger;
import com.otaliastudios.transcoder.internal.MediaCodecBuffers;
import com.otaliastudios.transcoder.internal.MediaFormatConstants;
import com.otaliastudios.transcoder.sink.DataSink;
import com.otaliastudios.transcoder.source.DataSource;
import com.otaliastudios.transcoder.strategy.VideoTrackStrategy;
import com.otaliastudios.transcoder.time.TimeInterpolator;
import com.otaliastudios.transcoder.transcode.internal.VideoDecoderOutput;
import com.otaliastudios.transcoder.transcode.internal.VideoEncoderInput;
import com.otaliastudios.transcoder.internal.Logger;
import com.otaliastudios.transcoder.internal.MediaFormatConstants;
import com.otaliastudios.transcoder.transcode.internal.VideoFrameDropper;

import java.nio.ByteBuffer;
Expand All @@ -46,16 +46,19 @@ public class VideoTrackTranscoder extends BaseTrackTranscoder {
private MediaCodec mEncoder; // Keep this since we want to signal EOS on it.
private VideoFrameDropper mFrameDropper;
private final TimeInterpolator mTimeInterpolator;
private final VideoTrackStrategy mStrategy;
private final int mSourceRotation;
private final int mExtraRotation;

public VideoTrackTranscoder(
@NonNull DataSource dataSource,
@NonNull DataSink dataSink,
@NonNull TimeInterpolator timeInterpolator,
@NonNull VideoTrackStrategy strategy,
int rotation) {
super(dataSource, dataSink, TrackType.VIDEO);
mTimeInterpolator = timeInterpolator;
mStrategy = strategy;
mSourceRotation = dataSource.getOrientation();
mExtraRotation = rotation;
}
Expand Down Expand Up @@ -130,7 +133,7 @@ protected void onCodecsStarted(@NonNull MediaFormat inputFormat, @NonNull MediaF
} else if (inputRatio < outputRatio) { // Input taller. We have a scaleY.
scaleY = outputRatio / inputRatio;
}
mDecoderOutputSurface.setScale(scaleX, scaleY);
mStrategy.scaleOutput(mDecoderOutputSurface, scaleX, scaleY);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,21 @@ public void setScale(float scaleX, float scaleY) {
mScaleY = scaleY;
}

/**
* Scale the canvas along the two axes.
* @param scaleX x scale
* @param scaleY y scale
*/
@SuppressWarnings("unused")
public void setDrawableScale(float scaleX, float scaleY) {
mDrawable.setRect(
-1.0F * scaleX,
-1.0F * scaleY,
1.0F * scaleX,
1.0F * scaleY
);
}

/**
* Sets the desired frame rotation with respect
* to its natural orientation.
Expand Down
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy