1 // Copyright 2017 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 5 #ifndef ANDROID_VIDEO_DECODE_ACCELERATOR_ADAPTOR_H 6 #define ANDROID_VIDEO_DECODE_ACCELERATOR_ADAPTOR_H 7 8 #include <C2VDACommon.h> 9 10 #include <rect.h> 11 #include <size.h> 12 #include <video_codecs.h> 13 #include <video_pixel_format.h> 14 15 #include <vector> 16 17 namespace android { 18 19 // The offset and stride of a video frame plane. 20 struct VideoFramePlane { 21 uint32_t mOffset; 22 uint32_t mStride; 23 }; 24 25 // Video decoder accelerator adaptor interface. 26 // The adaptor plays the role of providing unified adaptor API functions and client callback to 27 // codec component side. 28 // The adaptor API and client callback are modeled after media::VideoDecodeAccelerator which is 29 // ported from Chrome and are 1:1 mapped with its API functions. 30 class VideoDecodeAcceleratorAdaptor { 31 public: 32 enum Result { 33 SUCCESS = 0, 34 ILLEGAL_STATE = 1, 35 INVALID_ARGUMENT = 2, 36 UNREADABLE_INPUT = 3, 37 PLATFORM_FAILURE = 4, 38 INSUFFICIENT_RESOURCES = 5, 39 }; 40 41 // The adaptor client interface. This interface should be implemented in the component side. 42 class Client { 43 public: ~Client()44 virtual ~Client() {} 45 46 // Callback to tell client how many and what size of buffers to provide. 47 virtual void providePictureBuffers(uint32_t minNumBuffers, 48 const media::Size& codedSize) = 0; 49 50 // Callback to dismiss picture buffer that was assigned earlier. 51 virtual void dismissPictureBuffer(int32_t pictureBufferId) = 0; 52 53 // Callback to deliver decoded pictures ready to be displayed. 54 virtual void pictureReady(int32_t pictureBufferId, int32_t bitstreamId, 55 const media::Rect& cropRect) = 0; 56 57 // Callback to notify that decoder has decoded the end of the bitstream buffer with 58 // specified ID. 59 virtual void notifyEndOfBitstreamBuffer(int32_t bitstreamId) = 0; 60 61 // Flush completion callback. 62 virtual void notifyFlushDone() = 0; 63 64 // Reset completion callback. 65 virtual void notifyResetDone() = 0; 66 67 // Callback to notify about errors. Note that errors in initialize() will not be reported 68 // here, instead of by its returned value. 69 virtual void notifyError(Result error) = 0; 70 }; 71 72 // Initializes the video decoder with specific profile. This call is synchronous and returns 73 // SUCCESS iff initialization is successful. 74 virtual Result initialize(media::VideoCodecProfile profile, bool secureMode, 75 Client* client) = 0; 76 77 // Decodes given buffer handle with bitstream ID. 78 virtual void decode(int32_t bitstreamId, int handleFd, off_t offset, uint32_t bytesUsed) = 0; 79 80 // Assigns a specified number of picture buffer set to the video decoder. 81 virtual void assignPictureBuffers(uint32_t numOutputBuffers) = 0; 82 83 // Imports planes as backing memory for picture buffer with specified ID. 84 virtual void importBufferForPicture(int32_t pictureBufferId, HalPixelFormat format, 85 int handleFd, 86 const std::vector<VideoFramePlane>& planes) = 0; 87 88 // Sends picture buffer to be reused by the decoder by its piture ID. 89 virtual void reusePictureBuffer(int32_t pictureBufferId) = 0; 90 91 // Flushes the decoder. 92 virtual void flush() = 0; 93 94 // Resets the decoder. 95 virtual void reset() = 0; 96 97 // Destroys the decoder. 98 virtual void destroy() = 0; 99 ~VideoDecodeAcceleratorAdaptor()100 virtual ~VideoDecodeAcceleratorAdaptor() {} 101 }; 102 103 } // namespace android 104 105 #endif // ANDROID_VIDEO_DECODE_ACCELERATOR_ADAPTOR_H 106