public String pendingFramesTimeStamps() {
   threadChecker.checkIsOnValidThread();
   List<Long> timeStampsMs = new ArrayList<Long>();
   for (long ts : timeStampsNs) {
     timeStampsMs.add(TimeUnit.NANOSECONDS.toMillis(ts));
   }
   return timeStampsMs.toString();
 }
 public void frameReturned(long timestamp) {
   threadChecker.checkIsOnValidThread();
   if (!timeStampsNs.contains(timestamp)) {
     throw new IllegalStateException(
         "CameraStatistics.frameReturned called with unknown timestamp " + timestamp);
   }
   timeStampsNs.remove(timestamp);
 }
 // Return number of pending frames that have not been returned.
 public int pendingFramesCount() {
   threadChecker.checkIsOnValidThread();
   return timeStampsNs.size();
 }
 public int getAndResetFrameCount() {
   threadChecker.checkIsOnValidThread();
   int count = frameCount;
   frameCount = 0;
   return count;
 }
 public void addPendingFrame(long timestamp) {
   threadChecker.checkIsOnValidThread();
   ++frameCount;
   timeStampsNs.add(timestamp);
 }
 CameraStatistics(int maxPendingFrames) {
   this.maxPendingFrames = maxPendingFrames;
   threadChecker.detachThread();
 }