SkCodec* SkHeifCodec::NewFromStream(SkStream* stream, Result* result) { std::unique_ptr<SkStream> streamDeleter(stream); std::unique_ptr<HeifDecoder> heifDecoder(createHeifDecoder()); if (heifDecoder.get() == nullptr) { *result = kInternalError; return nullptr; } HeifFrameInfo frameInfo; if (!heifDecoder->init(new SkHeifStreamWrapper(streamDeleter.release()), &frameInfo)) { *result = kInvalidInput; return nullptr; } SkEncodedInfo info = SkEncodedInfo::Make( SkEncodedInfo::kYUV_Color, SkEncodedInfo::kOpaque_Alpha, 8); Origin orientation = get_orientation(frameInfo); sk_sp<SkColorSpace> colorSpace = nullptr; if ((frameInfo.mIccSize > 0) && (frameInfo.mIccData != nullptr)) { SkColorSpace_Base::ICCTypeFlag iccType = SkColorSpace_Base::kRGB_ICCTypeFlag; colorSpace = SkColorSpace_Base::MakeICC( frameInfo.mIccData.get(), frameInfo.mIccSize, iccType); } if (!colorSpace) { colorSpace = SkColorSpace::MakeSRGB(); } *result = kSuccess; return new SkHeifCodec(frameInfo.mWidth, frameInfo.mHeight, info, heifDecoder.release(), std::move(colorSpace), orientation); }
std::unique_ptr<SkCodec> SkHeifCodec::MakeFromStream( std::unique_ptr<SkStream> stream, Result* result) { std::unique_ptr<HeifDecoder> heifDecoder(createHeifDecoder()); if (heifDecoder.get() == nullptr) { *result = kInternalError; return nullptr; } HeifFrameInfo frameInfo; if (!heifDecoder->init(new SkHeifStreamWrapper(stream.release()), &frameInfo)) { *result = kInvalidInput; return nullptr; } std::unique_ptr<SkEncodedInfo::ICCProfile> profile = nullptr; if ((frameInfo.mIccSize > 0) && (frameInfo.mIccData != nullptr)) { // FIXME: Would it be possible to use MakeWithoutCopy? auto icc = SkData::MakeWithCopy(frameInfo.mIccData.get(), frameInfo.mIccSize); profile = SkEncodedInfo::ICCProfile::Make(std::move(icc)); } if (profile && profile->profile()->data_color_space != skcms_Signature_RGB) { // This will result in sRGB. profile = nullptr; } SkEncodedInfo info = SkEncodedInfo::Make(frameInfo.mWidth, frameInfo.mHeight, SkEncodedInfo::kYUV_Color, SkEncodedInfo::kOpaque_Alpha, 8, std::move(profile)); SkEncodedOrigin orientation = get_orientation(frameInfo); *result = kSuccess; return std::unique_ptr<SkCodec>(new SkHeifCodec(std::move(info), heifDecoder.release(), orientation)); }