Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad987180 authored by Vlad Popa's avatar Vlad Popa
Browse files

Release the MediaExtractor and MediaCodec after use

Test: atest LoudnessCodecApiTest
Bug: 298463873
Change-Id: I600673e3daf417929786b52a5ca1f4bdae1f7e87
parent 91487ebd
Loading
Loading
Loading
Loading
+124 −67
Original line number Diff line number Diff line
@@ -95,12 +95,17 @@ public class LoudnessCodecConfiguratorTest {
    @RequiresFlagsEnabled(FLAG_LOUDNESS_CONFIGURATOR_API)
    public void setAudioTrack_callsAudioServiceStart() throws Exception {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
        try {
            mLcc.addMediaCodec(mediaCodec);
            mLcc.setAudioTrack(track);

            verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()),
                    anyList());
        } finally {
            mediaCodec.release();
        }
    }

    @Test
@@ -108,10 +113,15 @@ public class LoudnessCodecConfiguratorTest {
    public void getLoudnessCodecParams_callsAudioServiceGetLoudness() throws Exception {
        when(mAudioService.getLoudnessParams(anyInt(), any())).thenReturn(new PersistableBundle());
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        mLcc.getLoudnessCodecParams(track, createAndConfigureMediaCodec());
        try {
            mLcc.getLoudnessCodecParams(track, mediaCodec);

            verify(mAudioService).getLoudnessParams(eq(track.getPlayerIId()), any());
        } finally {
            mediaCodec.release();
        }
    }

    @Test
@@ -120,10 +130,14 @@ public class LoudnessCodecConfiguratorTest {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        try {
            mLcc.addMediaCodec(mediaCodec);
            mLcc.setAudioTrack(track);

            verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()), anyList());
        } finally {
            mediaCodec.release();
        }
    }

    @Test
@@ -132,24 +146,33 @@ public class LoudnessCodecConfiguratorTest {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        try {
            mLcc.addMediaCodec(mediaCodec);
            mLcc.setAudioTrack(track);
            mLcc.setAudioTrack(track);

            verify(mAudioService, times(1)).startLoudnessCodecUpdates(eq(track.getPlayerIId()),
                    anyList());
        } finally {
            mediaCodec.release();
        }
    }

    @Test
    @RequiresFlagsEnabled(FLAG_LOUDNESS_CONFIGURATOR_API)
    public void setTrackNull_stopCodecUpdates() throws Exception {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
        try {
            mLcc.addMediaCodec(mediaCodec);
            mLcc.setAudioTrack(track);

            mLcc.setAudioTrack(null);  // stops updates
            verify(mAudioService).stopLoudnessCodecUpdates(eq(track.getPlayerIId()));
        } finally {
            mediaCodec.release();
        }
    }

    @Test
@@ -157,27 +180,37 @@ public class LoudnessCodecConfiguratorTest {
    public void addMediaCodecTwice_triggersIAE() throws Exception {
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        try {
            mLcc.addMediaCodec(mediaCodec);

            assertThrows(IllegalArgumentException.class, () -> mLcc.addMediaCodec(mediaCodec));
        } finally {
            mediaCodec.release();
        }
    }

    @Test
    @RequiresFlagsEnabled(FLAG_LOUDNESS_CONFIGURATOR_API)
    public void setClearTrack_removeAllAudioServicePiidCodecs() throws Exception {
        final ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class);

        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec1 = createAndConfigureMediaCodec();
        final MediaCodec mediaCodec2 = createAndConfigureMediaCodec();

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
        try {
            mLcc.addMediaCodec(mediaCodec1);
            mLcc.setAudioTrack(track);
            verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()),
                    argument.capture());
            assertEquals(argument.getValue().size(), 1);

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
            mLcc.addMediaCodec(mediaCodec2);
            mLcc.setAudioTrack(null);
            verify(mAudioService).stopLoudnessCodecUpdates(eq(track.getPlayerIId()));
        } finally {
            mediaCodec1.release();
            mediaCodec2.release();
        }
    }

    @Test
@@ -186,24 +219,35 @@ public class LoudnessCodecConfiguratorTest {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        try {
            mLcc.addMediaCodec(mediaCodec);
            mLcc.setAudioTrack(track);
            mLcc.removeMediaCodec(mediaCodec);

            verify(mAudioService).removeLoudnessCodecInfo(eq(track.getPlayerIId()), any());
        } finally {
            mediaCodec.release();
        }
    }

    @Test
    @RequiresFlagsEnabled(FLAG_LOUDNESS_CONFIGURATOR_API)
    public void addMediaCodecAfterSetTrack_callsAudioServiceAdd() throws Exception {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec1 = createAndConfigureMediaCodec();
        final MediaCodec mediaCodec2 = createAndConfigureMediaCodec();

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
        try {
            mLcc.addMediaCodec(mediaCodec1);
            mLcc.setAudioTrack(track);
            verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()), anyList());

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
            mLcc.addMediaCodec(mediaCodec2);
            verify(mAudioService).addLoudnessCodecInfo(eq(track.getPlayerIId()), anyInt(), any());
        } finally {
            mediaCodec1.release();
            mediaCodec2.release();
        }
    }

    @Test
@@ -212,25 +256,36 @@ public class LoudnessCodecConfiguratorTest {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec = createAndConfigureMediaCodec();

        try {
            mLcc.addMediaCodec(mediaCodec);
            mLcc.setAudioTrack(track);
            verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()), anyList());

            mLcc.removeMediaCodec(mediaCodec);
            verify(mAudioService).removeLoudnessCodecInfo(eq(track.getPlayerIId()), any());
        } finally {
            mediaCodec.release();
        }
    }

    @Test
    @RequiresFlagsEnabled(FLAG_LOUDNESS_CONFIGURATOR_API)
    public void removeWrongMediaCodecAfterSetTrack_triggersIAE() throws Exception {
        final AudioTrack track = createAudioTrack();
        final MediaCodec mediaCodec1 = createAndConfigureMediaCodec();
        final MediaCodec mediaCodec2 = createAndConfigureMediaCodec();

        mLcc.addMediaCodec(createAndConfigureMediaCodec());
        try {
            mLcc.addMediaCodec(mediaCodec1);
            mLcc.setAudioTrack(track);
            verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()), anyList());

            assertThrows(IllegalArgumentException.class,
                () -> mLcc.removeMediaCodec(createAndConfigureMediaCodec()));
                    () -> mLcc.removeMediaCodec(mediaCodec2));
        } finally {
            mediaCodec1.release();
            mediaCodec2.release();
        }
    }

    private static AudioTrack createAudioTrack() {
@@ -250,10 +305,9 @@ public class LoudnessCodecConfiguratorTest {

        MediaExtractor extractor;
        extractor = new MediaExtractor();
        try {
            extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
                testFd.getLength());
        testFd.close();

            assertEquals("wrong number of tracks", 1, extractor.getTrackCount());
            MediaFormat format = extractor.getTrackFormat(0);
            String mime = format.getString(MediaFormat.KEY_MIME);
@@ -262,7 +316,10 @@ public class LoudnessCodecConfiguratorTest {

            Log.v(TAG, "configuring with " + format);
            mediaCodec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);

            return mediaCodec;
        } finally {
            testFd.close();
            extractor.release();
        }
    }
}