# Copyright 2020 The MediaPipe Authors.
#
# 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.

load("@org_tensorflow//tensorflow:tensorflow.bzl", "pybind_extension")

licenses(["notice"])  # Apache 2.0

package(default_visibility = ["//visibility:public"])

pybind_extension(
    name = "_framework_bindings",
    srcs = ["framework_bindings.cc"],
    linkopts = select({
        "//third_party:opencv_source_build": [],
        "//conditions:default": [
            "-lopencv_core",
            "-lopencv_imgproc",
            "-lopencv_highgui",
            "-lopencv_video",
            "-lopencv_features2d",
            "-lopencv_calib3d",
            "-lopencv_imgcodecs",
        ],
    }),
    module_name = "_framework_bindings",
    deps = [
        ":builtin_calculators",
        ":builtin_task_graphs",
        "//mediapipe/python/pybind:calculator_graph",
        "//mediapipe/python/pybind:image",
        "//mediapipe/python/pybind:image_frame",
        "//mediapipe/python/pybind:matrix",
        "//mediapipe/python/pybind:packet",
        "//mediapipe/python/pybind:packet_creator",
        "//mediapipe/python/pybind:packet_getter",
        "//mediapipe/python/pybind:resource_util",
        "//mediapipe/python/pybind:timestamp",
        "//mediapipe/python/pybind:validated_graph_config",
        "//mediapipe/tasks/python/core/pybind:task_runner",
        "@com_google_absl//absl/strings:str_format",
        "@stblib//:stb_image",
        # Type registration.
        "//mediapipe/framework:basic_types_registration",
        "//mediapipe/framework/formats:classification_registration",
        "//mediapipe/framework/formats:detection_registration",
        "//mediapipe/framework/formats:landmark_registration",
        "//mediapipe/framework/formats:rect_registration",
        "//mediapipe/modules/objectron/calculators:annotation_registration",
    ],
)

cc_library(
    name = "builtin_calculators",
    deps = [
        "//mediapipe/calculators/core:gate_calculator",
        "//mediapipe/calculators/core:pass_through_calculator",
        "//mediapipe/calculators/core:side_packet_to_stream_calculator",
        "//mediapipe/calculators/core:split_proto_list_calculator",
        "//mediapipe/calculators/core:string_to_int_calculator",
        "//mediapipe/calculators/image:image_transformation_calculator",
        "//mediapipe/calculators/util:detection_unique_id_calculator",
        "//mediapipe/modules/face_detection:face_detection_full_range_cpu",
        "//mediapipe/modules/face_detection:face_detection_short_range_cpu",
        "//mediapipe/modules/face_landmark:face_landmark_front_cpu",
        "//mediapipe/modules/hand_landmark:hand_landmark_tracking_cpu",
        "//mediapipe/modules/holistic_landmark:holistic_landmark_cpu",
        "//mediapipe/modules/objectron:objectron_cpu",
        "//mediapipe/modules/palm_detection:palm_detection_cpu",
        "//mediapipe/modules/pose_detection:pose_detection_cpu",
        "//mediapipe/modules/pose_landmark:pose_landmark_by_roi_cpu",
        "//mediapipe/modules/pose_landmark:pose_landmark_cpu",
        "//mediapipe/modules/selfie_segmentation:selfie_segmentation_cpu",
    ],
)

cc_library(
    name = "builtin_task_graphs",
    deps = [
        "//mediapipe/tasks/cc/vision/gesture_recognizer:gesture_recognizer_graph",
        "//mediapipe/tasks/cc/vision/image_classifier:image_classifier_graph",
        "//mediapipe/tasks/cc/vision/image_embedder:image_embedder_graph",
        "//mediapipe/tasks/cc/vision/image_segmenter:image_segmenter_graph",
        "//mediapipe/tasks/cc/vision/object_detector:object_detector_graph",
    ] + select({
        # TODO: Build text_classifier_graph and text_embedder_graph on Windows.
        # TODO: Build audio_classifier_graph and audio_embedder_graph on Windows.
        "//mediapipe:windows": [],
        "//conditions:default": [
            "//mediapipe/tasks/cc/audio/audio_classifier:audio_classifier_graph",
            "//mediapipe/tasks/cc/audio/audio_embedder:audio_embedder_graph",
            "//mediapipe/tasks/cc/text/text_classifier:text_classifier_graph",
            "//mediapipe/tasks/cc/text/text_embedder:text_embedder_graph",
        ],
    }),
)

py_library(
    name = "packet_creator",
    srcs = ["packet_creator.py"],
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
    ],
)

py_library(
    name = "packet_getter",
    srcs = ["packet_getter.py"],
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
    ],
)

py_library(
    name = "solution_base",
    srcs = ["solution_base.py"],
    srcs_version = "PY3",
    visibility = [
        "//mediapipe/python:__subpackages__",
    ],
    deps = [
        ":_framework_bindings",
        ":packet_creator",
        ":packet_getter",
        "//mediapipe/calculators/core:constant_side_packet_calculator_py_pb2",
        "//mediapipe/calculators/image:image_transformation_calculator_py_pb2",
        "//mediapipe/calculators/tensor:tensors_to_detections_calculator_py_pb2",
        "//mediapipe/calculators/util:landmarks_smoothing_calculator_py_pb2",
        "//mediapipe/calculators/util:logic_calculator_py_pb2",
        "//mediapipe/calculators/util:thresholding_calculator_py_pb2",
        "//mediapipe/framework:calculator_py_pb2",
        "//mediapipe/framework/formats:classification_py_pb2",
        "//mediapipe/framework/formats:detection_py_pb2",
        "//mediapipe/framework/formats:landmark_py_pb2",
        "//mediapipe/framework/formats:rect_py_pb2",
        "//mediapipe/modules/objectron/calculators:annotation_py_pb2",
        "//mediapipe/modules/objectron/calculators:lift_2d_frame_annotation_to_3d_calculator_py_pb2",
        "@com_google_protobuf//:protobuf_python",
    ],
)

py_test(
    name = "calculator_graph_test",
    srcs = ["calculator_graph_test.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
        ":packet_creator",
        ":packet_getter",
        "//mediapipe/framework:calculator_py_pb2",
    ],
)

py_test(
    name = "image_test",
    srcs = ["image_test.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
    ],
)

py_test(
    name = "image_frame_test",
    srcs = ["image_frame_test.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
    ],
)

py_test(
    name = "packet_test",
    srcs = ["packet_test.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
        ":packet_creator",
        ":packet_getter",
        "//mediapipe/framework/formats:detection_py_pb2",
    ],
)

py_test(
    name = "timestamp_test",
    srcs = ["timestamp_test.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        ":_framework_bindings",
    ],
)

py_test(
    name = "solution_base_test",
    srcs = ["solution_base_test.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        ":solution_base",
        "//file/google_src",
        "//file/localfile",
        "//mediapipe/calculators/core:gate_calculator",
        "//mediapipe/calculators/core:pass_through_calculator",
        "//mediapipe/calculators/core:side_packet_to_stream_calculator",
        "//mediapipe/calculators/image:image_transformation_calculator",
        "//mediapipe/calculators/util:detection_unique_id_calculator",
        "//mediapipe/calculators/util:to_image_calculator",
        "//mediapipe/framework:calculator_py_pb2",
        "//mediapipe/framework/formats:detection_py_pb2",
        "@com_google_protobuf//:protobuf_python",
    ],
)
