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

View file

@ -174,7 +174,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
*/ */
public void setAdditionalRotationDegrees(int additionalRotationDegrees) { public void setAdditionalRotationDegrees(int additionalRotationDegrees) {
checkState( checkState(
trackTypeToInfo.size() == 0, trackTypeToInfo.size() == 0 || this.additionalRotationDegrees == additionalRotationDegrees,
"The additional rotation cannot be changed after adding track formats."); "The additional rotation cannot be changed after adding track formats.");
this.additionalRotationDegrees = additionalRotationDegrees; 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 @Test
public void changeToAppendMode_afterDefaultMode_throws() throws Exception { public void changeToAppendMode_afterDefaultMode_throws() throws Exception {
muxerWrapper = muxerWrapper =