# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("../../build/webrtc.gni")

source_set("video_render_module") {
  sources = [
    "external/video_render_external_impl.cc",
    "external/video_render_external_impl.h",
    "i_video_render.h",
    "include/video_render.h",
    "include/video_render_defines.h",
    "incoming_video_stream.cc",
    "incoming_video_stream.h",
    "video_render_frames.cc",
    "video_render_frames.h",
    "video_render_impl.h",
  ]

  deps = [
    "../..:webrtc_common",
    "../../common_video",
    "../../system_wrappers",
    "../utility",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }
}

source_set("video_render") {
  sources = [
    "video_render_impl.cc",
  ]
  deps = [
    ":video_render_module",
    "../../system_wrappers",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }
}

if (!build_with_chromium) {
  config("video_render_internal_impl_config") {
    if (is_ios) {
      libs = [
        "OpenGLES.framework",
        "QuartzCore.framework",
      ]
    }
  }

  source_set("video_render_internal_impl") {
    libs = []
    sources = [
      "video_render_internal_impl.cc",
    ]
    deps = [
      ":video_render_module",
      "../../system_wrappers",
    ]

    if (is_linux) {
      sources += [
        "linux/video_render_linux_impl.cc",
        "linux/video_render_linux_impl.h",
        "linux/video_x11_channel.cc",
        "linux/video_x11_channel.h",
        "linux/video_x11_render.cc",
        "linux/video_x11_render.h",
      ]

      deps += [ "../..:webrtc_common" ]

      libs += [ "Xext" ]
    }
    if (is_mac) {
      sources += [
        "mac/cocoa_full_screen_window.h",
        "mac/cocoa_full_screen_window.mm",
        "mac/cocoa_render_view.h",
        "mac/cocoa_render_view.mm",
        "mac/video_render_agl.cc",
        "mac/video_render_agl.h",
        "mac/video_render_mac_carbon_impl.cc",
        "mac/video_render_mac_carbon_impl.h",
        "mac/video_render_mac_cocoa_impl.h",
        "mac/video_render_mac_cocoa_impl.mm",
        "mac/video_render_nsopengl.h",
        "mac/video_render_nsopengl.mm",
      ]

      libs += [
        "CoreVideo.framework",
        "QTKit.framework",
      ]
    }
    if (is_win) {
      sources += [
        "windows/i_video_render_win.h",
        "windows/video_render_direct3d9.cc",
        "windows/video_render_direct3d9.h",
        "windows/video_render_windows_impl.cc",
        "windows/video_render_windows_impl.h",
      ]

      directxsdk_exists =
        (exec_script("//build/dir_exists.py",
                     [ rebase_path("//third_party/directxsdk/files",
                                   root_build_dir) ],
                     "trim string") == "True")
      if (directxsdk_exists) {
        directxsdk_path = "//third_party/directxsdk/files"
      } else {
        directxsdk_path =
            exec_script("../../build/find_directx_sdk.py", [], "trim string")
      }
      include_dirs = [ directxsdk_path +  "/Include" ]
    }
    if (is_android) {
      sources += [
        "android/video_render_android_impl.cc",
        "android/video_render_android_impl.h",
        "android/video_render_android_native_opengl2.cc",
        "android/video_render_android_native_opengl2.h",
        "android/video_render_android_surface_view.cc",
        "android/video_render_android_surface_view.h",
        "android/video_render_opengles20.cc",
        "android/video_render_opengles20.h",
      ]

      libs += [ "GLESv2" ]
    }
    if (is_ios) {
      sources += [
        "ios/open_gles20.h",
        "ios/open_gles20.mm",
        "ios/video_render_ios_channel.h",
        "ios/video_render_ios_channel.mm",
        "ios/video_render_ios_gles20.h",
        "ios/video_render_ios_gles20.mm",
        "ios/video_render_ios_impl.h",
        "ios/video_render_ios_impl.mm",
        "ios/video_render_ios_view.h",
        "ios/video_render_ios_view.mm",
      ]

      deps += [ "../..:webrtc_common" ]

      cflags += [ "-fobjc-arc" ]  # CLANG_ENABLE_OBJC_ARC = YES.
    }

    all_dependent_configs = [ ":video_render_internal_impl_config"]

    configs += [ "../..:common_config" ]
    public_configs = [ "../..:common_inherited_config" ]

    if (is_clang) {
      # Suppress warnings from Chrome's Clang plugins.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}
