gpu_video_accelerator_util.cc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. // Copyright 2015 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/gpu/gpu_video_accelerator_util.h"
  5. namespace media {
  6. // Make sure the enum values of VideoCodecProfile and
  7. // gpu::VideoCodecProfile match.
  8. #define STATIC_ASSERT_ENUM_MATCH(name) \
  9. static_assert(name == static_cast<VideoCodecProfile>(gpu::name), \
  10. #name " value must match in media and gpu.")
  11. STATIC_ASSERT_ENUM_MATCH(VIDEO_CODEC_PROFILE_UNKNOWN);
  12. STATIC_ASSERT_ENUM_MATCH(VIDEO_CODEC_PROFILE_MIN);
  13. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_BASELINE);
  14. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_MAIN);
  15. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_EXTENDED);
  16. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH);
  17. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH10PROFILE);
  18. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH422PROFILE);
  19. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH444PREDICTIVEPROFILE);
  20. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_SCALABLEBASELINE);
  21. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_SCALABLEHIGH);
  22. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_STEREOHIGH);
  23. STATIC_ASSERT_ENUM_MATCH(H264PROFILE_MULTIVIEWHIGH);
  24. STATIC_ASSERT_ENUM_MATCH(VP8PROFILE_ANY);
  25. STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE0);
  26. STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE1);
  27. STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE2);
  28. STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE3);
  29. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MAIN);
  30. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MAIN10);
  31. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MAIN_STILL_PICTURE);
  32. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_REXT);
  33. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_HIGH_THROUGHPUT);
  34. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MULTIVIEW_MAIN);
  35. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_SCALABLE_MAIN);
  36. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_3D_MAIN);
  37. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_SCREEN_EXTENDED);
  38. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_SCALABLE_REXT);
  39. STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED);
  40. STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE0);
  41. STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE4);
  42. STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE5);
  43. STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE7);
  44. STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE8);
  45. STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE9);
  46. STATIC_ASSERT_ENUM_MATCH(AV1PROFILE_PROFILE_MAIN);
  47. STATIC_ASSERT_ENUM_MATCH(AV1PROFILE_PROFILE_HIGH);
  48. STATIC_ASSERT_ENUM_MATCH(AV1PROFILE_PROFILE_PRO);
  49. STATIC_ASSERT_ENUM_MATCH(VIDEO_CODEC_PROFILE_MAX);
  50. // static
  51. VideoDecodeAccelerator::Capabilities
  52. GpuVideoAcceleratorUtil::ConvertGpuToMediaDecodeCapabilities(
  53. const gpu::VideoDecodeAcceleratorCapabilities& gpu_capabilities) {
  54. VideoDecodeAccelerator::Capabilities capabilities;
  55. capabilities.supported_profiles =
  56. ConvertGpuToMediaDecodeProfiles(gpu_capabilities.supported_profiles);
  57. capabilities.flags = gpu_capabilities.flags;
  58. return capabilities;
  59. }
  60. // static
  61. VideoDecodeAccelerator::SupportedProfiles
  62. GpuVideoAcceleratorUtil::ConvertGpuToMediaDecodeProfiles(
  63. const gpu::VideoDecodeAcceleratorSupportedProfiles& gpu_profiles) {
  64. VideoDecodeAccelerator::SupportedProfiles profiles;
  65. for (const auto& gpu_profile : gpu_profiles) {
  66. VideoDecodeAccelerator::SupportedProfile profile;
  67. profile.profile = static_cast<VideoCodecProfile>(gpu_profile.profile);
  68. profile.max_resolution = gpu_profile.max_resolution;
  69. profile.min_resolution = gpu_profile.min_resolution;
  70. profile.encrypted_only = gpu_profile.encrypted_only;
  71. profiles.push_back(profile);
  72. }
  73. return profiles;
  74. }
  75. // static
  76. gpu::VideoDecodeAcceleratorCapabilities
  77. GpuVideoAcceleratorUtil::ConvertMediaToGpuDecodeCapabilities(
  78. const VideoDecodeAccelerator::Capabilities& media_capabilities) {
  79. gpu::VideoDecodeAcceleratorCapabilities capabilities;
  80. capabilities.supported_profiles =
  81. ConvertMediaToGpuDecodeProfiles(media_capabilities.supported_profiles);
  82. capabilities.flags = media_capabilities.flags;
  83. return capabilities;
  84. }
  85. // static
  86. gpu::VideoDecodeAcceleratorSupportedProfiles
  87. GpuVideoAcceleratorUtil::ConvertMediaToGpuDecodeProfiles(
  88. const VideoDecodeAccelerator::SupportedProfiles& media_profiles) {
  89. gpu::VideoDecodeAcceleratorSupportedProfiles profiles;
  90. for (const auto& media_profile : media_profiles) {
  91. gpu::VideoDecodeAcceleratorSupportedProfile profile;
  92. profile.profile =
  93. static_cast<gpu::VideoCodecProfile>(media_profile.profile);
  94. profile.max_resolution = media_profile.max_resolution;
  95. profile.min_resolution = media_profile.min_resolution;
  96. profile.encrypted_only = media_profile.encrypted_only;
  97. profiles.push_back(profile);
  98. }
  99. return profiles;
  100. }
  101. // static
  102. gpu::VideoDecodeAcceleratorSupportedProfiles
  103. GpuVideoAcceleratorUtil::ConvertMediaConfigsToGpuDecodeProfiles(
  104. const SupportedVideoDecoderConfigs& configs) {
  105. gpu::VideoDecodeAcceleratorSupportedProfiles profiles;
  106. for (const auto& config : configs) {
  107. for (int i = config.profile_min; i <= config.profile_max; i++) {
  108. gpu::VideoDecodeAcceleratorSupportedProfile profile;
  109. profile.profile = static_cast<gpu::VideoCodecProfile>(i);
  110. profile.min_resolution = config.coded_size_min;
  111. profile.max_resolution = config.coded_size_max;
  112. profile.encrypted_only = config.require_encrypted;
  113. profiles.push_back(profile);
  114. }
  115. }
  116. return profiles;
  117. }
  118. // static
  119. VideoEncodeAccelerator::SupportedProfiles
  120. GpuVideoAcceleratorUtil::ConvertGpuToMediaEncodeProfiles(
  121. const gpu::VideoEncodeAcceleratorSupportedProfiles& gpu_profiles) {
  122. VideoEncodeAccelerator::SupportedProfiles profiles;
  123. for (const auto& gpu_profile : gpu_profiles) {
  124. VideoEncodeAccelerator::SupportedProfile profile;
  125. profile.profile = static_cast<VideoCodecProfile>(gpu_profile.profile);
  126. profile.min_resolution = gpu_profile.min_resolution;
  127. profile.max_resolution = gpu_profile.max_resolution;
  128. profile.max_framerate_numerator = gpu_profile.max_framerate_numerator;
  129. profile.max_framerate_denominator = gpu_profile.max_framerate_denominator;
  130. // If VBR is supported in the future, remove this hard-coding of CBR.
  131. profile.rate_control_modes = media::VideoEncodeAccelerator::kConstantMode;
  132. profiles.push_back(profile);
  133. }
  134. return profiles;
  135. }
  136. // static
  137. gpu::VideoEncodeAcceleratorSupportedProfiles
  138. GpuVideoAcceleratorUtil::ConvertMediaToGpuEncodeProfiles(
  139. const VideoEncodeAccelerator::SupportedProfiles& media_profiles) {
  140. gpu::VideoEncodeAcceleratorSupportedProfiles profiles;
  141. for (const auto& media_profile : media_profiles) {
  142. gpu::VideoEncodeAcceleratorSupportedProfile profile;
  143. profile.profile =
  144. static_cast<gpu::VideoCodecProfile>(media_profile.profile);
  145. profile.min_resolution = media_profile.min_resolution;
  146. profile.max_resolution = media_profile.max_resolution;
  147. profile.max_framerate_numerator = media_profile.max_framerate_numerator;
  148. profile.max_framerate_denominator = media_profile.max_framerate_denominator;
  149. profiles.push_back(profile);
  150. }
  151. return profiles;
  152. }
  153. // static
  154. void GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles(
  155. const VideoDecodeAccelerator::SupportedProfiles& new_profiles,
  156. VideoDecodeAccelerator::SupportedProfiles* media_profiles) {
  157. for (const auto& profile : new_profiles) {
  158. bool duplicate = false;
  159. for (const auto& media_profile : *media_profiles) {
  160. if (media_profile.profile == profile.profile) {
  161. duplicate = true;
  162. break;
  163. }
  164. }
  165. if (!duplicate)
  166. media_profiles->push_back(profile);
  167. }
  168. }
  169. // static
  170. void GpuVideoAcceleratorUtil::InsertUniqueEncodeProfiles(
  171. const VideoEncodeAccelerator::SupportedProfiles& new_profiles,
  172. VideoEncodeAccelerator::SupportedProfiles* media_profiles) {
  173. for (const auto& profile : new_profiles) {
  174. bool duplicate = false;
  175. for (const auto& media_profile : *media_profiles) {
  176. if (media_profile == profile) {
  177. duplicate = true;
  178. break;
  179. }
  180. }
  181. if (!duplicate)
  182. media_profiles->push_back(profile);
  183. }
  184. }
  185. } // namespace media