diff --git a/sdk/android/src/java/org/webrtc/RefCountDelegate.java b/sdk/android/src/java/org/webrtc/RefCountDelegate.java
index 58be7aa..fc8a191 100644
--- a/sdk/android/src/java/org/webrtc/RefCountDelegate.java
+++ b/sdk/android/src/java/org/webrtc/RefCountDelegate.java
@@ -29,19 +29,12 @@
 
   @Override
   public void retain() {
-    int updated_count = refCount.incrementAndGet();
-    if (updated_count < 2) {
-      throw new IllegalStateException("retain() called on an object with refcount < 1");
-    }
+    refCount.incrementAndGet();
   }
 
   @Override
   public void release() {
-    int updated_count = refCount.decrementAndGet();
-    if (updated_count < 0) {
-      throw new IllegalStateException("release() called on an object with refcount < 1");
-    }
-    if (updated_count == 0 && releaseCallback != null) {
+    if (refCount.decrementAndGet() == 0 && releaseCallback != null) {
       releaseCallback.run();
     }
   }
diff --git a/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java b/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java
index 1b9b566..693dc64 100644
--- a/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java
+++ b/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java
@@ -29,10 +29,7 @@
 import android.media.MediaFormat;
 import android.os.Handler;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -165,25 +162,6 @@
     }
   }
 
-  private static class FakeDecoderCallback implements VideoDecoder.Callback {
-    public final List<VideoFrame> decodedFrames;
-
-    public FakeDecoderCallback() {
-      decodedFrames = new ArrayList<>();
-    }
-
-    @Override
-    public void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp) {
-      frame.retain();
-      decodedFrames.add(frame);
-    }
-
-    public void release() {
-      for (VideoFrame frame : decodedFrames) frame.release();
-      decodedFrames.clear();
-    }
-  }
-
   private EncodedImage createTestEncodedImage() {
     return EncodedImage.builder()
         .setBuffer(ByteBuffer.wrap(ENCODED_TEST_DATA))
@@ -196,7 +174,6 @@
   @Mock private SurfaceTextureHelper mockSurfaceTextureHelper;
   @Mock private VideoDecoder.Callback mockDecoderCallback;
   private FakeMediaCodecWrapper fakeMediaCodecWrapper;
-  private FakeDecoderCallback fakeDecoderCallback;
 
   @Before
   public void setUp() {
@@ -206,12 +183,6 @@
     MediaFormat outputFormat = new MediaFormat();
     // TODO(sakal): Add more details to output format as needed.
     fakeMediaCodecWrapper = spy(new FakeMediaCodecWrapper(outputFormat));
-    fakeDecoderCallback = new FakeDecoderCallback();
-  }
-
-  @After
-  public void cleanUp() {
-    fakeDecoderCallback.release();
   }
 
   @Test
@@ -297,7 +268,7 @@
 
     // Set-up.
     TestDecoder decoder = new TestDecoderBuilder().setUseSurface(/* useSurface = */ false).build();
-    decoder.initDecode(TEST_DECODER_SETTINGS, fakeDecoderCallback);
+    decoder.initDecode(TEST_DECODER_SETTINGS, mockDecoderCallback);
     decoder.decode(createTestEncodedImage(),
         new DecodeInfo(/* isMissingFrames= */ false, /* renderTimeMs= */ 0));
     fakeMediaCodecWrapper.addOutputData(
@@ -307,8 +278,13 @@
     decoder.waitDeliverDecodedFrame();
 
     // Verify.
-    assertThat(fakeDecoderCallback.decodedFrames).hasSize(1);
-    VideoFrame videoFrame = fakeDecoderCallback.decodedFrames.get(0);
+    ArgumentCaptor<VideoFrame> videoFrameCaptor = ArgumentCaptor.forClass(VideoFrame.class);
+    verify(mockDecoderCallback)
+        .onDecodedFrame(videoFrameCaptor.capture(),
+            /* decodeTimeMs= */ any(Integer.class),
+            /* qp= */ any());
+
+    VideoFrame videoFrame = videoFrameCaptor.getValue();
     assertThat(videoFrame).isNotNull();
     assertThat(videoFrame.getRotatedWidth()).isEqualTo(TEST_DECODER_SETTINGS.width);
     assertThat(videoFrame.getRotatedHeight()).isEqualTo(TEST_DECODER_SETTINGS.height);
@@ -370,7 +346,7 @@
   public void testDeliversRenderedBuffers() throws InterruptedException {
     // Set-up.
     TestDecoder decoder = new TestDecoderBuilder().build();
-    decoder.initDecode(TEST_DECODER_SETTINGS, fakeDecoderCallback);
+    decoder.initDecode(TEST_DECODER_SETTINGS, mockDecoderCallback);
     decoder.decode(createTestEncodedImage(),
         new DecodeInfo(/* isMissingFrames= */ false, /* renderTimeMs= */ 0));
     fakeMediaCodecWrapper.addOutputTexture(/* presentationTimestampUs= */ 0, /* flags= */ 0);
@@ -394,13 +370,16 @@
     outputVideoFrame.release();
 
     // Verify.
-    assertThat(fakeDecoderCallback.decodedFrames).hasSize(1);
-    VideoFrame videoFrame = fakeDecoderCallback.decodedFrames.get(0);
+    ArgumentCaptor<VideoFrame> videoFrameCaptor = ArgumentCaptor.forClass(VideoFrame.class);
+    verify(mockDecoderCallback)
+        .onDecodedFrame(videoFrameCaptor.capture(),
+            /* decodeTimeMs= */ any(Integer.class),
+            /* qp= */ any());
+
+    VideoFrame videoFrame = videoFrameCaptor.getValue();
     assertThat(videoFrame).isNotNull();
     assertThat(videoFrame.getBuffer()).isEqualTo(outputTextureBuffer);
 
-    fakeDecoderCallback.release();
-
     verify(releaseCallback).run();
   }
 
