mojo_mjpeg_decode_accelerator_service.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. #ifndef COMPONENTS_CHROMEOS_CAMERA_MOJO_MJPEG_DECODE_ACCELERATOR_SERVICE_H_
  5. #define COMPONENTS_CHROMEOS_CAMERA_MOJO_MJPEG_DECODE_ACCELERATOR_SERVICE_H_
  6. #include <stdint.h>
  7. #include <map>
  8. #include <memory>
  9. #include "base/callback.h"
  10. #include "base/memory/ref_counted.h"
  11. #include "base/threading/thread_checker.h"
  12. #include "components/chromeos_camera/common/mjpeg_decode_accelerator.mojom.h"
  13. #include "components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.h"
  14. #include "components/chromeos_camera/mjpeg_decode_accelerator.h"
  15. #include "mojo/public/cpp/bindings/pending_receiver.h"
  16. namespace chromeos_camera {
  17. // Implementation of a chromeos_camera::mojom::MjpegDecodeAccelerator which runs
  18. // in the GPU process, and wraps a JpegDecodeAccelerator.
  19. class MojoMjpegDecodeAcceleratorService
  20. : public chromeos_camera::mojom::MjpegDecodeAccelerator,
  21. public MjpegDecodeAccelerator::Client {
  22. public:
  23. static void Create(
  24. mojo::PendingReceiver<chromeos_camera::mojom::MjpegDecodeAccelerator>
  25. receiver);
  26. MojoMjpegDecodeAcceleratorService(const MojoMjpegDecodeAcceleratorService&) =
  27. delete;
  28. MojoMjpegDecodeAcceleratorService& operator=(
  29. const MojoMjpegDecodeAcceleratorService&) = delete;
  30. ~MojoMjpegDecodeAcceleratorService() override;
  31. // MjpegDecodeAccelerator::Client implementation.
  32. void VideoFrameReady(int32_t buffer_id) override;
  33. void NotifyError(
  34. int32_t buffer_id,
  35. ::chromeos_camera::MjpegDecodeAccelerator::Error error) override;
  36. private:
  37. // A common wrapper type for Mojo callbacks of Decode* functions.
  38. using MojoCallback = base::OnceCallback<void(
  39. ::chromeos_camera::MjpegDecodeAccelerator::Error)>;
  40. using MojoCallbackMap = std::map<int32_t, MojoCallback>;
  41. // This constructor internally calls
  42. // GpuMjpegDecodeAcceleratorFactory::GetAcceleratorFactories() to
  43. // fill |accelerator_factory_functions_|.
  44. MojoMjpegDecodeAcceleratorService();
  45. // chromeos_camera::mojom::MjpegDecodeAccelerator implementation.
  46. void Initialize(InitializeCallback callback) override;
  47. void Decode(media::BitstreamBuffer input_buffer,
  48. const gfx::Size& coded_size,
  49. mojo::ScopedSharedBufferHandle output_handle,
  50. uint32_t output_buffer_size,
  51. DecodeCallback callback) override;
  52. void DecodeWithDmaBuf(int32_t task_id,
  53. mojo::ScopedHandle src_dmabuf_fd,
  54. uint32_t src_size,
  55. uint32_t src_offset,
  56. mojom::DmaBufVideoFramePtr dst_frame,
  57. DecodeWithDmaBufCallback callback) override;
  58. void Uninitialize() override;
  59. void OnInitialize(
  60. std::vector<GpuMjpegDecodeAcceleratorFactory::CreateAcceleratorCB>
  61. remaining_accelerator_factory_functions,
  62. InitializeCallback init_cb,
  63. bool last_initialize_result);
  64. void InitializeInternal(
  65. std::vector<GpuMjpegDecodeAcceleratorFactory::CreateAcceleratorCB>
  66. remaining_accelerator_factory_functions,
  67. InitializeCallback init_cb);
  68. void NotifyDecodeStatus(
  69. int32_t bitstream_buffer_id,
  70. ::chromeos_camera::MjpegDecodeAccelerator::Error error);
  71. // A map from |task_id| to MojoCallback.
  72. MojoCallbackMap mojo_cb_map_;
  73. bool accelerator_initialized_;
  74. std::unique_ptr<::chromeos_camera::MjpegDecodeAccelerator> accelerator_;
  75. THREAD_CHECKER(thread_checker_);
  76. base::WeakPtrFactory<MojoMjpegDecodeAcceleratorService> weak_this_factory_;
  77. };
  78. } // namespace chromeos_camera
  79. #endif // COMPONENTS_CHROMEOS_CAMERA_MOJO_MJPEG_DECODE_ACCELERATOR_SERVICE_H_