OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 | 5 |
6 #include "media/gpu/generic_v4l2_device.h" | 6 #include "media/gpu/generic_v4l2_device.h" |
7 | 7 |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <libdrm/drm_fourcc.h> | 10 #include <libdrm/drm_fourcc.h> |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 #endif | 411 #endif |
412 } | 412 } |
413 | 413 |
414 void GenericV4L2Device::EnumerateDevicesForType(Type type) { | 414 void GenericV4L2Device::EnumerateDevicesForType(Type type) { |
415 static const std::string kDecoderDevicePattern = "/dev/video-dec"; | 415 static const std::string kDecoderDevicePattern = "/dev/video-dec"; |
416 static const std::string kEncoderDevicePattern = "/dev/video-enc"; | 416 static const std::string kEncoderDevicePattern = "/dev/video-enc"; |
417 static const std::string kImageProcessorDevicePattern = "/dev/image-proc"; | 417 static const std::string kImageProcessorDevicePattern = "/dev/image-proc"; |
418 static const std::string kJpegDecoderDevicePattern = "/dev/jpeg-dec"; | 418 static const std::string kJpegDecoderDevicePattern = "/dev/jpeg-dec"; |
419 | 419 |
420 std::string device_pattern; | 420 std::string device_pattern; |
421 v4l2_buf_type buf_type; | 421 std::vector<v4l2_buf_type> buf_types; |
422 switch (type) { | 422 switch (type) { |
423 case Type::kDecoder: | 423 case Type::kDecoder: |
424 device_pattern = kDecoderDevicePattern; | 424 device_pattern = kDecoderDevicePattern; |
425 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; | 425 buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); |
426 break; | 426 break; |
427 case Type::kEncoder: | 427 case Type::kEncoder: |
428 device_pattern = kEncoderDevicePattern; | 428 device_pattern = kEncoderDevicePattern; |
429 buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; | 429 buf_types.push_back(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); |
430 break; | 430 break; |
431 case Type::kImageProcessor: | 431 case Type::kImageProcessor: |
432 device_pattern = kImageProcessorDevicePattern; | 432 device_pattern = kImageProcessorDevicePattern; |
433 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; | 433 buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); |
434 break; | 434 break; |
435 case Type::kJpegDecoder: | 435 case Type::kJpegDecoder: |
436 device_pattern = kJpegDecoderDevicePattern; | 436 device_pattern = kJpegDecoderDevicePattern; |
437 buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT; | 437 buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); |
| 438 buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT); |
438 break; | 439 break; |
439 } | 440 } |
440 | 441 |
441 std::vector<std::string> candidate_paths; | 442 std::vector<std::string> candidate_paths; |
442 | 443 |
443 // TODO(posciak): Remove this legacy unnumbered device once | 444 // TODO(posciak): Remove this legacy unnumbered device once |
444 // all platforms are updated to use numbered devices. | 445 // all platforms are updated to use numbered devices. |
445 candidate_paths.push_back(device_pattern); | 446 candidate_paths.push_back(device_pattern); |
446 | 447 |
447 // We are sandboxed, so we can't query directory contents to check which | 448 // We are sandboxed, so we can't query directory contents to check which |
448 // devices are actually available. Try to open the first 10; if not present, | 449 // devices are actually available. Try to open the first 10; if not present, |
449 // we will just fail to open immediately. | 450 // we will just fail to open immediately. |
450 for (int i = 0; i < 10; ++i) { | 451 for (int i = 0; i < 10; ++i) { |
451 candidate_paths.push_back( | 452 candidate_paths.push_back( |
452 base::StringPrintf("%s%d", device_pattern.c_str(), i)); | 453 base::StringPrintf("%s%d", device_pattern.c_str(), i)); |
453 } | 454 } |
454 | 455 |
455 Devices devices; | 456 Devices devices; |
456 for (const auto& path : candidate_paths) { | 457 for (const auto& path : candidate_paths) { |
457 if (!OpenDevicePath(path, type)) | 458 if (!OpenDevicePath(path, type)) |
458 continue; | 459 continue; |
459 | 460 |
460 const auto& supported_pixelformats = | 461 for (const auto& buf_type : buf_types) { |
461 EnumerateSupportedPixelformats(buf_type); | 462 const auto& supported_pixelformats = |
462 if (!supported_pixelformats.empty()) { | 463 EnumerateSupportedPixelformats(buf_type); |
463 DVLOG(1) << "Found device: " << path; | 464 if (!supported_pixelformats.empty()) { |
464 devices.push_back(std::make_pair(path, supported_pixelformats)); | 465 DVLOG(1) << "Found device: " << path; |
| 466 devices.push_back(std::make_pair(path, supported_pixelformats)); |
| 467 } |
465 } | 468 } |
466 | 469 |
467 CloseDevice(); | 470 CloseDevice(); |
468 } | 471 } |
469 | 472 |
470 DCHECK_EQ(devices_by_type_.count(type), 0u); | 473 DCHECK_EQ(devices_by_type_.count(type), 0u); |
471 devices_by_type_[type] = devices; | 474 devices_by_type_[type] = devices; |
472 } | 475 } |
473 | 476 |
474 const GenericV4L2Device::Devices& GenericV4L2Device::GetDevicesForType( | 477 const GenericV4L2Device::Devices& GenericV4L2Device::GetDevicesForType( |
(...skipping 11 matching lines...) Expand all Loading... |
486 for (const auto& device : devices) { | 489 for (const auto& device : devices) { |
487 if (std::find(device.second.begin(), device.second.end(), pixfmt) != | 490 if (std::find(device.second.begin(), device.second.end(), pixfmt) != |
488 device.second.end()) | 491 device.second.end()) |
489 return device.first; | 492 return device.first; |
490 } | 493 } |
491 | 494 |
492 return std::string(); | 495 return std::string(); |
493 } | 496 } |
494 | 497 |
495 } // namespace media | 498 } // namespace media |
OLD | NEW |