Android MediaCodecVideoDecoder: Limit max pending frames to number of input buffers

This CL should reduce the number of timeouts for dequeueInputBuffer() which results in the log "MediaCodecVideo: dequeueInputBuffer error" followed by software fallback for VP8/VP9 and codec restart for H264.

A timeout always happen for dequeueInputBuffer() when frames_received_ > frames_decoded_ + num_input_buffers. The following code tries to drain the decoder before enqueuing more input buffers:
// Try to drain the decoder and wait until output is not too
// much behind the input.
if (frames_received_ > frames_decoded_ + max_pending_frames_) {
  ALOGV("Received: %d. Decoded: %d. Wait for output...",
      frames_received_, frames_decoded_);
  if (!DeliverPendingOutputs(jni, kMediaCodecTimeoutMs,
                             true /* dropFrames */)) {
    ALOGE << "DeliverPendingOutputs error";
    return ProcessHWErrorOnCodecThread();
  if (frames_received_ > frames_decoded_ + max_pending_frames_) {
    ALOGE << "Output buffer dequeue timeout";
    return ProcessHWErrorOnCodecThread();

However, for H264, |max_pending_frames_| can currently be larger than the number of input buffers so that the code above is never executed. This CL limits |max_pending_frames_| to the number of input buffers.


Review URL:

Cr-Commit-Position: refs/heads/master@{#10273}
diff --git a/talk/app/webrtc/java/jni/ b/talk/app/webrtc/java/jni/
index 418afe2..ed5ba0b 100644
--- a/talk/app/webrtc/java/jni/
+++ b/talk/app/webrtc/java/jni/
@@ -26,6 +26,7 @@
+#include <algorithm>
 #include <vector>
 #include "talk/app/webrtc/java/jni/androidmediadecoder_jni.h"
@@ -340,6 +341,8 @@
   jobjectArray input_buffers = (jobjectArray)GetObjectField(
       jni, *j_media_codec_video_decoder_, j_input_buffers_field_);
   size_t num_input_buffers = jni->GetArrayLength(input_buffers);
+  max_pending_frames_ =
+      std::min(max_pending_frames_, static_cast<uint32_t>(num_input_buffers));
   for (size_t i = 0; i < num_input_buffers; ++i) {
     input_buffers_[i] =