MuxerWrapper rotation degree fix

Allow setAdditionalRotationDegrees to be called with same rotation after tracks added. This is needed for processes that mux files partially trim optimization so they don't error out after hitting the check state

Manually tested to ensure trim optimization succeeds, automated test added here as well

PiperOrigin-RevId: 601081778
This commit is contained in:
tofunmi 2024-01-24 04:41:52 -08:00 committed by Copybara-Service
parent e5621cc709
commit b94c7d08c1
3 changed files with 46 additions and 4 deletions

View file

@ -65,6 +65,7 @@ import androidx.media3.effect.DefaultVideoFrameProcessor;
import androidx.media3.effect.FrameCache;
import androidx.media3.effect.Presentation;
import androidx.media3.effect.RgbFilter;
import androidx.media3.effect.ScaleAndRotateTransformation;
import androidx.media3.effect.TimestampWrapper;
import androidx.media3.exoplayer.audio.TeeAudioProcessor;
import androidx.test.core.app.ApplicationProvider;
@ -587,8 +588,9 @@ public class TransformerEndToEndTest {
}
@Test
public void clippedMedia_trimOptimizationEnabled_audioRemoved_completesWithOptimizationApplied()
throws Exception {
public void
clippedMedia_trimOptimizationEnabled_audioRemovedAndRotated_completesWithOptimizationApplied()
throws Exception {
String testId = "clippedMedia_trimOptimizationEnabled_completesWithOptimizationApplied";
if (!isRunningOnEmulator() || Util.SDK_INT != 33) {
// The trim optimization is only guaranteed to work on emulator for this (emulator-transcoded)
@ -607,8 +609,13 @@ public class TransformerEndToEndTest {
.setEndPositionMs(2500)
.build())
.build();
Effects effects =
new Effects(
/* audioProcessors= */ ImmutableList.of(),
ImmutableList.of(
new ScaleAndRotateTransformation.Builder().setRotationDegrees(90).build()));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).setEffects(effects).build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)

View file

@ -174,7 +174,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
*/
public void setAdditionalRotationDegrees(int additionalRotationDegrees) {
checkState(
trackTypeToInfo.size() == 0,
trackTypeToInfo.size() == 0 || this.additionalRotationDegrees == additionalRotationDegrees,
"The additional rotation cannot be changed after adding track formats.");
this.additionalRotationDegrees = additionalRotationDegrees;
}

View file

@ -72,6 +72,41 @@ public class MuxerWrapperTest {
}
}
@Test
public void setAdditionalRotationDegrees_sameRotationSetAfterTracksAdded_doesNotThrow()
throws Exception {
muxerWrapper =
new MuxerWrapper(
temporaryFolder.newFile().getPath(),
new DefaultMuxer.Factory(),
new NoOpMuxerListenerImpl(),
MUXER_MODE_DEFAULT,
/* dropSamplesBeforeFirstVideoSample= */ false);
muxerWrapper.setAdditionalRotationDegrees(90);
muxerWrapper.setTrackCount(1);
muxerWrapper.setAdditionalRotationDegrees(180);
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
muxerWrapper.setAdditionalRotationDegrees(180);
}
@Test
public void setAdditionalRotationDegrees_differentRotationSetAfterTracksAdded_throws()
throws Exception {
muxerWrapper =
new MuxerWrapper(
temporaryFolder.newFile().getPath(),
new DefaultMuxer.Factory(),
new NoOpMuxerListenerImpl(),
MUXER_MODE_DEFAULT,
/* dropSamplesBeforeFirstVideoSample= */ false);
muxerWrapper.setAdditionalRotationDegrees(90);
muxerWrapper.setTrackCount(1);
muxerWrapper.setAdditionalRotationDegrees(180);
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
assertThrows(IllegalStateException.class, () -> muxerWrapper.setAdditionalRotationDegrees(90));
}
@Test
public void changeToAppendMode_afterDefaultMode_throws() throws Exception {
muxerWrapper =