| /* |
| * Copyright 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef GOLDFISH_MEDIA_Hevc_DEC_H_ |
| #define GOLDFISH_MEDIA_Hevc_DEC_H_ |
| |
| #include "goldfish_media_utils.h" |
| |
| struct hevc_init_result_t { |
| uint64_t host_handle; |
| int ret; |
| }; |
| |
| struct hevc_result_t { |
| int ret; |
| uint64_t bytesProcessed; |
| }; |
| |
| struct hevc_image_t { |
| const uint8_t *data; |
| uint32_t width; |
| uint32_t height; |
| uint64_t pts; // presentation time stamp |
| uint64_t color_primaries; |
| uint64_t color_range; |
| uint64_t color_trc; |
| uint64_t colorspace; |
| // on success, |ret| will indicate the size of |data|. |
| // If failed, |ret| will contain some negative error code. |
| int ret; |
| }; |
| |
| enum class RenderMode { |
| RENDER_BY_HOST_GPU = 1, |
| RENDER_BY_GUEST_CPU = 2, |
| }; |
| |
| class MediaHevcDecoder { |
| uint64_t mHostHandle = 0; |
| uint32_t mVersion = 100; |
| RenderMode mRenderMode = RenderMode::RENDER_BY_GUEST_CPU; |
| |
| bool mHasAddressSpaceMemory = false; |
| uint64_t mAddressOffSet = 0; |
| int mSlot = -1; |
| |
| public: |
| MediaHevcDecoder(RenderMode renderMode); |
| virtual ~MediaHevcDecoder() = default; |
| |
| enum class PixelFormat : uint8_t { |
| YUV420P = 0, |
| UYVY422 = 1, |
| BGRA8888 = 2, |
| }; |
| |
| enum class Err : int { |
| NoErr = 0, |
| NoDecodedFrame = -1, |
| InitContextFailed = -2, |
| DecoderRestarted = -3, |
| NALUIgnored = -4, |
| }; |
| |
| bool getAddressSpaceMemory(); |
| void initHevcContext(unsigned int width, unsigned int height, |
| unsigned int outWidth, unsigned int outHeight, |
| PixelFormat pixFmt); |
| void resetHevcContext(unsigned int width, unsigned int height, |
| unsigned int outWidth, unsigned int outHeight, |
| PixelFormat pixFmt); |
| void destroyHevcContext(); |
| hevc_result_t decodeFrame(uint8_t *img, size_t szBytes, uint64_t pts); |
| void flush(); |
| // ask host to copy image data back to guest, with image metadata |
| // to guest as well |
| hevc_image_t getImage(); |
| // ask host to render to hostColorBufferId, return only image metadata back |
| // to guest |
| hevc_image_t renderOnHostAndReturnImageMetadata(int hostColorBufferId); |
| |
| void sendMetadata(MetaDataColorAspects *ptr); |
| |
| }; |
| #endif |