C++程序  |  113行  |  3.88 KB

// 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_VIDEO_DECODE_ACCELERATOR_ADAPTOR_H
#define ANDROID_VIDEO_DECODE_ACCELERATOR_ADAPTOR_H

#include <C2VDACommon.h>

#include <rect.h>
#include <size.h>
#include <video_codecs.h>
#include <video_pixel_format.h>

#include <vector>

namespace android {

// The offset and stride of a video frame plane.
struct VideoFramePlane {
    uint32_t mOffset;
    uint32_t mStride;
};

// The HAL pixel format information supported by Android flexible YUV format.
struct SupportedPixelFormat {
    bool mCrcb;
    bool mSemiplanar;
    HalPixelFormat mPixelFormat;
};

// Video decoder accelerator adaptor interface.
// The adaptor plays the role of providing unified adaptor API functions and client callback to
// codec component side.
// The adaptor API and client callback are modeled after media::VideoDecodeAccelerator which is
// ported from Chrome and are 1:1 mapped with its API functions.
class VideoDecodeAcceleratorAdaptor {
public:
    enum Result {
        SUCCESS = 0,
        ILLEGAL_STATE = 1,
        INVALID_ARGUMENT = 2,
        UNREADABLE_INPUT = 3,
        PLATFORM_FAILURE = 4,
        INSUFFICIENT_RESOURCES = 5,
    };

    // The adaptor client interface. This interface should be implemented in the component side.
    class Client {
    public:
        virtual ~Client() {}

        // Callback to tell client how many and what size of buffers to provide.
        virtual void providePictureBuffers(uint32_t minNumBuffers,
                                           const media::Size& codedSize) = 0;

        // Callback to dismiss picture buffer that was assigned earlier.
        virtual void dismissPictureBuffer(int32_t pictureBufferId) = 0;

        // Callback to deliver decoded pictures ready to be displayed.
        virtual void pictureReady(int32_t pictureBufferId, int32_t bitstreamId,
                                  const media::Rect& cropRect) = 0;

        // Callback to notify that decoder has decoded the end of the bitstream buffer with
        // specified ID.
        virtual void notifyEndOfBitstreamBuffer(int32_t bitstreamId) = 0;

        // Flush completion callback.
        virtual void notifyFlushDone() = 0;

        // Reset completion callback.
        virtual void notifyResetDone() = 0;

        // Callback to notify about errors. Note that errors in initialize() will not be reported
        // here, instead of by its returned value.
        virtual void notifyError(Result error) = 0;
    };

    // Initializes the video decoder with specific profile. This call is synchronous and returns
    // SUCCESS iff initialization is successful.
    virtual Result initialize(media::VideoCodecProfile profile, bool secureMode,
                              Client* client) = 0;

    // Decodes given buffer handle with bitstream ID.
    virtual void decode(int32_t bitstreamId, int handleFd, off_t offset, uint32_t bytesUsed) = 0;

    // Assigns a specified number of picture buffer set to the video decoder.
    virtual void assignPictureBuffers(uint32_t numOutputBuffers) = 0;

    // Imports planes as backing memory for picture buffer with specified ID.
    virtual void importBufferForPicture(int32_t pictureBufferId, HalPixelFormat format,
                                        int handleFd,
                                        const std::vector<VideoFramePlane>& planes) = 0;

    // Sends picture buffer to be reused by the decoder by its piture ID.
    virtual void reusePictureBuffer(int32_t pictureBufferId) = 0;

    // Flushes the decoder.
    virtual void flush() = 0;

    // Resets the decoder.
    virtual void reset() = 0;

    // Destroys the decoder.
    virtual void destroy() = 0;

    virtual ~VideoDecodeAcceleratorAdaptor() {}
};

}  // namespace android

#endif  // ANDROID_VIDEO_DECODE_ACCELERATOR_ADAPTOR_H