C2VDAComponent: Add a parameter for maximum input size
App may set a smaller value for maximum of input buffer size than actually required by mistake.
C2VDAComponent overrides it to 1MB if the value specified by app is smaller than 1MB.
Bug: 116284248
Test: com.google.android.exoplayer.gts.DashTest#testVp9Fixed360p
Change-Id: I0b3b0c945f8b3d66b0f3043d5648c9fda6d2f527
(cherry picked from commit a0adcdfec9dfbf87f5382303594935a9b34f380c)
diff --git a/C2VDAComponent.cpp b/C2VDAComponent.cpp
index e0185ea..34eef94 100644
--- a/C2VDAComponent.cpp
+++ b/C2VDAComponent.cpp
@@ -169,6 +169,35 @@
.withSetter(LocalSetter::SizeSetter)
.build());
+ // App may set a smaller value for maximum of input buffer size than actually required
+ // by mistake. C2VDAComponent overrides it if the value specified by app is smaller than
+ // the calculated value in MaxSizeCalculator().
+ // This value is the default maximum of linear buffer size (kLinearBufferSize) in
+ // CCodecBufferChannel.cpp.
+ constexpr static size_t kLinearBufferSize = 1048576;
+ struct LocalCalculator {
+ static C2R MaxSizeCalculator(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input>& me,
+ const C2P<C2StreamPictureSizeInfo::output>& size) {
+ (void)mayBlock;
+ // TODO: Need larger size?
+ me.set().value = kLinearBufferSize;
+ const uint32_t width = size.v.width;
+ const uint32_t height = size.v.height;
+ // Enlarge the input buffer for 4k video
+ if ((width > 1920 && height > 1080)) {
+ me.set().value = 4 * kLinearBufferSize;
+ }
+ return C2R::Ok();
+ }
+ };
+ addParameter(DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, kLinearBufferSize))
+ .withFields({
+ C2F(mMaxInputSize, value).any(),
+ })
+ .calculatedAs(LocalCalculator::MaxSizeCalculator, mSize)
+ .build());
+
bool secureMode = name.find(".secure") != std::string::npos;
C2Allocator::id_t inputAllocators[] = {secureMode ? C2VDAAllocatorStore::SECURE_LINEAR
: C2PlatformAllocatorStore::ION};