Reorganize gyp for Android

BUG=1120
TEST=trybot, local test on xoom and nexus

Message:
It turned out the last CL can only build neon code that
caused problem on Xoom.

Description:
In order to support audo-cpu-detection, I split files into two gypi files, one
contains non-neon code, antoher one ONLY contains neon specific code, so I can
apply different flags to them. Also created two build targets for each of them

We build for linux as before.

Tested on xoom and nexus S.
Review URL: https://webrtc-codereview.appspot.com/930024

git-svn-id: http://webrtc.googlecode.com/svn/trunk@3141 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/third_party/libvpx/libvpx.gyp b/third_party/libvpx/libvpx.gyp
index 2537ed5..c712b8f 100644
--- a/third_party/libvpx/libvpx.gyp
+++ b/third_party/libvpx/libvpx.gyp
@@ -44,202 +44,30 @@
   },
 
   'conditions': [
-    # TODO(andrew): Hack to ensure we pass -msse2 to gcc on Linux for files
-    # containing SSE intrinsics. This should be handled in the gyp generator
-    # scripts somehow. Clang (default on Mac) doesn't require this.
-    ['target_arch=="ia32" or target_arch=="x64"', {
-      'targets' : [
-        {
-          'target_name': 'libvpx_sse2',
-          'type': 'static_library',
-          'include_dirs': [
-            'source/config/<(OS)/<(target_arch)',
-            '<(libvpx_src_dir)',
-            '<(libvpx_src_dir)/vp8/common',
-            '<(libvpx_src_dir)/vp8/decoder',
-            '<(libvpx_src_dir)/vp8/encoder',
-          ],
-          'sources': [
-            '<(libvpx_src_dir)/vp8/encoder/x86/denoising_sse2.c',
-          ],
-          'conditions': [
-            ['os_posix==1 and OS!="mac"', {
-              'cflags': [ '-msse2', ],
-            }],
-            ['OS=="mac"', {
-              'xcode_settings': {
-                'OTHER_CFLAGS': [ '-msse2', ],
-              },
-            }],
-          ],
-        },
-      ],
-    }],
-    [ 'target_arch!="arm"', {
+    ['OS == "android"', {
       'targets': [
         {
-          # This libvpx target contains both encoder and decoder.
-          # Encoder is configured to be realtime only.
-          'target_name': 'libvpx',
+          'target_name': 'libvpx_arm_neon',
           'type': 'static_library',
-          'variables': {
-            'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/third_party/libvpx',
-            'OS_CATEGORY%': '<(OS_CATEGORY)',
-            'yasm_flags': [
-              '-D', 'CHROMIUM',
-              '-I', 'source/config/<(OS_CATEGORY)/<(target_arch)',
-              '-I', '<(libvpx_src_dir)',
-              '-I', '<(shared_generated_dir)', # Generated assembly offsets
-            ],
-          },
           'dependencies': [
             'gen_asm_offsets',
           ],
           'includes': [
-            '../yasm/yasm_compile.gypi'
+            'libvpx_asm_conversion.gypi',
+            'libvpx_src_neon.gypi',
           ],
-          'include_dirs': [
-            'source/config/<(OS_CATEGORY)/<(target_arch)',
-            '<(libvpx_src_dir)',
-            '<(libvpx_src_dir)/vp8/common',
-            '<(libvpx_src_dir)/vp8/decoder',
-            '<(libvpx_src_dir)/vp8/encoder',
-            '<(shared_generated_dir)', # Provides vpx_rtcd.h.
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '<(libvpx_src_dir)',
-            ],
-          },
-          # VS2010 does not correctly incrementally link obj files generated
-          # from asm files. This flag disables UseLibraryDependencyInputs to
-          # avoid this problem.
-          'msvs_2010_disable_uldi_when_referenced': 1,
-          'conditions': [
-            [ 'target_arch=="ia32"', {
-              'includes': [
-                'libvpx_srcs_x86.gypi',
-              ],
-              'dependencies': [ 'libvpx_sse2', ],
-            }],
-            [ 'target_arch=="x64"', {
-              'includes': [
-                'libvpx_srcs_x86_64.gypi',
-              ],
-              'dependencies': [ 'libvpx_sse2', ],
-            }],
-            ['clang == 1', {
-              'xcode_settings': {
-                'WARNING_CFLAGS': [
-                  # libvpx heavily relies on implicit enum casting.
-                  '-Wno-conversion',
-                  # libvpx does `if ((a == b))` in some places.
-                  '-Wno-parentheses-equality',
-                ],
-              },
-              'cflags': [
-                '-Wno-conversion',
-                '-Wno-parentheses-equality',
-              ],
-            }],
-            [ 'chromeos == 1', {
-              # ChromeOS needs these files for animated WebM avatars.
-              'sources': [
-                '<(libvpx_src_dir)/libmkv/EbmlIDs.h',
-                '<(libvpx_src_dir)/libmkv/EbmlWriter.c',
-                '<(libvpx_src_dir)/libmkv/EbmlWriter.h',
-              ],
-            }],
-          ],
-        },
-      ],
-    },
-    ],
-    # 'libvpx' target for ARM builds.
-    [ 'target_arch=="arm" ', {
-      'targets': [
-        {
-          # This libvpx target contains both encoder and decoder.
-          # Encoder is configured to be realtime only.
-          'target_name': 'libvpx',
-          'type': 'static_library',
-          'dependencies': [
-            'gen_asm_offsets',
-          ],
-
-          # Copy the script to the output folder so that we can use it with
-          # absolute path.
-          'copies': [{
-            'destination': '<(shared_generated_dir)',
-            'files': [
-              '<(ads2gas_script_path)',
-            ],
-          }],
-
-          # Rule to convert .asm files to .S files.
-          'rules': [
-            {
-              'rule_name': 'convert_asm',
-              'extension': 'asm',
-              'inputs': [ '<(shared_generated_dir)/<(ads2gas_script)', ],
-              'outputs': [
-                '<(shared_generated_dir)/<(RULE_INPUT_ROOT).S',
-              ],
-              'action': [
-                'bash',
-                '-c',
-                'cat <(RULE_INPUT_PATH) | perl <(shared_generated_dir)/<(ads2gas_script) > <(shared_generated_dir)/<(RULE_INPUT_ROOT).S',
-              ],
-              'process_outputs_as_sources': 1,
-              'message': 'Convert libvpx asm file for ARM <(RULE_INPUT_PATH).',
-            },
-          ],
-
-          'variables': {
-            # Location of the assembly conversion script.
-            'ads2gas_script': 'ads2gas.pl',
-            'ads2gas_script_path': '<(libvpx_src_dir)/build/make/<(ads2gas_script)',
-          },
           'cflags': [
             # We need to explicitly tell the GCC assembler to look for
             # .include directive files from the place where they're
             # generated to.
             '-Wa,-I,<!(pwd)/source/config/<(OS_CATEGORY)/<(target_arch_full)',
             '-Wa,-I,<(shared_generated_dir)',
+            '-mfpu=neon',
           ],
-          'include_dirs': [
-            'source/config/<(OS_CATEGORY)/<(target_arch_full)',
-            '<(libvpx_src_dir)',
+          'cflags!': [
+            '-mfpu=vfpv3-d16',
           ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '<(libvpx_src_dir)',
-            ],
-          },
           'conditions': [
-            # Libvpx optimizations for ARMv6 or ARMv7 without NEON.
-            ['arm_neon==0', {
-              'includes': [
-                'libvpx_srcs_arm.gypi',
-              ],
-            }],
-            # Libvpx optimizations for ARMv7 with NEON.
-            ['arm_neon==1 or OS == "android"', {
-              'includes': [
-                'libvpx_srcs_arm_neon.gypi',
-              ],
-              'cflags!': [
-                '-mfpu=vfpv3-d16',
-              ], 
-              'cflags': [
-                '-mfpu=neon',
-              ],
-            }],
-            ['OS == "android"', {
-              'cflags': [
-                '-I<(android_ndk_root)/sources/android/cpufeatures',
-              ],
-            }],
             [ 'chromeos == 1', {
               # ChromeOS needs these files for animated WebM avatars.
               'sources': [
@@ -249,9 +77,250 @@
               ],
             }],
           ],
-        },
+        }, # libvpx_arm_neon
+        {
+          'target_name': 'libvpx',
+          'type': 'static_library',
+          'dependencies': [
+            'libvpx_arm_neon',
+            'gen_asm_offsets',
+          ],
+          'includes': [
+            'libvpx_asm_conversion.gypi',
+            'libvpx_src_c.gypi',
+            'libvpx_src_armv5te.gypi',
+            'libvpx_src_armv6.gypi',
+          ],
+          'cflags': [
+            # We need to explicitly tell the GCC assembler to look for
+            # .include directive files from the place where they're
+            # generated to.
+            '-Wa,-I,<!(pwd)/source/config/<(OS_CATEGORY)/<(target_arch_full)',
+            '-Wa,-I,<(shared_generated_dir)',
+            # Extra flags
+            '-mfpu=vfpv3-d16',
+            '-I<(android_ndk_root)/sources/android/cpufeatures',
+          ],
+          'conditions': [
+            [ 'chromeos == 1', {
+              # ChromeOS needs these files for animated WebM avatars.
+              'sources': [
+                '<(libvpx_src_dir)/libmkv/EbmlIDs.h',
+                '<(libvpx_src_dir)/libmkv/EbmlWriter.c',
+                '<(libvpx_src_dir)/libmkv/EbmlWriter.h',
+              ],
+            }],
+          ],
+        }, # target libvpx
       ],
-    }],
+    }, {
+      # TODO(andrew): Hack to ensure we pass -msse2 to gcc on Linux for files
+      # containing SSE intrinsics. This should be handled in the gyp generator
+      # scripts somehow. Clang (default on Mac) doesn't require this.
+      'conditions': [
+      ['target_arch=="ia32" or target_arch=="x64"', {
+        'targets' : [
+          {
+            'target_name': 'libvpx_sse2',
+            'type': 'static_library',
+            'include_dirs': [
+              'source/config/<(OS)/<(target_arch)',
+              '<(libvpx_src_dir)',
+              '<(libvpx_src_dir)/vp8/common',
+              '<(libvpx_src_dir)/vp8/decoder',
+              '<(libvpx_src_dir)/vp8/encoder',
+            ],
+            'sources': [
+              '<(libvpx_src_dir)/vp8/encoder/x86/denoising_sse2.c',
+            ],
+            'conditions': [
+              ['os_posix==1 and OS!="mac"', {
+                'cflags': [ '-msse2', ],
+              }],
+              ['OS=="mac"', {
+                'xcode_settings': {
+                  'OTHER_CFLAGS': [ '-msse2', ],
+                },
+              }],
+            ],
+          },
+        ],
+      }],
+      [ 'target_arch!="arm"', {
+        'targets': [
+          {
+            # This libvpx target contains both encoder and decoder.
+            # Encoder is configured to be realtime only.
+            'target_name': 'libvpx',
+            'type': 'static_library',
+            'variables': {
+              'yasm_output_path':
+                '<(SHARED_INTERMEDIATE_DIR)/third_party/libvpx',
+              'OS_CATEGORY%': '<(OS_CATEGORY)',
+              'yasm_flags': [
+                '-D', 'CHROMIUM',
+                '-I', 'source/config/<(OS_CATEGORY)/<(target_arch)',
+                '-I', '<(libvpx_src_dir)',
+                '-I', '<(shared_generated_dir)', # Generated assembly offsets
+              ],
+            },
+            'dependencies': [
+              'gen_asm_offsets',
+            ],
+            'includes': [
+              '../yasm/yasm_compile.gypi'
+            ],
+            'include_dirs': [
+              'source/config/<(OS_CATEGORY)/<(target_arch)',
+              '<(libvpx_src_dir)',
+              '<(libvpx_src_dir)/vp8/common',
+              '<(libvpx_src_dir)/vp8/decoder',
+              '<(libvpx_src_dir)/vp8/encoder',
+              '<(shared_generated_dir)', # Provides vpx_rtcd.h.
+            ],
+            'direct_dependent_settings': {
+              'include_dirs': [
+                '<(libvpx_src_dir)',
+              ],
+            },
+            # VS2010 does not correctly incrementally link obj files generated
+            # from asm files. This flag disables UseLibraryDependencyInputs to
+            # avoid this problem.
+            'msvs_2010_disable_uldi_when_referenced': 1,
+            'conditions': [
+              [ 'target_arch=="ia32"', {
+                'includes': [
+                  'libvpx_srcs_x86.gypi',
+                ],
+                'dependencies': [ 'libvpx_sse2', ],
+              }],
+              [ 'target_arch=="x64"', {
+                'includes': [
+                  'libvpx_srcs_x86_64.gypi',
+                ],
+                'dependencies': [ 'libvpx_sse2', ],
+              }],
+              ['clang == 1', {
+                'xcode_settings': {
+                  'WARNING_CFLAGS': [
+                    # libvpx heavily relies on implicit enum casting.
+                    '-Wno-conversion',
+                    # libvpx does `if ((a == b))` in some places.
+                    '-Wno-parentheses-equality',
+                  ],
+                },
+                'cflags': [
+                  '-Wno-conversion',
+                  '-Wno-parentheses-equality',
+                ],
+              }],
+              [ 'chromeos == 1', {
+                # ChromeOS needs these files for animated WebM avatars.
+                'sources': [
+                  '<(libvpx_src_dir)/libmkv/EbmlIDs.h',
+                  '<(libvpx_src_dir)/libmkv/EbmlWriter.c',
+                  '<(libvpx_src_dir)/libmkv/EbmlWriter.h',
+                ],
+              }],
+            ],
+          },
+        ],
+      },
+      ],
+      # 'libvpx' target for ARM builds.
+      [ 'target_arch=="arm" ', {
+        'targets': [
+          {
+            # This libvpx target contains both encoder and decoder.
+            # Encoder is configured to be realtime only.
+            'target_name': 'libvpx',
+            'type': 'static_library',
+            'dependencies': [
+              'gen_asm_offsets',
+            ],
+
+            # TODO(leozwang): Replace the following ads2gas block with
+            # libvpx_asm_conversion.gypi.
+            # Copy the script to the output folder so that we can use it with
+            # absolute path.
+            'copies': [{
+              'destination': '<(shared_generated_dir)',
+              'files': [
+                '<(ads2gas_script_path)',
+              ],
+            }],
+
+            # Rule to convert .asm files to .S files.
+            'rules': [
+              {
+                'rule_name': 'convert_asm',
+                'extension': 'asm',
+                'inputs': [ '<(shared_generated_dir)/<(ads2gas_script)', ],
+                'outputs': [
+                  '<(shared_generated_dir)/<(RULE_INPUT_ROOT).S',
+                ],
+                'action': [
+                  'bash',
+                  '-c',
+                  'cat <(RULE_INPUT_PATH) | '
+                    'perl <(shared_generated_dir)/<(ads2gas_script) >'
+                    ' <(shared_generated_dir)/<(RULE_INPUT_ROOT).S',
+                ],
+                'process_outputs_as_sources': 1,
+                'message':
+                  'Convert libvpx asm file for ARM <(RULE_INPUT_PATH).',
+              },
+            ],
+
+            'variables': {
+              # Location of the assembly conversion script.
+              'ads2gas_script': 'ads2gas.pl',
+              'ads2gas_script_path':
+                '<(libvpx_src_dir)/build/make/<(ads2gas_script)',
+            },
+            'cflags': [
+              # We need to explicitly tell the GCC assembler to look for
+              # .include directive files from the place where they're
+              # generated to.
+              '-Wa,-I,<!(pwd)/source/config/<(OS_CATEGORY)/<(target_arch_full)',
+              '-Wa,-I,<(shared_generated_dir)',
+            ],
+            'include_dirs': [
+              'source/config/<(OS_CATEGORY)/<(target_arch_full)',
+              '<(libvpx_src_dir)',
+            ],
+            'direct_dependent_settings': {
+              'include_dirs': [
+                '<(libvpx_src_dir)',
+              ],
+            },
+            'conditions': [
+              # Libvpx optimizations for ARMv6 or ARMv7 without NEON.
+              ['arm_neon==0', {
+                'includes': [
+                  'libvpx_srcs_arm.gypi',
+                ],
+              }],
+              # Libvpx optimizations for ARMv7 with NEON.
+              ['arm_neon==1', {
+                'includes': [
+                  'libvpx_srcs_arm_neon.gypi',
+                ],
+              }],
+              [ 'chromeos == 1', {
+                # ChromeOS needs these files for animated WebM avatars.
+                'sources': [
+                  '<(libvpx_src_dir)/libmkv/EbmlIDs.h',
+                  '<(libvpx_src_dir)/libmkv/EbmlWriter.c',
+                  '<(libvpx_src_dir)/libmkv/EbmlWriter.h',
+                ],
+              }],
+            ],
+          },
+        ],
+      }],
+    ],
+  }],
   ],
   'targets': [
     {
diff --git a/third_party/libvpx/libvpx_asm_conversion.gypi b/third_party/libvpx/libvpx_asm_conversion.gypi
new file mode 100644
index 0000000..a3a3914
--- /dev/null
+++ b/third_party/libvpx/libvpx_asm_conversion.gypi
@@ -0,0 +1,55 @@
+# Copyright (c) 2012 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.
+
+# This script is called from libvpx.gypi. It generates .S files from
+# .asm. Converts from ARM syntax used in the RealView Compiler Tools
+# (RVCT) to Gnu Assembler Syntax (GAS).
+
+{
+  # Copy the script to the output folder so that we can use it with
+  # absolute path.
+  'copies': [{
+    'destination': '<(shared_generated_dir)',
+    'files': [
+      '<(ads2gas_script_path)',
+    ],
+  }],
+  # Rule to convert .asm files to .S files.
+  'rules': [{
+    'rule_name': 'convert_asm',
+    'extension': 'asm',
+    'inputs': [ '<(shared_generated_dir)/<(ads2gas_script)', ],
+    'outputs': [
+      '<(shared_generated_dir)/<(RULE_INPUT_ROOT).S',
+    ],
+    'action': [
+      'bash',
+      '-c',
+      'cat <(RULE_INPUT_PATH) |'
+        'perl <(shared_generated_dir)/<(ads2gas_script) >'
+        '<(shared_generated_dir)/<(RULE_INPUT_ROOT).S',
+    ],
+    'process_outputs_as_sources': 1,
+    'message': 'Convert libvpx asm file for ARM <(RULE_INPUT_PATH).',
+  }],
+  'variables': {
+    # Location of the assembly conversion script.
+    'ads2gas_script': 'ads2gas.pl',
+    'ads2gas_script_path':
+      '<(libvpx_src_dir)/build/make/<(ads2gas_script)',
+  },
+  'include_dirs': [
+    'source/config/<(OS_CATEGORY)/<(target_arch_full)',
+    '<(libvpx_src_dir)',
+  ],
+  'direct_dependent_settings': {
+    'include_dirs': [
+      '<(libvpx_src_dir)',
+    ],
+  },
+}
\ No newline at end of file
diff --git a/third_party/libvpx/libvpx_src_armv5te.gypi b/third_party/libvpx/libvpx_src_armv5te.gypi
new file mode 100644
index 0000000..675576d
--- /dev/null
+++ b/third_party/libvpx/libvpx_src_armv5te.gypi
@@ -0,0 +1,13 @@
+# This file is generated. Do not edit.
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'sources': [
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv5te/boolhuff_armv5te.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv5te/vp8_packtokens_armv5.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv5te/vp8_packtokens_mbrow_armv5.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv5te/vp8_packtokens_partitions_armv5.asm',
+  ],
+}
diff --git a/third_party/libvpx/libvpx_src_armv6.gypi b/third_party/libvpx/libvpx_src_armv6.gypi
new file mode 100644
index 0000000..04b6181
--- /dev/null
+++ b/third_party/libvpx/libvpx_src_armv6.gypi
@@ -0,0 +1,35 @@
+# This file is generated. Do not edit.
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'sources': [
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/bilinearfilter_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/copymem16x16_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/copymem8x4_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/copymem8x8_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/dc_only_idct_add_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/dequant_idct_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/dequantize_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/filter_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/idct_blk_v6.c',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/idct_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/intra4x4_predict_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/iwalsh_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/loopfilter_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/simpleloopfilter_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/sixtappredict8x4_v6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/vp8_sad16x16_armv6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/vp8_variance16x16_armv6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/vp8_variance8x8_armv6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/vp8_variance_halfpixvar16x16_h_armv6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/vp8_variance_halfpixvar16x16_hv_armv6.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/armv6/vp8_variance_halfpixvar16x16_v_armv6.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv6/vp8_fast_quantize_b_armv6.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv6/vp8_mse16x16_armv6.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv6/vp8_short_fdct4x4_armv6.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv6/vp8_subtract_armv6.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/armv6/walsh_v6.asm',
+  ],
+}
diff --git a/third_party/libvpx/libvpx_src_c.gypi b/third_party/libvpx/libvpx_src_c.gypi
new file mode 100644
index 0000000..15b0db7
--- /dev/null
+++ b/third_party/libvpx/libvpx_src_c.gypi
@@ -0,0 +1,176 @@
+# This file is generated. Do not edit.
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'sources': [
+    '<(libvpx_src_dir)/vp8/common/alloccommon.c',
+    '<(libvpx_src_dir)/vp8/common/alloccommon.h',
+    '<(libvpx_src_dir)/vp8/common/arm/dequantize_arm.c',
+    '<(libvpx_src_dir)/vp8/common/arm/filter_arm.c',
+    '<(libvpx_src_dir)/vp8/common/arm/loopfilter_arm.c',
+    '<(libvpx_src_dir)/vp8/common/arm/reconintra_arm.c',
+    '<(libvpx_src_dir)/vp8/common/arm/variance_arm.c',
+    '<(libvpx_src_dir)/vp8/common/blockd.c',
+    '<(libvpx_src_dir)/vp8/common/blockd.h',
+    '<(libvpx_src_dir)/vp8/common/coefupdateprobs.h',
+    '<(libvpx_src_dir)/vp8/common/common.h',
+    '<(libvpx_src_dir)/vp8/common/debugmodes.c',
+    '<(libvpx_src_dir)/vp8/common/default_coef_probs.h',
+    '<(libvpx_src_dir)/vp8/common/dequantize.c',
+    '<(libvpx_src_dir)/vp8/common/entropy.c',
+    '<(libvpx_src_dir)/vp8/common/entropy.h',
+    '<(libvpx_src_dir)/vp8/common/entropymode.c',
+    '<(libvpx_src_dir)/vp8/common/entropymode.h',
+    '<(libvpx_src_dir)/vp8/common/entropymv.c',
+    '<(libvpx_src_dir)/vp8/common/entropymv.h',
+    '<(libvpx_src_dir)/vp8/common/extend.c',
+    '<(libvpx_src_dir)/vp8/common/extend.h',
+    '<(libvpx_src_dir)/vp8/common/filter.c',
+    '<(libvpx_src_dir)/vp8/common/filter.h',
+    '<(libvpx_src_dir)/vp8/common/findnearmv.c',
+    '<(libvpx_src_dir)/vp8/common/findnearmv.h',
+    '<(libvpx_src_dir)/vp8/common/generic/systemdependent.c',
+    '<(libvpx_src_dir)/vp8/common/header.h',
+    '<(libvpx_src_dir)/vp8/common/idct_blk.c',
+    '<(libvpx_src_dir)/vp8/common/idctllm.c',
+    '<(libvpx_src_dir)/vp8/common/invtrans.h',
+    '<(libvpx_src_dir)/vp8/common/loopfilter.c',
+    '<(libvpx_src_dir)/vp8/common/loopfilter_filters.c',
+    '<(libvpx_src_dir)/vp8/common/loopfilter.h',
+    '<(libvpx_src_dir)/vp8/common/mbpitch.c',
+    '<(libvpx_src_dir)/vp8/common/mfqe.c',
+    '<(libvpx_src_dir)/vp8/common/modecont.c',
+    '<(libvpx_src_dir)/vp8/common/modecont.h',
+    '<(libvpx_src_dir)/vp8/common/mv.h',
+    '<(libvpx_src_dir)/vp8/common/onyxc_int.h',
+    '<(libvpx_src_dir)/vp8/common/onyxd.h',
+    '<(libvpx_src_dir)/vp8/common/onyx.h',
+    '<(libvpx_src_dir)/vp8/common/postproc.c',
+    '<(libvpx_src_dir)/vp8/common/postproc.h',
+    '<(libvpx_src_dir)/vp8/common/ppflags.h',
+    '<(libvpx_src_dir)/vp8/common/pragmas.h',
+    '<(libvpx_src_dir)/vp8/common/quant_common.c',
+    '<(libvpx_src_dir)/vp8/common/quant_common.h',
+    '<(libvpx_src_dir)/vp8/common/reconinter.c',
+    '<(libvpx_src_dir)/vp8/common/reconinter.h',
+    '<(libvpx_src_dir)/vp8/common/reconintra4x4.c',
+    '<(libvpx_src_dir)/vp8/common/reconintra4x4.h',
+    '<(libvpx_src_dir)/vp8/common/reconintra.c',
+    '<(libvpx_src_dir)/vp8/common/rtcd.c',
+    '<(libvpx_src_dir)/vp8/common/sad_c.c',
+    '<(libvpx_src_dir)/vp8/common/setupintrarecon.c',
+    '<(libvpx_src_dir)/vp8/common/setupintrarecon.h',
+    '<(libvpx_src_dir)/vp8/common/swapyv12buffer.c',
+    '<(libvpx_src_dir)/vp8/common/swapyv12buffer.h',
+    '<(libvpx_src_dir)/vp8/common/systemdependent.h',
+    '<(libvpx_src_dir)/vp8/common/threading.h',
+    '<(libvpx_src_dir)/vp8/common/treecoder.c',
+    '<(libvpx_src_dir)/vp8/common/treecoder.h',
+    '<(libvpx_src_dir)/vp8/common/variance_c.c',
+    '<(libvpx_src_dir)/vp8/common/variance.h',
+    '<(libvpx_src_dir)/vp8/common/vp8_entropymodedata.h',
+    '<(libvpx_src_dir)/vp8/decoder/dboolhuff.c',
+    '<(libvpx_src_dir)/vp8/decoder/dboolhuff.h',
+    '<(libvpx_src_dir)/vp8/decoder/decodemv.c',
+    '<(libvpx_src_dir)/vp8/decoder/decodemv.h',
+    '<(libvpx_src_dir)/vp8/decoder/decoderthreading.h',
+    '<(libvpx_src_dir)/vp8/decoder/decodframe.c',
+    '<(libvpx_src_dir)/vp8/decoder/detokenize.c',
+    '<(libvpx_src_dir)/vp8/decoder/detokenize.h',
+    '<(libvpx_src_dir)/vp8/decoder/ec_types.h',
+    '<(libvpx_src_dir)/vp8/decoder/error_concealment.c',
+    '<(libvpx_src_dir)/vp8/decoder/error_concealment.h',
+    '<(libvpx_src_dir)/vp8/decoder/onyxd_if.c',
+    '<(libvpx_src_dir)/vp8/decoder/onyxd_int.h',
+    '<(libvpx_src_dir)/vp8/decoder/threading.c',
+    '<(libvpx_src_dir)/vp8/decoder/treereader.h',
+    '<(libvpx_src_dir)/vp8/encoder/arm/boolhuff_arm.c',
+    '<(libvpx_src_dir)/vp8/encoder/arm/dct_arm.c',
+    '<(libvpx_src_dir)/vp8/encoder/arm/quantize_arm.c',
+    '<(libvpx_src_dir)/vp8/encoder/bitstream.c',
+    '<(libvpx_src_dir)/vp8/encoder/bitstream.h',
+    '<(libvpx_src_dir)/vp8/encoder/block.h',
+    '<(libvpx_src_dir)/vp8/encoder/boolhuff.h',
+    '<(libvpx_src_dir)/vp8/encoder/dct.c',
+    '<(libvpx_src_dir)/vp8/encoder/dct_value_cost.h',
+    '<(libvpx_src_dir)/vp8/encoder/dct_value_tokens.h',
+    '<(libvpx_src_dir)/vp8/encoder/defaultcoefcounts.h',
+    '<(libvpx_src_dir)/vp8/encoder/denoising.c',
+    '<(libvpx_src_dir)/vp8/encoder/denoising.h',
+    '<(libvpx_src_dir)/vp8/encoder/encodeframe.c',
+    '<(libvpx_src_dir)/vp8/encoder/encodeframe.h',
+    '<(libvpx_src_dir)/vp8/encoder/encodeintra.c',
+    '<(libvpx_src_dir)/vp8/encoder/encodeintra.h',
+    '<(libvpx_src_dir)/vp8/encoder/encodemb.c',
+    '<(libvpx_src_dir)/vp8/encoder/encodemb.h',
+    '<(libvpx_src_dir)/vp8/encoder/encodemv.c',
+    '<(libvpx_src_dir)/vp8/encoder/encodemv.h',
+    '<(libvpx_src_dir)/vp8/encoder/ethreading.c',
+    '<(libvpx_src_dir)/vp8/encoder/firstpass.h',
+    '<(libvpx_src_dir)/vp8/encoder/lookahead.c',
+    '<(libvpx_src_dir)/vp8/encoder/lookahead.h',
+    '<(libvpx_src_dir)/vp8/encoder/mcomp.c',
+    '<(libvpx_src_dir)/vp8/encoder/mcomp.h',
+    '<(libvpx_src_dir)/vp8/encoder/modecosts.c',
+    '<(libvpx_src_dir)/vp8/encoder/modecosts.h',
+    '<(libvpx_src_dir)/vp8/encoder/mr_dissim.c',
+    '<(libvpx_src_dir)/vp8/encoder/mr_dissim.h',
+    '<(libvpx_src_dir)/vp8/encoder/onyx_if.c',
+    '<(libvpx_src_dir)/vp8/encoder/onyx_int.h',
+    '<(libvpx_src_dir)/vp8/encoder/pickinter.c',
+    '<(libvpx_src_dir)/vp8/encoder/pickinter.h',
+    '<(libvpx_src_dir)/vp8/encoder/picklpf.c',
+    '<(libvpx_src_dir)/vp8/encoder/psnr.c',
+    '<(libvpx_src_dir)/vp8/encoder/psnr.h',
+    '<(libvpx_src_dir)/vp8/encoder/quantize.c',
+    '<(libvpx_src_dir)/vp8/encoder/quantize.h',
+    '<(libvpx_src_dir)/vp8/encoder/ratectrl.c',
+    '<(libvpx_src_dir)/vp8/encoder/ratectrl.h',
+    '<(libvpx_src_dir)/vp8/encoder/rdopt.c',
+    '<(libvpx_src_dir)/vp8/encoder/rdopt.h',
+    '<(libvpx_src_dir)/vp8/encoder/segmentation.c',
+    '<(libvpx_src_dir)/vp8/encoder/segmentation.h',
+    '<(libvpx_src_dir)/vp8/encoder/tokenize.c',
+    '<(libvpx_src_dir)/vp8/encoder/tokenize.h',
+    '<(libvpx_src_dir)/vp8/encoder/treewriter.c',
+    '<(libvpx_src_dir)/vp8/encoder/treewriter.h',
+    '<(libvpx_src_dir)/vp8/vp8_cx_iface.c',
+    '<(libvpx_src_dir)/vp8/vp8_dx_iface.c',
+    '<(libvpx_src_dir)/vpx/internal/vpx_codec_internal.h',
+    '<(libvpx_src_dir)/vpx_mem/include/vpx_mem_intrnl.h',
+    '<(libvpx_src_dir)/vpx_mem/vpx_mem.c',
+    '<(libvpx_src_dir)/vpx_mem/vpx_mem.h',
+    '<(libvpx_src_dir)/vpx_ports/arm_cpudetect.c',
+    '<(libvpx_src_dir)/vpx_ports/arm.h',
+    '<(libvpx_src_dir)/vpx_ports/asm_offsets.h',
+    '<(libvpx_src_dir)/vpx_ports/mem.h',
+    '<(libvpx_src_dir)/vpx_ports/vpx_timer.h',
+    '<(libvpx_src_dir)/vpx_scale/generic/gen_scalers.c',
+    '<(libvpx_src_dir)/vpx_scale/generic/vpxscale.c',
+    '<(libvpx_src_dir)/vpx_scale/generic/yv12config.c',
+    '<(libvpx_src_dir)/vpx_scale/generic/yv12extend.c',
+    '<(libvpx_src_dir)/vpx_scale/generic/yv12extend_generic.h',
+    '<(libvpx_src_dir)/vpx_scale/scale_mode.h',
+    '<(libvpx_src_dir)/vpx_scale/vpxscale.h',
+    '<(libvpx_src_dir)/vpx_scale/yv12config.h',
+    '<(libvpx_src_dir)/vpx/src/vpx_codec.c',
+    '<(libvpx_src_dir)/vpx/src/vpx_decoder.c',
+    '<(libvpx_src_dir)/vpx/src/vpx_encoder.c',
+    '<(libvpx_src_dir)/vpx/src/vpx_image.c',
+    '<(libvpx_src_dir)/vpx/vp8cx.h',
+    '<(libvpx_src_dir)/vpx/vp8dx.h',
+    '<(libvpx_src_dir)/vpx/vp8.h',
+    '<(libvpx_src_dir)/vpx/vpx_codec.h',
+    '<(libvpx_src_dir)/vpx/vpx_codec_impl_bottom.h',
+    '<(libvpx_src_dir)/vpx/vpx_codec_impl_top.h',
+    '<(libvpx_src_dir)/vpx/vpx_decoder.h',
+    '<(libvpx_src_dir)/vpx/vpx_encoder.h',
+    '<(libvpx_src_dir)/vpx/vpx_image.h',
+    '<(libvpx_src_dir)/vpx/vpx_integer.h',
+    '<(libvpx_src_dir)/vp8/common/arm/bilinearfilter_arm.c',
+    '<(libvpx_src_dir)/vp8/common/arm/bilinearfilter_arm.h',
+    '<(libvpx_src_dir)/vpx_scale/arm/neon/yv12extend_arm.c',
+  ],
+}
diff --git a/third_party/libvpx/libvpx_src_neon.gypi b/third_party/libvpx/libvpx_src_neon.gypi
new file mode 100644
index 0000000..241a165
--- /dev/null
+++ b/third_party/libvpx/libvpx_src_neon.gypi
@@ -0,0 +1,51 @@
+# This file is generated. Do not edit.
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'sources': [
+    '<(libvpx_src_dir)/vp8/common/arm/neon/bilinearpredict16x16_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/bilinearpredict4x4_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/bilinearpredict8x4_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/bilinearpredict8x8_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/buildintrapredictorsmby_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/copymem16x16_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/copymem8x4_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/copymem8x8_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/dc_only_idct_add_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/dequant_idct_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/dequantizeb_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/idct_blk_neon.c',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/idct_dequant_0_2x_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/idct_dequant_full_2x_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/iwalsh_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/loopfilter_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/mbloopfilter_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/sad16_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/sad8_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/save_reg_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/shortidct4x4llm_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/sixtappredict16x16_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/sixtappredict4x4_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/sixtappredict8x4_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/sixtappredict8x8_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/variance_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/vp8_subpixelvariance16x16_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/vp8_subpixelvariance16x16s_neon.asm',
+    '<(libvpx_src_dir)/vp8/common/arm/neon/vp8_subpixelvariance8x8_neon.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/fastquantizeb_neon.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/picklpf_arm.c',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/shortfdct_neon.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/subtract_neon.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/vp8_memcpy_neon.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/vp8_mse16x16_neon.asm',
+    '<(libvpx_src_dir)/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.asm',
+    '<(libvpx_src_dir)/vpx_scale/arm/neon/vp8_vpxyv12_copyframe_func_neon.asm',
+    '<(libvpx_src_dir)/vpx_scale/arm/neon/vp8_vpxyv12_copysrcframe_func_neon.asm',
+    '<(libvpx_src_dir)/vpx_scale/arm/neon/vp8_vpxyv12_copy_y_neon.asm',
+    '<(libvpx_src_dir)/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm',
+  ],
+}
diff --git a/webrtc/video_engine/test/android/jni/Android.mk b/webrtc/video_engine/test/android/jni/Android.mk
index 9a0555e..8e1f6af 100644
--- a/webrtc/video_engine/test/android/jni/Android.mk
+++ b/webrtc/video_engine/test/android/jni/Android.mk
@@ -270,6 +270,12 @@
 include $(PREBUILT_STATIC_LIBRARY)
 
 include $(CLEAR_VARS)
+LOCAL_MODULE := libvpx_arm_neon
+LOCAL_SRC_FILES := \
+    $(MY_LIBS_PATH)/third_party/libvpx/libvpx_arm_neon.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
 LOCAL_MODULE := libpaced_sender
 LOCAL_SRC_FILES := \
     $(MY_LIBS_PATH)/webrtc/modules/libpaced_sender.a
@@ -339,6 +345,7 @@
     libaudioproc_debug_proto \
     libprotobuf_lite \
     libvpx \
+    libvpx_arm_neon \
     libpaced_sender \
     $(MY_SUPPLEMENTAL_LIBS)