int w2xconv_convert_rgb(struct W2XConv *conv, unsigned char *dst, size_t dst_step_byte, /* rgb24 (src_w*ratio, src_h*ratio) */ unsigned char *src, size_t src_step_byte, /* rgb24 (src_w, src_h) */ int src_w, int src_h, int denoise_level, /* 0:none, 1:L1 denoise, other:L2 denoise */ double scale, int block_size) { int dst_h = src_h * scale; int dst_w = src_w * scale; cv::Mat srci(src_h, src_w, CV_8UC3, src, src_step_byte); cv::Mat dsti(dst_h, dst_w, CV_8UC3, dst, dst_step_byte); cv::Mat image; bool is_rgb = (conv->impl->scale2_models[0]->getNInputPlanes() == 3); if (is_rgb) { srci.copyTo(image); convert_mat(conv, image, denoise_level, scale, dst_w, dst_h, block_size, w2xc::IMAGE_RGB); image.copyTo(dsti); } else { srci.convertTo(image, CV_32F, 1.0 / 255.0); cv::cvtColor(image, image, cv::COLOR_RGB2YUV); convert_mat(conv, image, denoise_level, scale, dst_w, dst_h, block_size, w2xc::IMAGE_Y); cv::cvtColor(image, image, cv::COLOR_YUV2RGB); image.convertTo(dsti, CV_8U, 255.0); } return 0; }
int w2xconv_convert_yuv(struct W2XConv *conv, unsigned char *dst, size_t dst_step_byte, /* float32x3 (src_w*ratio, src_h*ratio) */ unsigned char *src, size_t src_step_byte, /* float32x3 (src_w, src_h) */ int src_w, int src_h, int denoise_level, /* 0:none, 1:L1 denoise, other:L2 denoise */ double scale, int block_size) { int dst_h = src_h * scale; int dst_w = src_w * scale; bool is_rgb = (conv->impl->scale2_models[0]->getNInputPlanes() == 3); if (is_rgb) { setError(conv, W2XCONV_ERROR_RGB_MODEL_MISMATCH_TO_Y); return -1; } cv::Mat srci(src_h, src_w, CV_32FC3, src, src_step_byte); cv::Mat dsti(dst_h, dst_w, CV_32FC3, dst, dst_step_byte); cv::Mat image = srci.clone(); convert_mat(conv, image, denoise_level, scale, dst_w, dst_h, block_size, w2xc::IMAGE_Y); image.copyTo(dsti); return 0; }
int w2xconv_apply_filter_y(struct W2XConv *conv, enum W2XConvFilterType type, unsigned char *dst, size_t dst_step_byte, /* float32x1 (src_w, src_h) */ unsigned char *src, size_t src_step_byte, /* float32x1 (src_w, src_h) */ int src_w, int src_h, int blockSize) { bool is_rgb = (conv->impl->scale2_models[0]->getNInputPlanes() == 3); if (is_rgb) { setError(conv, W2XCONV_ERROR_RGB_MODEL_MISMATCH_TO_Y); return -1; } struct W2XConvImpl *impl = conv->impl; ComputeEnv *env = &impl->env; W2Mat dsti(src_w, src_h, CV_32FC1, dst, dst_step_byte); W2Mat srci(src_w, src_h, CV_32FC1, src, src_step_byte); std::vector<std::unique_ptr<w2xc::Model> > *mp = NULL; switch (type) { case W2XCONV_FILTER_DENOISE1: mp = &impl->noise1_models; break; case W2XCONV_FILTER_DENOISE2: mp = &impl->noise2_models; break; case W2XCONV_FILTER_SCALE2x: mp = &impl->scale2_models; break; default: return -1; } W2Mat result; w2xc::convertWithModels(conv, env, srci, result, *mp, &conv->flops, blockSize, w2xc::IMAGE_Y, conv->enable_log); for (int yi=0; yi<src_h; yi++) { char *d0 = dsti.ptr<char>(yi); char *s0 = result.ptr<char>(yi); memcpy(d0, s0, src_w * sizeof(float)); } return 0; }
nsresult PluginDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, nsIStreamListener** aDocListener, bool aReset, nsIContentSink* aSink) { // do not allow message panes to host full-page plugins // returning an error causes helper apps to take over nsCOMPtr<nsIDocShellTreeItem> dsti (do_QueryInterface(aContainer)); if (dsti) { bool isMsgPane = false; dsti->NameEquals(NS_LITERAL_STRING("messagepane").get(), &isMsgPane); if (isMsgPane) { return NS_ERROR_FAILURE; } } nsresult rv = MediaDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, aDocListener, aReset, aSink); if (NS_FAILED(rv)) { return rv; } rv = aChannel->GetContentType(mMimeType); if (NS_FAILED(rv)) { return rv; } MediaDocument::UpdateTitleAndCharset(mMimeType); mStreamListener = new PluginStreamListener(this); if (!mStreamListener) { return NS_ERROR_OUT_OF_MEMORY; } NS_ASSERTION(aDocListener, "null aDocListener"); NS_ADDREF(*aDocListener = mStreamListener); return rv; }