| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ANDROID_C2_VDA_ADAPTOR_PROXY_H |
| #define ANDROID_C2_VDA_ADAPTOR_PROXY_H |
| |
| #include <memory> |
| |
| #include <VideoDecodeAcceleratorAdaptor.h> |
| |
| #include <video_decode_accelerator.h> |
| |
| #include <arc/Future.h> |
| #include <mojo/public/cpp/bindings/binding.h> |
| |
| #include <components/arc/common/video.mojom.h> |
| #include <components/arc/common/video_decode_accelerator.mojom.h> |
| |
| namespace arc { |
| class MojoProcessSupport; |
| } // namespace arc |
| |
| namespace android { |
| namespace arc { |
| class C2VDAAdaptorProxy : public VideoDecodeAcceleratorAdaptor, |
| public ::arc::mojom::VideoDecodeClient { |
| public: |
| C2VDAAdaptorProxy(); |
| explicit C2VDAAdaptorProxy(::arc::MojoProcessSupport* MojomProcessSupport); |
| ~C2VDAAdaptorProxy() override; |
| |
| // Establishes ipc channel for video acceleration. Returns true if channel |
| // connected successfully. |
| // This must be called before all other methods. |
| bool establishChannel(); |
| |
| // Implementation of the VideoDecodeAcceleratorAdaptor interface. |
| Result initialize(media::VideoCodecProfile profile, bool secureMode, |
| VideoDecodeAcceleratorAdaptor::Client* client) override; |
| void decode(int32_t bitstreamId, int handleFd, off_t offset, uint32_t size) override; |
| void assignPictureBuffers(uint32_t numOutputBuffers) override; |
| void importBufferForPicture(int32_t pictureBufferId, HalPixelFormat format, int handleFd, |
| const std::vector<VideoFramePlane>& planes) override; |
| void reusePictureBuffer(int32_t pictureBufferId) override; |
| void flush() override; |
| void reset() override; |
| void destroy() override; |
| |
| // ::arc::mojom::VideoDecodeClient implementations. |
| void ProvidePictureBuffers(::arc::mojom::PictureBufferFormatPtr format) override; |
| void PictureReady(::arc::mojom::PicturePtr picture) override; |
| void NotifyEndOfBitstreamBuffer(int32_t bitstream_id) override; |
| void NotifyError(::arc::mojom::VideoDecodeAccelerator::Result error) override; |
| |
| // The following functions are called as callbacks. |
| void NotifyResetDone(::arc::mojom::VideoDecodeAccelerator::Result result); |
| void NotifyFlushDone(::arc::mojom::VideoDecodeAccelerator::Result result); |
| |
| static media::VideoDecodeAccelerator::SupportedProfiles GetSupportedProfiles( |
| uint32_t inputFormatFourcc); |
| static HalPixelFormat ResolveBufferFormat(bool crcb, bool semiplanar); |
| |
| private: |
| void onConnectionError(const std::string& pipeName); |
| void establishChannelOnMojoThread(std::shared_ptr<::arc::Future<bool>> future); |
| void onVersionReady(std::shared_ptr<::arc::Future<bool>> future, uint32_t version); |
| |
| // Closes ipc channel for video acceleration. |
| // This must be called before deleting this object. |
| void closeChannelOnMojoThread(); |
| |
| // mojo thread corresponding part of C2VDAAdaptorProxy implementations. |
| void initializeOnMojoThread(const media::VideoCodecProfile profile, const bool mSecureMode, |
| const ::arc::mojom::VideoDecodeAccelerator::InitializeCallback& cb); |
| void decodeOnMojoThread(int32_t bitstreamId, int ashmemFd, off_t offset, uint32_t bytesUsed); |
| void assignPictureBuffersOnMojoThread(uint32_t numOutputBuffers); |
| |
| void importBufferForPictureOnMojoThread(int32_t pictureBufferId, HalPixelFormat format, |
| int handleFd, |
| const std::vector<VideoFramePlane>& planes); |
| void reusePictureBufferOnMojoThread(int32_t pictureBufferId); |
| void flushOnMojoThread(); |
| void resetOnMojoThread(); |
| |
| VideoDecodeAcceleratorAdaptor::Client* mClient; |
| |
| // Task runner for mojom functions. |
| const scoped_refptr<base::SingleThreadTaskRunner> mMojoTaskRunner; |
| |
| // |mVDAPtr| and |mBinding| should only be called on |mMojoTaskRunner| after bound. |
| ::arc::mojom::VideoDecodeAcceleratorPtr mVDAPtr; |
| mojo::Binding<::arc::mojom::VideoDecodeClient> mBinding; |
| |
| // Used to cancel the wait on arc::Future. |
| sp<::arc::CancellationRelay> mRelay; |
| |
| DISALLOW_COPY_AND_ASSIGN(C2VDAAdaptorProxy); |
| }; |
| } // namespace arc |
| } // namespace android |
| |
| #endif // ANDROID_C2_VDA_ADAPTOR_PROXY_H |