mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Add CompositionPlayer listener tests
PiperOrigin-RevId: 555139635
This commit is contained in:
parent
7bc213d3ef
commit
2a645ac2b6
1 changed files with 89 additions and 1 deletions
|
|
@ -15,9 +15,24 @@
|
||||||
*/
|
*/
|
||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
|
import static androidx.media3.common.Player.EVENT_PLAYBACK_STATE_CHANGED;
|
||||||
|
import static androidx.media3.common.Player.EVENT_PLAYER_ERROR;
|
||||||
|
import static androidx.media3.common.Player.EVENT_PLAY_WHEN_READY_CHANGED;
|
||||||
|
import static androidx.media3.common.Player.EVENT_RENDERED_FIRST_FRAME;
|
||||||
|
import static androidx.media3.common.Player.EVENT_VIDEO_SIZE_CHANGED;
|
||||||
import static androidx.media3.transformer.TestUtil.ASSET_URI_PREFIX;
|
import static androidx.media3.transformer.TestUtil.ASSET_URI_PREFIX;
|
||||||
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_RAW;
|
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_RAW;
|
||||||
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_RAW_STEREO_48000KHZ;
|
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_RAW_STEREO_48000KHZ;
|
||||||
|
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO;
|
||||||
|
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO_STEREO;
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.Mockito.atLeastOnce;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
|
|
@ -31,21 +46,25 @@ import androidx.media3.test.utils.robolectric.TestPlayerRunHelper;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import java.util.List;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
|
||||||
/** Unit tests for {@link CompositionPlayer}. */
|
/** Unit tests for {@link CompositionPlayer}. */
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class CompositionPlayerTest {
|
public class CompositionPlayerTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void playback_audioOnly_outputsSamples() throws Exception {
|
public void playback_outputsSamples() throws Exception {
|
||||||
Context applicationContext = ApplicationProvider.getApplicationContext();
|
Context applicationContext = ApplicationProvider.getApplicationContext();
|
||||||
Clock clock = new FakeClock(/* isAutoAdvancing= */ true);
|
Clock clock = new FakeClock(/* isAutoAdvancing= */ true);
|
||||||
CapturingAudioSink capturingAudioSink =
|
CapturingAudioSink capturingAudioSink =
|
||||||
new CapturingAudioSink(new DefaultAudioSink.Builder(applicationContext).build());
|
new CapturingAudioSink(new DefaultAudioSink.Builder(applicationContext).build());
|
||||||
CompositionPlayer player =
|
CompositionPlayer player =
|
||||||
new CompositionPlayer(applicationContext, /* looper= */ null, capturingAudioSink, clock);
|
new CompositionPlayer(applicationContext, /* looper= */ null, capturingAudioSink, clock);
|
||||||
|
// Use an audio-only Composition because there is no way to dump the video frames.
|
||||||
EditedMediaItem editedMediaItem1 =
|
EditedMediaItem editedMediaItem1 =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
|
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW)).build();
|
||||||
EditedMediaItem editedMediaItem2 =
|
EditedMediaItem editedMediaItem2 =
|
||||||
|
|
@ -67,4 +86,73 @@ public class CompositionPlayerTest {
|
||||||
capturingAudioSink,
|
capturingAudioSink,
|
||||||
"audiosinkdumps/wav/sample.wav_then_sample_rf64.wav.dump");
|
"audiosinkdumps/wav/sample.wav_then_sample_rf64.wav.dump");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addListener_callsSupportedCallbacks() throws Exception {
|
||||||
|
CompositionPlayer player = buildCompositionPlayer();
|
||||||
|
Composition composition = buildComposition();
|
||||||
|
Player.Listener mockListener = mock(Player.Listener.class);
|
||||||
|
|
||||||
|
player.setComposition(composition);
|
||||||
|
player.addListener(mockListener);
|
||||||
|
player.prepare();
|
||||||
|
player.play();
|
||||||
|
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
|
||||||
|
player.release();
|
||||||
|
|
||||||
|
verify(mockListener, atLeastOnce()).onPlaybackStateChanged(anyInt());
|
||||||
|
verify(mockListener, atLeastOnce()).onPlayWhenReadyChanged(anyBoolean(), anyInt());
|
||||||
|
verify(mockListener, atLeastOnce()).onEvents(any(), any());
|
||||||
|
verifyNoMoreInteractions(mockListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addListener_callsOnEventsWithSupportedEvents() throws Exception {
|
||||||
|
CompositionPlayer player = buildCompositionPlayer();
|
||||||
|
Composition composition = buildComposition();
|
||||||
|
Player.Listener mockListener = mock(Player.Listener.class);
|
||||||
|
ArgumentCaptor<Player.Events> eventsCaptor = ArgumentCaptor.forClass(Player.Events.class);
|
||||||
|
ImmutableSet<Integer> supportedEvents =
|
||||||
|
ImmutableSet.of(
|
||||||
|
EVENT_PLAYBACK_STATE_CHANGED,
|
||||||
|
EVENT_PLAY_WHEN_READY_CHANGED,
|
||||||
|
EVENT_PLAYER_ERROR,
|
||||||
|
EVENT_VIDEO_SIZE_CHANGED,
|
||||||
|
EVENT_RENDERED_FIRST_FRAME);
|
||||||
|
|
||||||
|
player.setComposition(composition);
|
||||||
|
player.addListener(mockListener);
|
||||||
|
player.prepare();
|
||||||
|
player.play();
|
||||||
|
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
|
||||||
|
player.release();
|
||||||
|
|
||||||
|
verify(mockListener, atLeastOnce()).onEvents(any(), eventsCaptor.capture());
|
||||||
|
List<Player.Events> eventsList = eventsCaptor.getAllValues();
|
||||||
|
for (Player.Events events : eventsList) {
|
||||||
|
assertThat(events.size()).isNotEqualTo(0);
|
||||||
|
for (int j = 0; j < events.size(); j++) {
|
||||||
|
assertThat(supportedEvents).contains(events.get(j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CompositionPlayer buildCompositionPlayer() {
|
||||||
|
return new CompositionPlayer(
|
||||||
|
ApplicationProvider.getApplicationContext(),
|
||||||
|
/* looper= */ null,
|
||||||
|
/* audioSink= */ null,
|
||||||
|
new FakeClock(/* isAutoAdvancing= */ true));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Composition buildComposition() {
|
||||||
|
EditedMediaItem editedMediaItem1 =
|
||||||
|
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build();
|
||||||
|
EditedMediaItem editedMediaItem2 =
|
||||||
|
new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO_STEREO))
|
||||||
|
.build();
|
||||||
|
EditedMediaItemSequence sequence =
|
||||||
|
new EditedMediaItemSequence(ImmutableList.of(editedMediaItem1, editedMediaItem2));
|
||||||
|
return new Composition.Builder(ImmutableList.of(sequence)).build();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue