Commit 9395cc5c authored by Sergey Ulanov's avatar Sergey Ulanov Committed by Commit Bot

[Fuchsia] Use shared_slack for out buffers in video decoder

Previously FuchsiaVideoDecoder was setting
min_buffer_count_for_camping to reserve output buffers. Updated it to
use min_buffer_count_for_shared_slack instead.  Also removed dependency
on StreamBufferConstraints.packet_count_for_client_max, since it's being
deprecated.

Bug: fuchsia:61424, fuchsia:55146
Change-Id: Ice65f44e4f53117a50ceb3c0bb0f82e9326c9957
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2518720
Commit-Queue: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: default avatarDavid Dorwin <ddorwin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825592}
parent d74f175b
...@@ -52,10 +52,16 @@ namespace media { ...@@ -52,10 +52,16 @@ namespace media {
namespace { namespace {
// Maximum number of frames we expect to keep while playing video. Higher values // Number of output buffers allocated "for camping". This value is passed to
// require more memory for output buffers. Lower values make it more likely that // sysmem to ensure that we get one output buffer for the frame currently
// renderer will stall because decoded frames are not available on time. // displayed on the screen.
const uint32_t kMaxUsedOutputFrames = 6; const uint32_t kOutputBuffersForCamping = 1;
// Maximum number of frames we expect to have queued up while playing video.
// Higher values require more memory for output buffers. Lower values make it
// more likely that renderer will stall because decoded frames are not available
// on time.
const uint32_t kMaxUsedOutputBuffers = 5;
// Use 2 buffers for decoder input. Limiting total number of buffers to 2 allows // Use 2 buffers for decoder input. Limiting total number of buffers to 2 allows
// to minimize required memory without significant effect on performance. // to minimize required memory without significant effect on performance.
...@@ -314,8 +320,7 @@ class FuchsiaVideoDecoder : public VideoDecoder, ...@@ -314,8 +320,7 @@ class FuchsiaVideoDecoder : public VideoDecoder,
gfx::SysmemBufferCollectionId output_buffer_collection_id_; gfx::SysmemBufferCollectionId output_buffer_collection_id_;
std::vector<OutputMailbox*> output_mailboxes_; std::vector<OutputMailbox*> output_mailboxes_;
int num_used_output_buffers_ = 0; size_t num_used_output_buffers_ = 0;
int max_used_output_buffers_ = 0;
base::WeakPtr<FuchsiaVideoDecoder> weak_this_; base::WeakPtr<FuchsiaVideoDecoder> weak_this_;
base::WeakPtrFactory<FuchsiaVideoDecoder> weak_factory_; base::WeakPtrFactory<FuchsiaVideoDecoder> weak_factory_;
...@@ -506,7 +511,7 @@ bool FuchsiaVideoDecoder::NeedsBitstreamConversion() const { ...@@ -506,7 +511,7 @@ bool FuchsiaVideoDecoder::NeedsBitstreamConversion() const {
} }
bool FuchsiaVideoDecoder::CanReadWithoutStalling() const { bool FuchsiaVideoDecoder::CanReadWithoutStalling() const {
return num_used_output_buffers_ < max_used_output_buffers_; return num_used_output_buffers_ < kMaxUsedOutputBuffers;
} }
int FuchsiaVideoDecoder::GetMaxDecodeRequests() const { int FuchsiaVideoDecoder::GetMaxDecodeRequests() const {
...@@ -747,32 +752,12 @@ void FuchsiaVideoDecoder::OnOutputConstraints( ...@@ -747,32 +752,12 @@ void FuchsiaVideoDecoder::OnOutputConstraints(
return; return;
} }
if (!output_constraints.has_buffer_constraints()) {
DLOG(ERROR) << "Received OnOutputConstraints() which requires buffer "
"constraints action, but without buffer constraints.";
OnError();
return;
}
const fuchsia::media::StreamBufferConstraints& buffer_constraints =
output_constraints.buffer_constraints();
if (!buffer_constraints.has_packet_count_for_client_max()) {
DLOG(ERROR)
<< "Received OnOutputConstraints() with missing required fields.";
OnError();
return;
}
ReleaseOutputBuffers(); ReleaseOutputBuffers();
// mediacodec API expects odd buffer lifetime ordinal, which is incremented by // mediacodec API expects odd buffer lifetime ordinal, which is incremented by
// 2 for each buffer generation. // 2 for each buffer generation.
output_buffer_lifetime_ordinal_ += 2; output_buffer_lifetime_ordinal_ += 2;
max_used_output_buffers_ = std::min(
kMaxUsedOutputFrames, buffer_constraints.packet_count_for_client_max());
// Create a new sysmem buffer collection token for the output buffers. // Create a new sysmem buffer collection token for the output buffers.
fuchsia::sysmem::BufferCollectionTokenPtr collection_token; fuchsia::sysmem::BufferCollectionTokenPtr collection_token;
sysmem_allocator_.raw()->AllocateSharedCollection( sysmem_allocator_.raw()->AllocateSharedCollection(
...@@ -1032,7 +1017,9 @@ void FuchsiaVideoDecoder::InitializeOutputBufferCollection( ...@@ -1032,7 +1017,9 @@ void FuchsiaVideoDecoder::InitializeOutputBufferCollection(
fuchsia::sysmem::BufferCollectionTokenPtr collection_token_for_gpu) { fuchsia::sysmem::BufferCollectionTokenPtr collection_token_for_gpu) {
fuchsia::sysmem::BufferCollectionConstraints buffer_constraints; fuchsia::sysmem::BufferCollectionConstraints buffer_constraints;
buffer_constraints.usage.none = fuchsia::sysmem::noneUsage; buffer_constraints.usage.none = fuchsia::sysmem::noneUsage;
buffer_constraints.min_buffer_count_for_camping = max_used_output_buffers_; buffer_constraints.min_buffer_count_for_camping = kOutputBuffersForCamping;
buffer_constraints.min_buffer_count_for_shared_slack =
kMaxUsedOutputBuffers - kOutputBuffersForCamping;
output_buffer_collection_->SetConstraints( output_buffer_collection_->SetConstraints(
/*has_constraints=*/true, std::move(buffer_constraints)); /*has_constraints=*/true, std::move(buffer_constraints));
...@@ -1051,9 +1038,6 @@ void FuchsiaVideoDecoder::InitializeOutputBufferCollection( ...@@ -1051,9 +1038,6 @@ void FuchsiaVideoDecoder::InitializeOutputBufferCollection(
settings.set_buffer_lifetime_ordinal(output_buffer_lifetime_ordinal_); settings.set_buffer_lifetime_ordinal(output_buffer_lifetime_ordinal_);
settings.set_buffer_constraints_version_ordinal( settings.set_buffer_constraints_version_ordinal(
constraints.buffer_constraints_version_ordinal()); constraints.buffer_constraints_version_ordinal());
settings.set_packet_count_for_client(max_used_output_buffers_);
settings.set_packet_count_for_server(
constraints.packet_count_for_server_recommended());
settings.set_sysmem_token(std::move(collection_token_for_codec)); settings.set_sysmem_token(std::move(collection_token_for_codec));
decoder_->SetOutputBufferPartialSettings(std::move(settings)); decoder_->SetOutputBufferPartialSettings(std::move(settings));
decoder_->CompleteOutputBufferPartialSettings( decoder_->CompleteOutputBufferPartialSettings(
...@@ -1103,7 +1087,7 @@ void FuchsiaVideoDecoder::OnReuseMailbox(uint32_t buffer_index, ...@@ -1103,7 +1087,7 @@ void FuchsiaVideoDecoder::OnReuseMailbox(uint32_t buffer_index,
uint32_t packet_index) { uint32_t packet_index) {
DCHECK(decoder_); DCHECK(decoder_);
DCHECK_GT(num_used_output_buffers_, 0); DCHECK_GT(num_used_output_buffers_, 0U);
num_used_output_buffers_--; num_used_output_buffers_--;
fuchsia::media::PacketHeader header; fuchsia::media::PacketHeader header;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment