# Copyright (c) 2011 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.

{
  'targets': [
    {
      # Note this library is missing an implementation for the video render.
      # For that targets must link with 'video_render' or
      # 'video_render_module_internal_impl' if they want to compile and use
      # the internal render as the default renderer.
      'target_name': 'video_render_module',
      'type': 'static_library',
      'dependencies': [
        'webrtc_utility',
        '<(webrtc_root)/common.gyp:webrtc_common',
        '<(webrtc_root)/common_video/common_video.gyp:common_video',
        '<(webrtc_root)/system_wrappers/system_wrappers.gyp:system_wrappers',
      ],
      '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',
        'video_render_impl.h',
      ],
    },
    {
      # Default video_render_module implementation that only supports external
      # renders.
      'target_name': 'video_render',
      'type': 'static_library',
      'dependencies': [
        'video_render_module',
      ],
      'sources': [
        'video_render_impl.cc',
      ],
    },
  ], # targets

  'conditions': [
    ['build_with_chromium==0', {
      'targets': [
        {
          # video_render_module implementation that supports the internal
          # video_render implementation.
          'target_name': 'video_render_module_internal_impl',
          'type': 'static_library',
          'dependencies': [
            '<(webrtc_root)/common.gyp:webrtc_common',
            'video_render_module',
          ],
          'sources': [
            'video_render_internal_impl.cc',
          ],
           # TODO(andrew): with the proper suffix, these files will be excluded
           # automatically.
          'conditions': [
            ['OS=="android"', {
              'sources': [
                'android/video_render_android_impl.h',
                'android/video_render_android_native_opengl2.h',
                'android/video_render_android_surface_view.h',
                'android/video_render_opengles20.h',
                'android/video_render_android_impl.cc',
                'android/video_render_android_native_opengl2.cc',
                'android/video_render_android_surface_view.cc',
                'android/video_render_opengles20.cc',
              ],
              'link_settings': {
                'libraries': [
                  '-lGLESv2',
                ],
              },
            }],
            ['OS=="ios"', {
              'sources': [
                # iOS
                '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',
              ],
              'xcode_settings': {
                'CLANG_ENABLE_OBJC_ARC': 'YES',
              },
              'all_dependent_settings': {
                'xcode_settings': {
                  'OTHER_LDFLAGS': [
                    '-framework OpenGLES',
                    '-framework QuartzCore',
                    '-framework UIKit',
                  ],
                },
              },
            }],
            ['OS=="linux"', {
              'sources': [
                'linux/video_render_linux_impl.h',
                'linux/video_x11_channel.h',
                'linux/video_x11_render.h',
                'linux/video_render_linux_impl.cc',
                'linux/video_x11_channel.cc',
                'linux/video_x11_render.cc',
              ],
              'link_settings': {
                'libraries': [
                  '-lXext',
                ],
              },
            }],
            ['OS=="mac"', {
              'sources': [
                'mac/cocoa_full_screen_window.h',
                'mac/cocoa_render_view.h',
                'mac/video_render_agl.h',
                'mac/video_render_mac_carbon_impl.h',
                'mac/video_render_mac_cocoa_impl.h',
                'mac/video_render_nsopengl.h',
                'mac/video_render_nsopengl.mm',
                'mac/video_render_mac_cocoa_impl.mm',
                'mac/video_render_agl.cc',
                'mac/video_render_mac_carbon_impl.cc',
                'mac/cocoa_render_view.mm',
                'mac/cocoa_full_screen_window.mm',
              ],
            }],
            ['OS=="win"', {
              'sources': [
                'windows/i_video_render_win.h',
                'windows/video_render_direct3d9.h',
                'windows/video_render_windows_impl.h',
                'windows/video_render_direct3d9.cc',
                'windows/video_render_windows_impl.cc',
              ],
              'include_dirs': [
                '<(directx_sdk_path)/Include',
              ],
            }],
          ] # conditions
        },
      ],
    }], # build_with_chromium==0
    ['include_tests==1', {
      'targets': [
        {
          'target_name': 'video_render_tests',
          'type': 'executable',
          'dependencies': [
            'video_render_module_internal_impl',
            'webrtc_utility',
            '<(webrtc_root)/common.gyp:webrtc_common',
            '<(webrtc_root)/system_wrappers/system_wrappers.gyp:system_wrappers',
            '<(webrtc_root)/common_video/common_video.gyp:common_video',
          ],
          'sources': [
            'test/testAPI/testAPI.cc',
            'test/testAPI/testAPI.h',
            'test/testAPI/testAPI_android.cc',
            'test/testAPI/testAPI_mac.mm',
          ],
          'conditions': [
            ['OS=="mac" or OS=="linux"', {
              'cflags': [
                '-Wno-write-strings',
              ],
              'ldflags': [
                '-lpthread -lm',
              ],
            }],
            ['OS=="linux"', {
              'link_settings': {
                'libraries': [
                  '-lX11',
                ],
              },
            }],
            ['OS=="mac"', {
              'xcode_settings': {
                'OTHER_LDFLAGS': [
                  '-framework Foundation -framework AppKit -framework Cocoa -framework OpenGL',
                ],
              },
            }],
          ] # conditions
        }, # video_render_module_test
      ], # targets
    }], # include_tests==1
  ], # conditions
}

