// 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_H
#define ANDROID_C2_VDA_ADAPTOR_H

#include <VideoDecodeAcceleratorAdaptor.h>

#include <video_decode_accelerator.h>

#include <base/macros.h>

namespace android {

// This class translates adaptor API to media::VideoDecodeAccelerator API to make communication
// between Codec 2.0 VDA component and VDA.
class C2VDAAdaptor : public VideoDecodeAcceleratorAdaptor,
                     public media::VideoDecodeAccelerator::Client {
public:
    C2VDAAdaptor();
    ~C2VDAAdaptor() override;

    // 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 bytesUsed) 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;

    static media::VideoDecodeAccelerator::SupportedProfiles GetSupportedProfiles(
            InputCodec inputCodec);

    // Implementation of the media::VideoDecodeAccelerator::Client interface.
    void ProvidePictureBuffers(uint32_t requested_num_of_buffers,
                               media::VideoPixelFormat output_format,
                               const media::Size& dimensions) override;
    void DismissPictureBuffer(int32_t picture_buffer_id) override;
    void PictureReady(const media::Picture& picture) override;
    void NotifyEndOfBitstreamBuffer(int32_t bitstream_buffer_id) override;
    void NotifyFlushDone() override;
    void NotifyResetDone() override;
    void NotifyError(media::VideoDecodeAccelerator::Error error) override;

private:
    std::unique_ptr<media::VideoDecodeAccelerator> mVDA;
    VideoDecodeAcceleratorAdaptor::Client* mClient;

    // The number of allocated output buffers. This is obtained from assignPictureBuffers call from
    // client, and used to check validity of picture id in importBufferForPicture and
    // reusePictureBuffer.
    uint32_t mNumOutputBuffers;
    // The picture size for creating picture buffers. This is obtained while VDA calls
    // ProvidePictureBuffers.
    media::Size mPictureSize;

    DISALLOW_COPY_AND_ASSIGN(C2VDAAdaptor);
};

}  // namespace android

#endif  // ANDROID_C2_VDA_ADAPTOR_H