+
+int ff_opencl_filter_work_size_from_image(AVFilterContext *avctx,
+ size_t *work_size,
+ AVFrame *frame, int plane,
+ int block_alignment)
+{
+ cl_mem image;
+ cl_mem_object_type type;
+ size_t width, height;
+ cl_int cle;
+
+ if (frame->format != AV_PIX_FMT_OPENCL) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid frame format %s, "
+ "opencl required.\n", av_get_pix_fmt_name(frame->format));
+ return AVERROR(EINVAL);
+ }
+
+ image = (cl_mem)frame->data[plane];
+ if (!image) {
+ av_log(avctx, AV_LOG_ERROR, "Plane %d required but not set.\n",
+ plane);
+ return AVERROR(EINVAL);
+ }
+
+ cle = clGetMemObjectInfo(image, CL_MEM_TYPE, sizeof(type),
+ &type, NULL);
+ if (cle != CL_SUCCESS) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to query object type of "
+ "plane %d: %d.\n", plane, cle);
+ return AVERROR_UNKNOWN;
+ }
+ if (type != CL_MEM_OBJECT_IMAGE2D) {
+ av_log(avctx, AV_LOG_ERROR, "Plane %d is not a 2D image.\n",
+ plane);
+ return AVERROR(EINVAL);
+ }
+
+ cle = clGetImageInfo(image, CL_IMAGE_WIDTH, sizeof(size_t),
+ &width, NULL);
+ if (cle != CL_SUCCESS) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to query plane %d width: %d.\n",
+ plane, cle);
+ return AVERROR_UNKNOWN;
+ }
+
+ cle = clGetImageInfo(image, CL_IMAGE_HEIGHT, sizeof(size_t),
+ &height, NULL);
+ if (cle != CL_SUCCESS) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to query plane %d height: %d.\n",
+ plane, cle);
+ return AVERROR_UNKNOWN;
+ }
+
+ if (block_alignment) {
+ width = FFALIGN(width, block_alignment);
+ height = FFALIGN(height, block_alignment);
+ }
+
+ work_size[0] = width;
+ work_size[1] = height;
+
+ return 0;
+}
+
+void ff_opencl_print_const_matrix_3x3(AVBPrint *buf, const char *name_str,
+ double mat[3][3])
+{
+ int i, j;
+ av_bprintf(buf, "__constant float %s[9] = {\n", name_str);
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 3; j++)
+ av_bprintf(buf, " %.5ff,", mat[i][j]);
+ av_bprintf(buf, "\n");
+ }
+ av_bprintf(buf, "};\n");
+}