From 39f241ae60695c912854445caca3299f91fb590e Mon Sep 17 00:00:00 2001
From: Shao-Chuan Lee <shaochuan@google.com>
Date: Thu, 2 Jun 2022 14:58:56 +0900
Subject: [PATCH] V4L2EncodeComponent: clamp framerate to at least 1 on dynamic
 framerate change

Dynamic framerate based on timestamps can become zero when input frames
are supplied at >1 sec intervals.

Bug: 228828942
Test: android.media.cts.EncodeVirtualDisplayWithCompositionTest#testVirtualDisplayRecycles
Test: com.google.android.media.gts.RtcVideoCodecTest#testDynamicFramerateChangeVp8
Change-Id: I3ceefaad9b420f86e4f0b524e6f0b5649af9997b
---
 components/V4L2EncodeComponent.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/components/V4L2EncodeComponent.cpp b/components/V4L2EncodeComponent.cpp
index a1b46ab..4ce4404 100644
--- a/components/V4L2EncodeComponent.cpp
+++ b/components/V4L2EncodeComponent.cpp
@@ -756,8 +756,8 @@ bool V4L2EncodeComponent::encode(C2ConstGraphicBlock block, uint64_t index, int6
     // Dynamically adjust framerate based on the frame's timestamp if required.
     constexpr int64_t kMaxFramerateDiff = 5;
     if (mLastFrameTime && (timestamp > *mLastFrameTime)) {
-        int64_t newFramerate =
-                static_cast<int64_t>(std::round(1000000.0 / (timestamp - *mLastFrameTime)));
+        int64_t newFramerate = std::max(
+                static_cast<int64_t>(std::round(1000000.0 / (timestamp - *mLastFrameTime))), 1LL);
         if (abs(mFramerate - newFramerate) > kMaxFramerateDiff) {
             ALOGV("Adjusting framerate to %" PRId64 " based on frame timestamps", newFramerate);
             mInterface->setFramerate(static_cast<uint32_t>(newFramerate));
-- 
GitLab