Skip to content

Commit d011c27

Browse files
clainclycopybara-github
authored andcommitted
Move utility method to CompositionPlayer
The method is only used CompositionPlayer PiperOrigin-RevId: 787127642
1 parent 50df607 commit d011c27

File tree

3 files changed

+73
-97
lines changed

3 files changed

+73
-97
lines changed

libraries/transformer/src/main/java/androidx/media3/transformer/CompositionPlayer.java

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import static androidx.media3.common.util.Assertions.checkState;
2222
import static androidx.media3.common.util.Assertions.checkStateNotNull;
2323
import static androidx.media3.common.util.Util.usToMs;
24-
import static androidx.media3.transformer.CompositionUtil.shouldRePreparePlayerForSequence;
2524
import static com.google.common.util.concurrent.Futures.immediateFuture;
2625
import static java.lang.Math.max;
2726
import static java.lang.Math.min;
@@ -84,6 +83,7 @@
8483
import androidx.media3.exoplayer.video.VideoFrameMetadataListener;
8584
import androidx.media3.exoplayer.video.VideoFrameReleaseControl;
8685
import com.google.common.collect.ImmutableList;
86+
import com.google.common.collect.Iterables;
8787
import com.google.common.util.concurrent.Futures;
8888
import com.google.common.util.concurrent.ListenableFuture;
8989
import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -1483,6 +1483,75 @@ private static boolean shouldRePreparePlayerForComposition(
14831483
return false;
14841484
}
14851485

1486+
/**
1487+
* Returns whether the player should be re-prepared after switching {@link
1488+
* EditedMediaItemSequence} to the new one.
1489+
*
1490+
* <p>It returns {@code true} if the {@code oldSequence} is {@code null}.
1491+
*
1492+
* <p>Currently this method returns {@code false} when
1493+
*
1494+
* <ul>
1495+
* <li>All the {@link MediaItem mediaItems} in the {@code oldSequence} match with those in the
1496+
* {@code newSequence}.
1497+
* <li>Changes in {@link EditedMediaItem}:
1498+
* <ul>
1499+
* <li>{@linkplain EditedMediaItem#effects Video effects} changed. Except when there are
1500+
* speed adjustments ({@link InactiveTimestampAdjustment}).
1501+
* </ul>
1502+
* </ul>
1503+
*/
1504+
@VisibleForTesting
1505+
/* package */ static boolean shouldRePreparePlayerForSequence(
1506+
@Nullable EditedMediaItemSequence oldSequence, EditedMediaItemSequence newSequence) {
1507+
if (oldSequence == null) {
1508+
return true;
1509+
}
1510+
1511+
if (oldSequence.editedMediaItems.size() != newSequence.editedMediaItems.size()) {
1512+
return true;
1513+
}
1514+
1515+
for (int i = 0; i < oldSequence.editedMediaItems.size(); i++) {
1516+
EditedMediaItem oldEditedMediaItem = oldSequence.editedMediaItems.get(i);
1517+
EditedMediaItem newEditedMediaItem = newSequence.editedMediaItems.get(i);
1518+
if (!oldEditedMediaItem.mediaItem.equals(newEditedMediaItem.mediaItem)) {
1519+
// All MediaItems must match - this checks the URI and the clipping.
1520+
return true;
1521+
}
1522+
1523+
if (oldEditedMediaItem.flattenForSlowMotion != newEditedMediaItem.flattenForSlowMotion) {
1524+
return true;
1525+
}
1526+
1527+
if (oldEditedMediaItem.removeVideo != newEditedMediaItem.removeVideo) {
1528+
return true;
1529+
}
1530+
1531+
if (oldEditedMediaItem.removeAudio != newEditedMediaItem.removeAudio) {
1532+
return true;
1533+
}
1534+
1535+
if (!oldEditedMediaItem.effects.audioProcessors.equals(
1536+
newEditedMediaItem.effects.audioProcessors)) {
1537+
return true;
1538+
}
1539+
1540+
// TimestampAdjustment change needs to be handled separately. Player needs to be re-prepared
1541+
// if the timestamp adjustments change.
1542+
if (!Iterables.elementsEqual(
1543+
// Old timestamp adjustments
1544+
Iterables.filter(
1545+
oldEditedMediaItem.effects.videoEffects, InactiveTimestampAdjustment.class),
1546+
// New timestamp adjustments
1547+
Iterables.filter(
1548+
newEditedMediaItem.effects.videoEffects, InactiveTimestampAdjustment.class))) {
1549+
return true;
1550+
}
1551+
}
1552+
return false;
1553+
}
1554+
14861555
private static final class GapHandlingDecoderFactory implements ImageDecoder.Factory {
14871556
private static final String BLANK_FRAMES_MEDIA_SOURCE_TYPE = "composition_player_blank_frames";
14881557
private static final int BLANK_IMAGE_BITMAP_WIDTH = 1;

libraries/transformer/src/main/java/androidx/media3/transformer/CompositionUtil.java

Lines changed: 0 additions & 93 deletions
This file was deleted.

libraries/transformer/src/test/java/androidx/media3/transformer/CompositionUtilTest.java renamed to libraries/transformer/src/test/java/androidx/media3/transformer/CompositionPlayerUtilTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package androidx.media3.transformer;
1818

19-
import static androidx.media3.transformer.CompositionUtil.shouldRePreparePlayerForSequence;
19+
import static androidx.media3.transformer.CompositionPlayer.shouldRePreparePlayerForSequence;
2020
import static com.google.common.truth.Truth.assertThat;
2121

2222
import androidx.media3.common.MediaItem;
@@ -29,9 +29,9 @@
2929
import org.junit.Test;
3030
import org.junit.runner.RunWith;
3131

32-
/** Unit test for {@link CompositionUtil}. */
32+
/** Unit test for util methods in {@link CompositionPlayer}. */
3333
@RunWith(AndroidJUnit4.class)
34-
public class CompositionUtilTest {
34+
public class CompositionPlayerUtilTest {
3535

3636
private static final String URI_0 = "CompositionUtilTest_0";
3737
private static final String URI_1 = "CompositionUtilTest_1";

0 commit comments

Comments
 (0)