@@ -409,7 +409,7 @@ final class ImageReaderSurfaceProducer
409409 TextureRegistry .ImageConsumer ,
410410 TextureRegistry .OnTrimMemoryListener {
411411 private static final String TAG = "ImageReaderSurfaceProducer" ;
412- private static final int MAX_IMAGES = 4 ;
412+ private static final int MAX_IMAGES = 5 ;
413413
414414 // Flip when debugging to see verbose logs.
415415 private static final boolean VERBOSE_LOGS = false ;
@@ -467,10 +467,11 @@ private class PerImageReader {
467467 } catch (IllegalStateException e ) {
468468 Log .e (TAG , "onImageAvailable acquireLatestImage failed: " + e );
469469 }
470- if (released || closed ) {
470+ if (image == null ) {
471471 return ;
472472 }
473- if (image == null ) {
473+ if (released || closed ) {
474+ image .close ();
474475 return ;
475476 }
476477 onImage (reader , image );
@@ -490,6 +491,9 @@ PerImage queueImage(Image image) {
490491 // If we fall too far behind we will skip some frames.
491492 while (imageQueue .size () > 2 ) {
492493 PerImage r = imageQueue .removeFirst ();
494+ if (VERBOSE_LOGS ) {
495+ Log .i (TAG , "" + reader .hashCode () + " force closed image=" + r .image .hashCode ());
496+ }
493497 r .image .close ();
494498 }
495499 return perImage ;
@@ -529,14 +533,15 @@ PerImageReader getOrCreatePerImageReader(ImageReader reader) {
529533 r = new PerImageReader (reader );
530534 perImageReaders .put (reader , r );
531535 imageReaderQueue .add (r );
536+ if (VERBOSE_LOGS ) {
537+ Log .i (TAG , "imageReaderQueue#=" + imageReaderQueue .size ());
538+ }
532539 }
533540 return r ;
534541 }
535542
536543 void pruneImageReaderQueue () {
537- if (VERBOSE_LOGS ) {
538- Log .i (TAG , "Pruning image reader queue length=" + imageReaderQueue .size ());
539- }
544+ boolean change = false ;
540545 // Prune nodes from the head of the ImageReader queue.
541546 while (imageReaderQueue .size () > 1 ) {
542547 PerImageReader r = imageReaderQueue .peekFirst ();
@@ -547,8 +552,9 @@ void pruneImageReaderQueue() {
547552 imageReaderQueue .removeFirst ();
548553 perImageReaders .remove (r .reader );
549554 r .close ();
555+ change = true ;
550556 }
551- if (VERBOSE_LOGS ) {
557+ if (change && VERBOSE_LOGS ) {
552558 Log .i (TAG , "Pruned image reader queue length=" + imageReaderQueue .size ());
553559 }
554560 }
@@ -569,7 +575,9 @@ void onImage(ImageReader reader, Image image) {
569575 long queueDelta = now - lastQueueTime ;
570576 Log .i (
571577 TAG ,
572- "enqueued image="
578+ ""
579+ + reader .hashCode ()
580+ + " enqueued image="
573581 + queuedImage .image .hashCode ()
574582 + " queueDelta="
575583 + deltaMillis (queueDelta ));
@@ -598,7 +606,9 @@ PerImage dequeueImage() {
598606 long scheduleDelay = now - lastScheduleTime ;
599607 Log .i (
600608 TAG ,
601- "dequeued image="
609+ ""
610+ + reader .reader .hashCode ()
611+ + " dequeued image="
602612 + r .image .hashCode ()
603613 + " queuedFor= "
604614 + deltaMillis (queuedFor )
@@ -612,6 +622,14 @@ PerImage dequeueImage() {
612622 }
613623 }
614624 if (lastDequeuedImage != null ) {
625+ if (VERBOSE_LOGS ) {
626+ Log .i (
627+ TAG ,
628+ ""
629+ + lastReaderDequeuedFrom .reader .hashCode ()
630+ + " closing image="
631+ + lastDequeuedImage .image .hashCode ());
632+ }
615633 // We must keep the last image dequeued open until we are done presenting it.
616634 // We have just dequeued a new image (r). Close the previously dequeued image.
617635 lastDequeuedImage .image .close ();
@@ -642,6 +660,9 @@ private void releaseInternal() {
642660 private void cleanup () {
643661 synchronized (lock ) {
644662 for (PerImageReader pir : perImageReaders .values ()) {
663+ if (lastReaderDequeuedFrom == pir ) {
664+ lastReaderDequeuedFrom = null ;
665+ }
645666 pir .close ();
646667 }
647668 perImageReaders .clear ();
@@ -730,6 +751,9 @@ public int getHeight() {
730751 @ Override
731752 public Surface getSurface () {
732753 PerImageReader pir = getActiveReader ();
754+ if (VERBOSE_LOGS ) {
755+ Log .i (TAG , "" + pir .reader .hashCode () + " returning surface to render a new frame." );
756+ }
733757 return pir .reader .getSurface ();
734758 }
735759
@@ -762,7 +786,13 @@ private PerImageReader getActiveReader() {
762786 if (createNewReader ) {
763787 createNewReader = false ;
764788 // Create a new ImageReader and add it to the queue.
765- return getOrCreatePerImageReader (createImageReader ());
789+ ImageReader reader = createImageReader ();
790+ if (VERBOSE_LOGS ) {
791+ Log .i (
792+ TAG ,
793+ "" + reader .hashCode () + " created w=" + requestedWidth + " h=" + requestedHeight );
794+ }
795+ return getOrCreatePerImageReader (reader );
766796 }
767797 return imageReaderQueue .peekLast ();
768798 }
0 commit comments