Index: content/common/gpu/media/android_video_encode_accelerator.cc |
diff --git a/content/common/gpu/media/android_video_encode_accelerator.cc b/content/common/gpu/media/android_video_encode_accelerator.cc |
index 2507ea41c1f9b3c6782adc3681186827433da991..81ba2cd604acaf5b24d28e1936c78d69f59f5d9f 100644 |
--- a/content/common/gpu/media/android_video_encode_accelerator.cc |
+++ b/content/common/gpu/media/android_video_encode_accelerator.cc |
@@ -4,6 +4,9 @@ |
#include "content/common/gpu/media/android_video_encode_accelerator.h" |
+#include <algorithm> |
+#include <vector> |
+ |
#include "base/bind.h" |
#include "base/command_line.h" |
#include "base/logging.h" |
@@ -26,8 +29,9 @@ using media::VideoFrame; |
namespace content { |
-enum { |
+enum PixelFormat { |
// Subset of MediaCodecInfo.CodecCapabilities. |
+ COLOR_FORMAT_YUV420_PLANAR = 19, |
COLOR_FORMAT_YUV420_SEMIPLANAR = 21, |
}; |
@@ -67,6 +71,14 @@ static inline const base::TimeDelta NoWaitTimeOut() { |
return base::TimeDelta::FromMicroseconds(0); |
} |
+static PixelFormat GetSupportedColorFormatForMime(const std::string& mime) { |
+ std::vector<int> formats = MediaCodecBridge::GetEncoderColorFormats(mime); |
+ if (std::find(formats.begin(), formats.end(), COLOR_FORMAT_YUV420_PLANAR) != |
+ formats.end()) |
xhwang
2014/10/13 17:37:35
nit: Seems like GetEncoderColorFormats() should re
changbin
2014/10/15 02:17:10
Done.
|
+ return COLOR_FORMAT_YUV420_PLANAR; |
+ return COLOR_FORMAT_YUV420_SEMIPLANAR; |
xhwang
2014/10/13 17:37:35
Is COLOR_FORMAT_YUV420_SEMIPLANAR always supported
changbin
2014/10/15 02:17:10
Thanks for pointing this out:) I think COLOR_FORMA
|
+} |
+ |
AndroidVideoEncodeAccelerator::AndroidVideoEncodeAccelerator() |
: num_buffers_at_codec_(0), |
num_output_buffers_(-1), |
@@ -142,17 +154,13 @@ bool AndroidVideoEncodeAccelerator::Initialize( |
return false; |
} |
- // TODO(fischman): when there is more HW out there with different color-space |
- // support, this should turn into a negotiation with the codec for supported |
- // formats. For now we use the only format supported by the only available |
- // HW. |
- media_codec_.reset( |
- media::VideoCodecBridge::CreateEncoder(media::kCodecVP8, |
- input_visible_size, |
- initial_bitrate, |
- INITIAL_FRAMERATE, |
- IFRAME_INTERVAL, |
- COLOR_FORMAT_YUV420_SEMIPLANAR)); |
+ media_codec_.reset(media::VideoCodecBridge::CreateEncoder( |
+ media::kCodecVP8, |
+ input_visible_size, |
+ initial_bitrate, |
+ INITIAL_FRAMERATE, |
+ IFRAME_INTERVAL, |
+ GetSupportedColorFormatForMime("video/x-vnd.on2.vp8"))); |
if (!media_codec_) { |
DLOG(ERROR) << "Failed to create/start the codec: " |