/* * Copyright 2015 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_H264_DEC_H_ #define GOLDFISH_MEDIA_H264_DEC_H_ struct h264_init_result_t { uint64_t host_handle; int ret; }; struct h264_result_t { int ret; uint64_t bytesProcessed; }; struct h264_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 MediaH264Decoder { 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: MediaH264Decoder(RenderMode renderMode); virtual ~MediaH264Decoder() = 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 initH264Context(unsigned int width, unsigned int height, unsigned int outWidth, unsigned int outHeight, PixelFormat pixFmt); void resetH264Context(unsigned int width, unsigned int height, unsigned int outWidth, unsigned int outHeight, PixelFormat pixFmt); void destroyH264Context(); h264_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 h264_image_t getImage(); // ask host to render to hostColorBufferId, return only image metadata back to // guest h264_image_t renderOnHostAndReturnImageMetadata(int hostColorBufferId); }; #endif