fake_video_encode_accelerator.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/video/fake_video_encode_accelerator.h"
  5. #include "base/bind.h"
  6. #include "base/check.h"
  7. #include "base/location.h"
  8. #include "base/logging.h"
  9. #include "base/task/sequenced_task_runner.h"
  10. #include "media/base/media_log.h"
  11. #include "media/base/video_frame.h"
  12. namespace media {
  13. static const unsigned int kMinimumInputCount = 1;
  14. FakeVideoEncodeAccelerator::FrameToEncode::FrameToEncode() = default;
  15. FakeVideoEncodeAccelerator::FrameToEncode::FrameToEncode(
  16. const FakeVideoEncodeAccelerator::FrameToEncode&) = default;
  17. FakeVideoEncodeAccelerator::FrameToEncode::~FrameToEncode() = default;
  18. FakeVideoEncodeAccelerator::FakeVideoEncodeAccelerator(
  19. const scoped_refptr<base::SequencedTaskRunner>& task_runner)
  20. : task_runner_(task_runner),
  21. will_initialization_succeed_(true),
  22. will_encoding_succeed_(true),
  23. client_(nullptr),
  24. next_frame_is_first_frame_(true) {}
  25. FakeVideoEncodeAccelerator::~FakeVideoEncodeAccelerator() {
  26. weak_this_factory_.InvalidateWeakPtrs();
  27. }
  28. VideoEncodeAccelerator::SupportedProfiles
  29. FakeVideoEncodeAccelerator::GetSupportedProfiles() {
  30. SupportedProfiles profiles;
  31. SupportedProfile profile;
  32. profile.max_resolution.SetSize(1920, 1088);
  33. profile.max_framerate_numerator = 30;
  34. profile.max_framerate_denominator = 1;
  35. profile.rate_control_modes = media::VideoEncodeAccelerator::kConstantMode;
  36. profile.profile = media::H264PROFILE_MAIN;
  37. profiles.push_back(profile);
  38. profile.profile = media::VP8PROFILE_ANY;
  39. profiles.push_back(profile);
  40. return profiles;
  41. }
  42. bool FakeVideoEncodeAccelerator::Initialize(
  43. const Config& config,
  44. Client* client,
  45. std::unique_ptr<MediaLog> media_log) {
  46. if (!will_initialization_succeed_) {
  47. return false;
  48. }
  49. if (config.output_profile == VIDEO_CODEC_PROFILE_UNKNOWN ||
  50. config.output_profile > VIDEO_CODEC_PROFILE_MAX) {
  51. return false;
  52. }
  53. client_ = client;
  54. task_runner_->PostTask(
  55. FROM_HERE,
  56. base::BindOnce(&FakeVideoEncodeAccelerator::DoRequireBitstreamBuffers,
  57. weak_this_factory_.GetWeakPtr(), kMinimumInputCount,
  58. config.input_visible_size, kMinimumOutputBufferSize));
  59. return true;
  60. }
  61. void FakeVideoEncodeAccelerator::Encode(scoped_refptr<VideoFrame> frame,
  62. bool force_keyframe) {
  63. DCHECK(client_);
  64. FrameToEncode encode;
  65. encode.frame = frame;
  66. encode.force_keyframe = force_keyframe;
  67. queued_frames_.push(encode);
  68. EncodeTask();
  69. }
  70. void FakeVideoEncodeAccelerator::UseOutputBitstreamBuffer(
  71. BitstreamBuffer buffer) {
  72. available_buffers_.push_back(std::move(buffer));
  73. EncodeTask();
  74. }
  75. void FakeVideoEncodeAccelerator::RequestEncodingParametersChange(
  76. const Bitrate& bitrate,
  77. uint32_t framerate) {
  78. // Reject bitrate mode changes.
  79. if (stored_bitrates_.empty() ||
  80. stored_bitrates_.back().mode() == bitrate.mode()) {
  81. stored_bitrates_.push_back(bitrate);
  82. }
  83. }
  84. void FakeVideoEncodeAccelerator::RequestEncodingParametersChange(
  85. const VideoBitrateAllocation& bitrate,
  86. uint32_t framerate) {
  87. stored_bitrate_allocations_.push_back(bitrate);
  88. }
  89. void FakeVideoEncodeAccelerator::Destroy() {
  90. delete this;
  91. }
  92. void FakeVideoEncodeAccelerator::SetWillInitializationSucceed(
  93. bool will_initialization_succeed) {
  94. will_initialization_succeed_ = will_initialization_succeed;
  95. }
  96. void FakeVideoEncodeAccelerator::SetWillEncodingSucceed(
  97. bool will_encoding_succeed) {
  98. will_encoding_succeed_ = will_encoding_succeed;
  99. }
  100. void FakeVideoEncodeAccelerator::DoRequireBitstreamBuffers(
  101. unsigned int input_count,
  102. const gfx::Size& input_coded_size,
  103. size_t output_buffer_size) const {
  104. client_->RequireBitstreamBuffers(input_count, input_coded_size,
  105. output_buffer_size);
  106. }
  107. void FakeVideoEncodeAccelerator::EncodeTask() {
  108. while (!queued_frames_.empty() && !available_buffers_.empty()) {
  109. FrameToEncode frame_to_encode = queued_frames_.front();
  110. BitstreamBuffer buffer = std::move(available_buffers_.front());
  111. available_buffers_.pop_front();
  112. queued_frames_.pop();
  113. if (next_frame_is_first_frame_) {
  114. frame_to_encode.force_keyframe = true;
  115. next_frame_is_first_frame_ = false;
  116. }
  117. task_runner_->PostTask(
  118. FROM_HERE,
  119. base::BindOnce(&FakeVideoEncodeAccelerator::DoBitstreamBufferReady,
  120. weak_this_factory_.GetWeakPtr(), std::move(buffer),
  121. frame_to_encode));
  122. }
  123. }
  124. void FakeVideoEncodeAccelerator::DoBitstreamBufferReady(
  125. BitstreamBuffer buffer,
  126. FrameToEncode frame_to_encode) const {
  127. if (!will_encoding_succeed_) {
  128. client_->NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
  129. return;
  130. }
  131. BitstreamBufferMetadata metadata(kMinimumOutputBufferSize,
  132. frame_to_encode.force_keyframe,
  133. frame_to_encode.frame->timestamp());
  134. if (!encoding_callback_.is_null())
  135. metadata = encoding_callback_.Run(buffer, frame_to_encode.force_keyframe,
  136. frame_to_encode.frame);
  137. client_->BitstreamBufferReady(buffer.id(), metadata);
  138. }
  139. bool FakeVideoEncodeAccelerator::IsGpuFrameResizeSupported() {
  140. return resize_supported_;
  141. }
  142. } // namespace media