Index: content/common/gpu/media/v4l2_device.cc |
diff --git a/content/common/gpu/media/v4l2_device.cc b/content/common/gpu/media/v4l2_device.cc |
index 4337f4078aff13a5468fd1a16cede48fe6929b3d..58c8da6fa967fdab821ec05a7bba26f3e85b27ba 100644 |
--- a/content/common/gpu/media/v4l2_device.cc |
+++ b/content/common/gpu/media/v4l2_device.cc |
@@ -5,11 +5,13 @@ |
#include <libdrm/drm_fourcc.h> |
#include <linux/videodev2.h> |
+#include "base/command_line.h" |
#include "base/numerics/safe_conversions.h" |
#include "content/common/gpu/media/generic_v4l2_device.h" |
#if defined(ARCH_CPU_ARMEL) |
#include "content/common/gpu/media/tegra_v4l2_device.h" |
#endif |
+#include "media/base/media_switches.h" |
// TODO(posciak): remove this once V4L2 headers are updated. |
#define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') |
@@ -202,4 +204,81 @@ gfx::Size V4L2Device::CodedSizeFromV4L2Format(struct v4l2_format format) { |
return coded_size; |
} |
+// static |
+std::vector<media::VideoDecodeAccelerator::SupportedProfile> |
+V4L2Device::GetSupportedDecodeProfiles() { |
+ std::vector<media::VideoDecodeAccelerator::SupportedProfile> profiles; |
+ scoped_refptr<V4L2Device> device = Create(kDecoder); |
+ if (!device) |
+ return profiles; |
+ |
+ media::VideoDecodeAccelerator::SupportedProfile profile; |
+ profile.min_resolution.SetSize(16, 16); |
+ // NOTE: additional autodetection logic may require updating input buffer size |
+ // selection. |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kIgnoreResolutionLimitsForAcceleratedVideoDecode)) |
+ profile.max_resolution.SetSize(4096, 2160); |
+ else |
+ profile.max_resolution.SetSize(1920, 1088); |
+ |
+ v4l2_fmtdesc fmtdesc; |
+ memset(&fmtdesc, 0, sizeof(fmtdesc)); |
+ fmtdesc.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; |
+ for (; device->Ioctl(VIDIOC_ENUM_FMT, &fmtdesc) == 0; ++fmtdesc.index) { |
+ switch (fmtdesc.pixelformat) { |
+ case V4L2_PIX_FMT_H264: |
wuchengli
2015/03/18 08:02:37
As discussed, SliceVDA supports V4L2_PIX_FMT_VP8_F
henryhsu
2015/03/18 11:06:09
Done.
|
+ profile.profile = media::H264PROFILE_MAIN; |
+ profiles.push_back(profile); |
+ break; |
+ case V4L2_PIX_FMT_VP8: |
+ profile.profile = media::VP8PROFILE_ANY; |
+ profiles.push_back(profile); |
+ break; |
+ case V4L2_PIX_FMT_VP9: |
+ profile.profile = media::VP9PROFILE_ANY; |
+ profiles.push_back(profile); |
+ break; |
+ } |
+ } |
+ |
+ return profiles; |
+} |
+ |
+// static |
+std::vector<media::VideoEncodeAccelerator::SupportedProfile> |
+V4L2Device::GetSupportedEncodeProfiles() { |
+ std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles; |
+ scoped_refptr<V4L2Device> device = Create(kEncoder); |
+ if (!device) |
+ return profiles; |
+ |
+ media::VideoEncodeAccelerator::SupportedProfile profile; |
+ profile.max_resolution.SetSize(1920, 1088); |
+ profile.max_framerate_numerator = 30; |
+ profile.max_framerate_denominator = 1; |
+ |
+ v4l2_fmtdesc fmtdesc; |
+ memset(&fmtdesc, 0, sizeof(fmtdesc)); |
+ fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; |
+ for (; device->Ioctl(VIDIOC_ENUM_FMT, &fmtdesc) == 0; ++fmtdesc.index) { |
+ switch (fmtdesc.pixelformat) { |
+ case V4L2_PIX_FMT_H264: |
+ profile.profile = media::H264PROFILE_MAIN; |
+ profiles.push_back(profile); |
+ break; |
+ case V4L2_PIX_FMT_VP8: |
+ profile.profile = media::VP8PROFILE_ANY; |
+ profiles.push_back(profile); |
+ break; |
+ case V4L2_PIX_FMT_VP9: |
+ profile.profile = media::VP9PROFILE_ANY; |
+ profiles.push_back(profile); |
+ break; |
+ } |
+ } |
+ |
+ return profiles; |
+} |
+ |
} // namespace content |