mojo_jpeg_encode_accelerator_service.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2018 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. #ifndef COMPONENTS_CHROMEOS_CAMERA_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_
  5. #define COMPONENTS_CHROMEOS_CAMERA_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_
  6. #include <stdint.h>
  7. #include <memory>
  8. #include "base/memory/ref_counted.h"
  9. #include "base/threading/thread_checker.h"
  10. #include "components/chromeos_camera/common/jpeg_encode_accelerator.mojom.h"
  11. #include "components/chromeos_camera/gpu_jpeg_encode_accelerator_factory.h"
  12. #include "components/chromeos_camera/jpeg_encode_accelerator.h"
  13. #include "mojo/public/cpp/bindings/pending_receiver.h"
  14. namespace chromeos_camera {
  15. // Implementation of a chromeos_camera::mojom::JpegEncodeAccelerator which runs
  16. // in the GPU process, and wraps a JpegEncodeAccelerator.
  17. class MojoJpegEncodeAcceleratorService
  18. : public chromeos_camera::mojom::JpegEncodeAccelerator,
  19. public JpegEncodeAccelerator::Client {
  20. public:
  21. static void Create(
  22. mojo::PendingReceiver<chromeos_camera::mojom::JpegEncodeAccelerator>
  23. receiver);
  24. MojoJpegEncodeAcceleratorService(const MojoJpegEncodeAcceleratorService&) =
  25. delete;
  26. MojoJpegEncodeAcceleratorService& operator=(
  27. const MojoJpegEncodeAcceleratorService&) = delete;
  28. ~MojoJpegEncodeAcceleratorService() override;
  29. // JpegEncodeAccelerator::Client implementation.
  30. void VideoFrameReady(int32_t task_id, size_t encoded_picture_size) override;
  31. void NotifyError(
  32. int32_t task_id,
  33. ::chromeos_camera::JpegEncodeAccelerator::Status status) override;
  34. private:
  35. using EncodeCallbackMap =
  36. std::unordered_map<int32_t, EncodeWithDmaBufCallback>;
  37. // This constructor internally calls
  38. // media::GpuJpegEncodeAcceleratorFactory::GetAcceleratorFactories() to
  39. // fill |accelerator_factory_functions_|.
  40. MojoJpegEncodeAcceleratorService();
  41. // chromeos_camera::mojom::JpegEncodeAccelerator implementation.
  42. void Initialize(InitializeCallback callback) override;
  43. void OnInitialize(
  44. std::vector<GpuJpegEncodeAcceleratorFactory::CreateAcceleratorCB>
  45. remaining_accelerator_factory_functions,
  46. InitializeCallback init_cb,
  47. chromeos_camera::JpegEncodeAccelerator::Status last_initialize_result);
  48. void InitializeInternal(
  49. std::vector<GpuJpegEncodeAcceleratorFactory::CreateAcceleratorCB>
  50. remaining_accelerator_factory_functions,
  51. InitializeCallback init_cb);
  52. // TODO(wtlee): To be deprecated. (crbug.com/944705)
  53. void EncodeWithFD(int32_t task_id,
  54. mojo::ScopedHandle input_fd,
  55. uint32_t input_buffer_size,
  56. int32_t coded_size_width,
  57. int32_t coded_size_height,
  58. mojo::ScopedHandle exif_fd,
  59. uint32_t exif_buffer_size,
  60. mojo::ScopedHandle output_fd,
  61. uint32_t output_buffer_size,
  62. EncodeWithFDCallback callback) override;
  63. void EncodeWithDmaBuf(
  64. int32_t task_id,
  65. uint32_t input_format,
  66. std::vector<chromeos_camera::mojom::DmaBufPlanePtr> input_planes,
  67. std::vector<chromeos_camera::mojom::DmaBufPlanePtr> output_planes,
  68. mojo::ScopedHandle exif_handle,
  69. uint32_t exif_buffer_size,
  70. int32_t coded_size_width,
  71. int32_t coded_size_height,
  72. int32_t quality,
  73. EncodeWithDmaBufCallback callback) override;
  74. void NotifyEncodeStatus(
  75. int32_t task_id,
  76. size_t encoded_picture_size,
  77. ::chromeos_camera::JpegEncodeAccelerator::Status status);
  78. // A map from task_id to EncodeCallback.
  79. EncodeCallbackMap encode_cb_map_;
  80. // We do not know when OnInitialize() is going to happen with respect to
  81. // EncodeWithFD()/EncodeWithDmaBuf() so this variable is used as an indicator
  82. // to confirm |accelerator_| is ready.
  83. bool accelerator_initialized_;
  84. std::unique_ptr<::chromeos_camera::JpegEncodeAccelerator> accelerator_;
  85. THREAD_CHECKER(thread_checker_);
  86. base::WeakPtrFactory<MojoJpegEncodeAcceleratorService> weak_this_factory_;
  87. };
  88. } // namespace chromeos_camera
  89. #endif // COMPONENTS_CHROMEOS_CAMERA_MOJO_JPEG_ENCODE_ACCELERATOR_SERVICE_H_