Merge "DO NOT MERGE Skip of testEncryption with FEATURE_AUTOMOTIVE" into oreo-mr1-cts-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 13962a1..a06db9e 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
       android:versionCode="5"
-      android:versionName="8.1_r16">
+      android:versionName="8.1_r17">
 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27"/>
 
@@ -1951,6 +1951,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
+            <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
         </activity>
         <activity android:name=".security.CANotifyOnBootActivity"
                 android:label="@string/caboot_test">
@@ -1961,6 +1962,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
+            <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
         </activity>
 
         <activity android:name=".security.KeyChainTest"
diff --git a/apps/CtsVerifier/res/layout-small-dpad/positive_device_owner.xml b/apps/CtsVerifier/res/layout-small-dpad/positive_device_owner.xml
new file mode 100644
index 0000000..e8b926b
--- /dev/null
+++ b/apps/CtsVerifier/res/layout-small-dpad/positive_device_owner.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+     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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/RootLayoutPadding"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="true">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/positive_device_owner_instructions"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/device_owner_positive_tests_instructions"
+                android:textSize="18dip" />
+
+            <Button
+                android:id="@+id/check_preconditions"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/device_owner_precondition_button_label" />
+
+            <Button
+                android:id="@+id/set_device_owner_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/set_device_owner_button_label" />
+
+            <ListView
+                android:id="@+id/android:list"
+                android:layout_width="match_parent"
+                android:layout_height="950dp"
+                android:layout_weight="1" />
+
+            <include layout="@layout/pass_fail_buttons" />
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java
index 7c807c2..b4bfa01 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java
@@ -136,7 +136,8 @@
 
     private boolean supportsConditionProviders() {
         ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        return !am.isLowRamDevice();
+        return !am.isLowRamDevice()
+                || mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
     }
 
     private int getVolumeDelta(int volume) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
index fc4e6c9..45b1220 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
@@ -49,7 +49,7 @@
             "<ProfileList Version=\"1.0.0\">" +
             "<PeripheralProfile ProfileName=\"AudioBox USB 96\" ProfileDescription=\"PreSonus AudioBox USB 96\" ProductName=\"USB-Audio - AudioBox USB 96\">" +
                 "<OutputDevInfo ChanCounts=\"2\" ChanPosMasks=\"12\" ChanIndexMasks=\"3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
-                "<InputDevInfo ChanCounts=\"1, 2\" ChanPosMasks=\"12, 16\" ChanIndexMasks=\"1,3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
+                "<InputDevInfo ChanCounts=\"1,2\" ChanPosMasks=\"12,16\" ChanIndexMasks=\"1,3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
             "</PeripheralProfile>" +
             "<PeripheralProfile ProfileName=\"AudioBox 44VSL\" ProfileDescription=\"Presonus AudioBox 44VSL\" ProductName=\"USB-Audio - AudioBox 44 VSL\">" +
                 "<OutputDevInfo ChanCounts=\"2,3,4\" ChanPosMasks=\"12\" ChanIndexMasks=\"3,7,15\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\" />" +
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
index c564067..f17498d 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
@@ -120,15 +120,16 @@
 
         private void processLogLine(String line) {
             mLogcatChunk.append(line);
+            mLogcatChunk.append('\n');
             Matcher m;
-            if ((m = CrashUtils.sNewTestPattern.matcher(line)).matches()) {
+            if ((m = CrashUtils.sNewTestPattern.matcher(line)).find()) {
                 mTestName = m.group(1);
                 mCrashes = new JSONArray();
                 mLogcatChunk.setLength(0);
-            } else if (CrashUtils.sEndofCrashPattern.matcher(line).matches()) {
+            } else if (CrashUtils.sEndofCrashPattern.matcher(line).find()) {
                 CrashUtils.addAllCrashes(mLogcatChunk.toString(), mCrashes);
                 mLogcatChunk.setLength(0);
-            } else if (CrashUtils.sUploadRequestPattern.matcher(line).matches()) {
+            } else if (CrashUtils.sUploadRequestPattern.matcher(line).find()) {
                 upload(mDevice, mTestName, mCrashes);
             }
         }
diff --git a/common/util/src/com/android/compatibility/common/util/CrashUtils.java b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
index e058df4..2b0531c 100644
--- a/common/util/src/com/android/compatibility/common/util/CrashUtils.java
+++ b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
@@ -16,89 +16,133 @@
 
 package com.android.compatibility.common.util;
 
+import java.io.File;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
+import java.math.BigInteger;
 
 /** Contains helper functions and shared constants for crash parsing. */
 public class CrashUtils {
+    // used to only detect actual addresses instead of nullptr and other unlikely values
+    public static final BigInteger MIN_CRASH_ADDR = new BigInteger("8000", 16);
 
-    public static final long MIN_CRASH_ADDR = 32768;
     // Matches the end of a crash
     public static final Pattern sEndofCrashPattern =
-            Pattern.compile(".*DEBUG\\s+:\\s+backtrace:.*");
+            Pattern.compile("DEBUG\\s+?:\\s+?backtrace:");
     public static final String DEVICE_PATH = "/data/local/tmp/CrashParserResults/";
     public static final String LOCK_FILENAME = "lockFile.loc";
     public static final String UPLOAD_REQUEST = "Please upload a result file to stagefright";
     public static final Pattern sUploadRequestPattern =
-            Pattern.compile(".*" + UPLOAD_REQUEST + ".*");
+            Pattern.compile(UPLOAD_REQUEST);
     public static final String NEW_TEST_ALERT = "New test starting with name: ";
     public static final Pattern sNewTestPattern =
-            Pattern.compile(".*" + NEW_TEST_ALERT + "(\\w+)\\(.*\\).*");
-    public static final String SIGNAL = "signal",
-            NAME = "name",
-            PID = "pid",
-            TID = "tid",
-            FAULT_ADDRESS = "faultaddress";
+            Pattern.compile(NEW_TEST_ALERT + "(\\w+?)\\(.*?\\)");
+    public static final String SIGNAL = "signal";
+    public static final String NAME = "name";
+    public static final String PROCESS = "process";
+    public static final String PID = "pid";
+    public static final String TID = "tid";
+    public static final String FAULT_ADDRESS = "faultaddress";
     // Matches the smallest blob that has the appropriate header and footer
     private static final Pattern sCrashBlobPattern =
-            Pattern.compile("DEBUG\\s+:( [*]{3})+.*?DEBUG\\s+:\\s+backtrace:", Pattern.DOTALL);
+            Pattern.compile("DEBUG\\s+?:( [*]{3})+?.*?DEBUG\\s+?:\\s+?backtrace:", Pattern.DOTALL);
     // Matches process id and name line and captures them
     private static final Pattern sPidtidNamePattern =
-            Pattern.compile("pid: (\\d+), tid: (\\d+), name: ([^\\s]+\\s+)*>>> (.*) <<<");
+            Pattern.compile("pid: (\\d+?), tid: (\\d+?), name: ([^\\s]+?\\s+?)*?>>> (.*?) <<<");
     // Matches fault address and signal type line
     private static final Pattern sFaultLinePattern =
             Pattern.compile(
-                    "\\w+ \\d+ \\((.*)\\), code -*\\d+ \\(.*\\), fault addr "
+                    "\\w+? \\d+? \\((.*?)\\), code -*?\\d+? \\(.*?\\), fault addr "
                             + "(?:0x(\\p{XDigit}+)|-+)");
     // Matches the abort message line if it contains CHECK_
     private static Pattern sAbortMessageCheckPattern =
-            Pattern.compile("(?i)Abort message.*CHECK_.*");
+            Pattern.compile("(?i)Abort message.*?CHECK_");
+
+    /**
+     * returns true if the signal is a segmentation fault or bus error.
+     */
+    public static boolean isSecuritySignal(JSONObject crash) throws JSONException {
+        return crash.getString(SIGNAL).toLowerCase().matches("sig(segv|bus)");
+    }
+
+    /**
+     * returns the filename of the process.
+     * e.g. "/system/bin/mediaserver" returns "mediaserver"
+     */
+    public static String getProcessFileName(JSONObject crash) throws JSONException {
+        return new File(crash.getString(PROCESS)).getName();
+    }
 
     /**
      * Determines if the given input has a {@link com.android.compatibility.common.util.Crash} that
      * should fail an sts test
      *
-     * @param processNames list of applicable process names
+     * @param processPatterns list of patterns that match applicable process names
      * @param checkMinAddr if the minimum fault address should be respected
      * @param crashes list of crashes to check
      * @return if a crash is serious enough to fail an sts test
      */
-    public static boolean detectCrash(
-            String[] processNames, boolean checkMinAddr, JSONArray crashes) {
+    public static boolean securityCrashDetected(
+            JSONArray crashes, boolean checkMinAddr, Pattern... processPatterns) {
+        return matchSecurityCrashes(crashes, checkMinAddr, processPatterns).length() > 0;
+    }
+
+    public static BigInteger getBigInteger(JSONObject source, String name) throws JSONException {
+        if (source.isNull(name)) {
+            return null;
+        }
+        String intString = source.getString(name);
+        BigInteger value = null;
+        try {
+            value = new BigInteger(intString, 16);
+        } catch (NumberFormatException e) {}
+        return value;
+    }
+
+    /**
+     * Determines which given inputs have a {@link com.android.compatibility.common.util.Crash} that
+     * should fail an sts test
+     *
+     * @param processPatterns list of patterns that match applicable process names
+     * @param checkMinAddr if the minimum fault address should be respected
+     * @param crashes list of crashes to check
+     * @return the list of crashes serious enough to fail an sts test
+     */
+    public static JSONArray matchSecurityCrashes(
+            JSONArray crashes, boolean checkMinAddr, Pattern... processPatterns) {
+        JSONArray securityCrashes = new JSONArray();
         for (int i = 0; i < crashes.length(); i++) {
             try {
                 JSONObject crash = crashes.getJSONObject(i);
-                if (!crash.getString(SIGNAL).toLowerCase().matches("sig(segv|bus)")) {
+                if (!matchesAny(getProcessFileName(crash), processPatterns)) {
                     continue;
                 }
-
-                if (checkMinAddr && !crash.isNull(FAULT_ADDRESS)) {
-                    if (crash.getLong(FAULT_ADDRESS) < MIN_CRASH_ADDR) {
-                        continue;
-                    }
-                }
-
-                boolean foundProcess = false;
-                String name = crash.getString(NAME);
-                for (String process : processNames) {
-                    if (name.equals(process)) {
-                        foundProcess = true;
-                        break;
-                    }
-                }
-
-                if (!foundProcess) {
+                if (!isSecuritySignal(crash)) {
                     continue;
                 }
+                BigInteger faultAddress = getBigInteger(crash, FAULT_ADDRESS);
+                if (checkMinAddr && faultAddress != null
+                        && faultAddress.compareTo(MIN_CRASH_ADDR) < 0) {
+                    continue;
+                }
+                securityCrashes.put(crash);
+            } catch (JSONException | NullPointerException e) {}
+        }
+        return securityCrashes;
+    }
 
-                return true; // crash detected
-            } catch (JSONException | NullPointerException e) {
+    /**
+     * returns true if the input matches any of the patterns.
+     */
+    private static boolean matchesAny(String input, Pattern... patterns) {
+        for (Pattern p : patterns) {
+            if (p.matcher(input).matches()) {
+                return true;
             }
         }
-
         return false;
     }
 
@@ -107,21 +151,23 @@
         Matcher crashBlobFinder = sCrashBlobPattern.matcher(input);
         while (crashBlobFinder.find()) {
             String crashStr = crashBlobFinder.group(0);
-            int tid = 0, pid = 0;
-            Long faultAddress = null;
-            String name = null, signal = null;
+            int tid = 0;
+            int pid = 0;
+            BigInteger faultAddress = null;
+            String name = null;
+            String process = null;
+            String signal = null;
 
             Matcher pidtidNameMatcher = sPidtidNamePattern.matcher(crashStr);
             if (pidtidNameMatcher.find()) {
                 try {
                     pid = Integer.parseInt(pidtidNameMatcher.group(1));
-                } catch (NumberFormatException e) {
-                }
+                } catch (NumberFormatException e) {}
                 try {
                     tid = Integer.parseInt(pidtidNameMatcher.group(2));
-                } catch (NumberFormatException e) {
-                }
+                } catch (NumberFormatException e) {}
                 name = pidtidNameMatcher.group(3).trim();
+                process = pidtidNameMatcher.group(4).trim();
             }
 
             Matcher faultLineMatcher = sFaultLinePattern.matcher(crashStr);
@@ -130,9 +176,8 @@
                 String faultAddrMatch = faultLineMatcher.group(2);
                 if (faultAddrMatch != null) {
                     try {
-                        faultAddress = Long.parseLong(faultAddrMatch, 16);
-                    } catch (NumberFormatException e) {
-                    }
+                        faultAddress = new BigInteger(faultAddrMatch, 16);
+                    } catch (NumberFormatException e) {}
                 }
             }
             if (!sAbortMessageCheckPattern.matcher(crashStr).find()) {
@@ -141,12 +186,12 @@
                     crash.put(PID, pid);
                     crash.put(TID, tid);
                     crash.put(NAME, name);
-                    crash.put(FAULT_ADDRESS, faultAddress);
+                    crash.put(PROCESS, process);
+                    crash.put(FAULT_ADDRESS,
+                            faultAddress == null ? null : faultAddress.toString(16));
                     crash.put(SIGNAL, signal);
                     crashes.put(crash);
-                } catch (JSONException e) {
-
-                }
+                } catch (JSONException e) {}
             }
         }
         return crashes;
diff --git a/common/util/tests/res/logcat.txt b/common/util/tests/res/logcat.txt
index ad778c7..b9d10d0 100644
--- a/common/util/tests/res/logcat.txt
+++ b/common/util/tests/res/logcat.txt
@@ -271,4 +271,66 @@
 11-25 19:47:35.597   940   940 F DEBUG   :     #24 pc 0003fa3b  /system/lib/libc.so (_ZL15__pthread_startPv+30)
 11-25 19:47:35.597   940   940 F DEBUG   :     #25 pc 0001a085  /system/lib/libc.so (__start_thread+6)
 11-25 19:47:35.837   940   940 F DEBUG   :
-11-25 19:47:35.837   940   940 F DEBUG   : Tombstone written to: /data/tombstones/tombstone_01
\ No newline at end of file
+11-25 19:47:35.837   940   940 F DEBUG   : Tombstone written to: /data/tombstones/tombstone_01
+--------- beginning of crash
+09-03 17:48:05.627 11071 11189 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe9380000 in tid 11189 (synthetic_thread)
+09-03 17:48:05.707   359   359 W         : debuggerd: handling request: pid=11071 uid=1041 gid=1005 tid=11189
+09-03 17:48:05.796  7072  7072 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+09-03 17:48:05.796  7072  7072 F DEBUG   : Build fingerprint: 'google/angler/angler:7.1.1/N4F26T/3687331:userdebug/dev-keys'
+09-03 17:48:05.796  7072  7072 F DEBUG   : Revision: '0'
+09-03 17:48:05.796  7072  7072 F DEBUG   : ABI: 'arm'
+09-03 17:48:05.796  7072  7072 F DEBUG   : pid: 11071, tid: 11189, name: synthetic_thread  >>> synthetic_process_0 <<<
+09-03 17:48:05.797  7072  7072 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xe9380000
+09-03 17:48:05.797  7072  7072 F DEBUG   :     r0 e9e7a240  r1 e9380000  r2 00000170  r3 00000000
+09-03 17:48:05.797  7072  7072 F DEBUG   :     r4 00000002  r5 00000000  r6 ec1e1f25  r7 eb6f8000
+09-03 17:48:05.797  7072  7072 F DEBUG   :     r8 00000000  r9 eb105204  sl 00000000  fp 000003c0
+09-03 17:48:05.797  7072  7072 F DEBUG   :     ip ebd3df18  sp eaf80688  lr ec1e1f41  pc ebd38dd6  cpsr 20000030
+09-03 17:48:05.805  7072  7072 F DEBUG   :
+09-03 17:48:05.805  7072  7072 F DEBUG   : backtrace:
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #00 pc 00002dd6  /system/lib/libaudioutils.so (memcpy_to_float_from_i16+5)
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #01 pc 00040f3d  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #02 pc 00040799  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #03 pc 00011178  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #04 pc 0003180b  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #05 pc 0002fe57  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #06 pc 0000e345  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #07 pc 000470b3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #08 pc 00019e3d  /system/lib/libc.so (__start_thread+6)
+09-03 17:48:05.967 11272 11568 W NativeCrashListener: Couldn't find ProcessRecord for pid 11071
+09-03 17:48:05.969   359   359 W         : debuggerd: resuming target 11071
+09-03 17:48:05.981 11272 11307 I BootReceiver: Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
+09-03 17:48:06.067   394   394 I ServiceManager: service 'media.sound_trigger_hw' died
+06-15 19:57:33.607 12736 12761 D PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10197 => granted (698 us)
+--------- beginning of crash
+06-15 19:57:33.607 12736 12761 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12761 (synthetic_thread)
+06-15 19:57:33.608   379   379 W         : debuggerd: handling request: pid=12736 uid=1041 gid=1005 tid=12761
+06-15 19:57:33.670 26192 26192 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+06-15 19:57:33.670 26192 26192 F DEBUG   : Build fingerprint: 'google/bullhead/bullhead:7.1.2/N2G48C/4104010:userdebug/dev-keys'
+06-15 19:57:33.670 26192 26192 F DEBUG   : Revision: 'rev_1.0'
+06-15 19:57:33.670 26192 26192 F DEBUG   : ABI: 'arm'
+06-15 19:57:33.670 26192 26192 F DEBUG   : pid: 12736, tid: 12761, name: synthetic_thread  >>> synthetic_process_1 <<<
+06-15 19:57:33.670 26192 26192 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
+06-15 19:57:33.670 26192 26192 F DEBUG   :     r0 00000000  r1 00000000  r2 0000005f  r3 00000000
+06-15 19:57:33.670 26192 26192 F DEBUG   :     r4 ffffffff  r5 00000000  r6 f14f9000  r7 00000001
+06-15 19:57:33.670 26192 26192 F DEBUG   :     r8 00000004  r9 f3353114  sl f3313900  fp 00000000
+06-15 19:57:33.670 26192 26192 F DEBUG   :     ip f3bd4d88  sp f127d9c8  lr f3b9cbc5  pc f3b65af4  cpsr 60000030
+06-15 19:57:33.676 26192 26192 F DEBUG   :
+06-15 19:57:33.676 26192 26192 F DEBUG   : backtrace:
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #00 pc 00018af4  /system/lib/libc.so (strlen+71)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #01 pc 0004fbc1  /system/lib/libc.so (__strlen_chk+4)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #02 pc 0000c599  /system/lib/libutils.so (_ZN7android7String8C2EPKc+12)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #03 pc 0002fdbf  /system/lib/libaudiopolicymanagerdefault.so (_ZNK7android18HwModuleCollection19getDeviceDescriptorEjPKcS2_b+458)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #04 pc 0001de47  /system/lib/libaudiopolicymanagerdefault.so (_ZN7android18AudioPolicyManager27setDeviceConnectionStateIntEj24audio_policy_dev_state_tPKcS3_+178)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #05 pc 0000a009  /system/lib/libaudiopolicyservice.so
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #06 pc 000a01a5  /system/lib/libmedia.so (_ZN7android20BnAudioPolicyService10onTransactEjRKNS_6ParcelEPS1_j+1256)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #07 pc 000359c3  /system/lib/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+70)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #08 pc 0003d1bb  /system/lib/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+702)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #09 pc 0003ce07  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+114)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #10 pc 0003d31b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #11 pc 0004f8c5  /system/lib/libbinder.so
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #12 pc 0000e345  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #13 pc 000470b3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #14 pc 00019e3d  /system/lib/libc.so (__start_thread+6)
+06-15 19:57:33.839   934  2991 W NativeCrashListener: Couldn't find ProcessRecord for pid 12736
+06-15 19:57:33.846   934   952 I BootReceiver: Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
+
diff --git a/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java b/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
index 94f472e..2138b7b 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
@@ -27,6 +27,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import java.util.regex.Pattern;
 
 /** Unit tests for {@link CrashUtils}. */
 @RunWith(JUnit4.class)
@@ -52,67 +53,89 @@
     @Test
     public void testGetAllCrashes() throws Exception {
         JSONArray expectedResults = new JSONArray();
-        expectedResults.put(createCrashJson(11071, 11189, "AudioOut_D", 3912761344L, "SIGSEGV"));
-        expectedResults.put(createCrashJson(12736, 12761, "Binder:12736_2", 0L, "SIGSEGV"));
-        expectedResults.put(createCrashJson(26201, 26227, "Binder:26201_3", 0L, "SIGSEGV"));
-        expectedResults.put(createCrashJson(26246, 26282, "Binder:26246_5", 0L, "SIGSEGV"));
-        expectedResults.put(createCrashJson(245, 245, "installd", null, "SIGABRT"));
-        expectedResults.put(createCrashJson(6371, 8072, "media.codec", 3976200192L, "SIGSEGV"));
-        expectedResults.put(createCrashJson(8373, 8414, "loo", null, "SIGABRT"));
+        expectedResults.put(createCrashJson(
+                11071, 11189, "AudioOut_D", "/system/bin/audioserver", "e9380000", "SIGSEGV"));
+        expectedResults.put(createCrashJson(
+                12736, 12761, "Binder:12736_2", "/system/bin/audioserver", "0", "SIGSEGV"));
+        expectedResults.put(createCrashJson(
+                26201, 26227, "Binder:26201_3", "/system/bin/audioserver", "0", "SIGSEGV"));
+        expectedResults.put(createCrashJson(
+                26246, 26282, "Binder:26246_5", "/system/bin/audioserver", "0", "SIGSEGV"));
+        expectedResults.put(createCrashJson(
+                245, 245, "installd", "/system/bin/installd", null, "SIGABRT"));
+        expectedResults.put(createCrashJson(
+                6371, 8072, "media.codec", "omx@1.0-service", "ed000000", "SIGSEGV"));
+        expectedResults.put(createCrashJson(
+                8373, 8414, "loo", "com.android.bluetooth", null, "SIGABRT"));
+        expectedResults.put(createCrashJson(
+                11071, 11189, "synthetic_thread", "synthetic_process_0", "e9380000", "SIGSEGV"));
+        expectedResults.put(createCrashJson(
+                12736, 12761, "synthetic_thread", "synthetic_process_1", "0", "SIGSEGV"));
 
         Assert.assertEquals(mCrashes.toString(), expectedResults.toString());
     }
 
     public JSONObject createCrashJson(
-            int pid, int tid, String name, Long faultaddress, String signal) {
+            int pid, int tid, String name, String process, String faultaddress, String signal) {
         JSONObject json = new JSONObject();
         try {
             json.put(CrashUtils.PID, pid);
             json.put(CrashUtils.TID, tid);
             json.put(CrashUtils.NAME, name);
+            json.put(CrashUtils.PROCESS, process);
             json.put(CrashUtils.FAULT_ADDRESS, faultaddress);
             json.put(CrashUtils.SIGNAL, signal);
-        } catch (JSONException e) {
-
-        }
+        } catch (JSONException e) {}
         return json;
     }
 
     @Test
     public void testValidCrash() throws Exception {
-        Assert.assertTrue(CrashUtils.detectCrash(new String[] {"AudioOut_D"}, true, mCrashes));
+        Assert.assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_0")));
     }
 
     @Test
     public void testMissingName() throws Exception {
-        Assert.assertFalse(CrashUtils.detectCrash(new String[] {""}, true, mCrashes));
+        Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("")));
     }
 
     @Test
     public void testSIGABRT() throws Exception {
-        Assert.assertFalse(CrashUtils.detectCrash(new String[] {"installd"}, true, mCrashes));
+        Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("installd")));
     }
 
     @Test
     public void testFaultAddressBelowMin() throws Exception {
-        Assert.assertFalse(CrashUtils.detectCrash(new String[] {"Binder:12736_2"}, true, mCrashes));
+        Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_1")));
     }
 
     @Test
     public void testIgnoreMinAddressCheck() throws Exception {
-        Assert.assertTrue(CrashUtils.detectCrash(new String[] {"Binder:12736_2"}, false, mCrashes));
+        Assert.assertTrue(CrashUtils.securityCrashDetected(mCrashes, false,
+                Pattern.compile("synthetic_process_1")));
+    }
+
+    @Test
+    public void testBadAbortMessage() throws Exception {
+        Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("generic")));
     }
 
     @Test
     public void testGoodAndBadCrashes() throws Exception {
-        Assert.assertTrue(
-                CrashUtils.detectCrash(new String[] {"AudioOut_D", "generic"}, true, mCrashes));
+        Assert.assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_0"), Pattern.compile("generic")));
     }
 
     @Test
     public void testNullFaultAddress() throws Exception {
         JSONArray crashes = new JSONArray();
-        crashes.put(createCrashJson(8373, 8414, "loo", null, "SIGSEGV"));
-        Assert.assertTrue(CrashUtils.detectCrash(new String[] {"loo"}, true, crashes));
+        crashes.put(createCrashJson(8373, 8414, "loo", "com.android.bluetooth", null, "SIGSEGV"));
+        Assert.assertTrue(CrashUtils.securityCrashDetected(crashes, true,
+                Pattern.compile("com\\.android\\.bluetooth")));
     }
 }
diff --git a/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java b/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java
index 8a82416..1fcbf91 100644
--- a/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java
+++ b/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java
@@ -58,9 +58,9 @@
     private static final int STATE_TIME_CACHED_INDEX = 9;
 
     private static final long TIME_SPENT_IN_TOP = 2000;
-    private static final long TIME_SPENT_IN_FOREGROUND = 2000;
+    private static final long TIME_SPENT_IN_FOREGROUND = 4000;
     private static final long TIME_SPENT_IN_BACKGROUND = 2000;
-    private static final long TIME_SPENT_IN_CACHED = 2000;
+    private static final long TIME_SPENT_IN_CACHED = 4000;
     private static final long SCREEN_STATE_CHANGE_TIMEOUT = 4000;
     private static final long SCREEN_STATE_POLLING_INTERVAL = 500;
 
diff --git a/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java b/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
index 54ee34c..cb86b5e 100644
--- a/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
+++ b/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
@@ -208,6 +208,6 @@
 
     private int getSize() {
         float density = getResources().getDisplayMetrics().density;
-        return (int)(200 * density);
+        return density > 1.0 ? 200 : (int)(200 * density);
     }
 }
diff --git a/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java b/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
index 125bcb3..0b28fd7 100644
--- a/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
+++ b/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
@@ -216,7 +216,7 @@
         int size = explicitDimension;
         try {
             float density = getDensity();
-            size = (int)(explicitDimension * density);
+            size = density > 1.0 ? explicitDimension : (int)(explicitDimension * density);
         } catch (DeviceNotAvailableException e) {
         }
         return size;
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index 169e651..d549e03 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -146,7 +146,7 @@
     @CddTest(requirement="3.8.6/C-1-1,C-1-2")
     public void testThemes() throws Exception {
         if (checkHardwareTypeSkipTest(mDevice.executeShellCommand(HARDWARE_TYPE_CMD).trim())) {
-            Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test for watch / TV");
+            Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test for watch / TV / automotive");
             return;
         }
 
@@ -290,6 +290,7 @@
 
     private static boolean checkHardwareTypeSkipTest(String hardwareTypeString) {
         return hardwareTypeString.contains("android.hardware.type.watch")
-                || hardwareTypeString.contains("android.hardware.type.television");
+                || hardwareTypeString.contains("android.hardware.type.television")
+                || hardwareTypeString.contains("android.hardware.type.automotive");
     }
 }
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java
index 1abb2ab..dc4a1c9 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java
@@ -22,6 +22,7 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.Rect;
 import android.graphics.Region;
 import android.provider.Settings;
 import android.test.InstrumentationTestCase;
@@ -84,13 +85,11 @@
 
     public void testSetScaleAndCenter() {
         final MagnificationController controller = mService.getMagnificationController();
-        final WindowManager wm = (WindowManager) mInstrumentation.getContext().getSystemService(
-                Context.WINDOW_SERVICE);
-        final DisplayMetrics metrics = new DisplayMetrics();
-        wm.getDefaultDisplay().getRealMetrics(metrics);
+        final Region region = controller.getMagnificationRegion();
+        final Rect bounds = region.getBounds();
         final float scale = 2.0f;
-        final float x = metrics.widthPixels / 4.0f;
-        final float y = metrics.heightPixels / 4.0f;
+        final float x = bounds.left + (bounds.width() / 4.0f);
+        final float y = bounds.top + (bounds.height() / 4.0f);
         final AtomicBoolean setScale = new AtomicBoolean();
         final AtomicBoolean setCenter = new AtomicBoolean();
         final AtomicBoolean result = new AtomicBoolean();
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java
index abc759c..7252fe0 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java
@@ -248,8 +248,12 @@
         }
 
         // Scroll down one line
-        final float oneLineDownY = locationsBeforeScroll[0].bottom;
-        getInstrumentation().runOnMainSync(() -> editText.scrollTo(0, (int) oneLineDownY + 1));
+        getInstrumentation().runOnMainSync(() -> {
+            int[] viewPosition = new int[2];
+            editText.getLocationOnScreen(viewPosition);
+            final int oneLineDownY = (int) locationsBeforeScroll[0].bottom - viewPosition[1];
+            editText.scrollTo(0, oneLineDownY + 1);
+        });
 
         assertTrue("Refresh failed", text.refreshWithExtraData(
                 EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY, getTextArgs));
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java
index b67fc28..3b0374f 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java
@@ -40,10 +40,11 @@
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
         mAudioManager =
                 (AudioManager) mInstrumentation.getContext().getSystemService(AUDIO_SERVICE);
-        // TVs have a single volume
+        // TVs and fixed volume devices have a single volume
         PackageManager pm = mInstrumentation.getContext().getPackageManager();
         mSingleVolume = (pm != null) && (pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
-                || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION));
+                || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION))
+                || mAudioManager.isVolumeFixed();
     }
 
     @Test
diff --git a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
index 24cb6bd..5eed3e8 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -61,7 +61,7 @@
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
 
     private static final int CONFIGURE_TIMEOUT = 5000; //ms
-    private static final int CAPTURE_TIMEOUT = 1000; //ms
+    private static final int CAPTURE_TIMEOUT = 1500; //ms
 
     // For testTriggerInteractions
     private static final int PREVIEW_WARMUP_FRAMES = 60;
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index 0b33f50..e79d10f 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -41,7 +41,7 @@
                 (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
         Display display = windowManager.getDefaultDisplay();
         DisplayMetrics metrics = new DisplayMetrics();
-        display.getMetrics(metrics);
+        display.getRealMetrics(metrics);
 
         double xInches = (double) metrics.widthPixels / metrics.xdpi;
         double yInches = (double) metrics.heightPixels / metrics.ydpi;
diff --git a/tests/tests/media/assets/audio_only/00.aac b/tests/tests/media/assets/audio_only/00.aac
new file mode 100644
index 0000000..1c620bf
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/00.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/00.key b/tests/tests/media/assets/audio_only/00.key
new file mode 100644
index 0000000..eb61918
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/00.key
@@ -0,0 +1 @@
+ëÝbñhÒ{hï*üä®<
\ No newline at end of file
diff --git a/tests/tests/media/assets/audio_only/01.aac b/tests/tests/media/assets/audio_only/01.aac
new file mode 100644
index 0000000..dc23c48
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/01.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/02.aac b/tests/tests/media/assets/audio_only/02.aac
new file mode 100644
index 0000000..1dd827d
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/02.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/03.aac b/tests/tests/media/assets/audio_only/03.aac
new file mode 100644
index 0000000..f6fd0c0
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/03.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/04.aac b/tests/tests/media/assets/audio_only/04.aac
new file mode 100644
index 0000000..60d0aef
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/04.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/05.aac b/tests/tests/media/assets/audio_only/05.aac
new file mode 100644
index 0000000..2875292
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/05.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/06.aac b/tests/tests/media/assets/audio_only/06.aac
new file mode 100644
index 0000000..dd0413f
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/06.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/07.aac b/tests/tests/media/assets/audio_only/07.aac
new file mode 100644
index 0000000..5d63cef
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/07.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/08.aac b/tests/tests/media/assets/audio_only/08.aac
new file mode 100644
index 0000000..402cd72
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/08.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/09.aac b/tests/tests/media/assets/audio_only/09.aac
new file mode 100644
index 0000000..587b910
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/09.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/10.aac b/tests/tests/media/assets/audio_only/10.aac
new file mode 100644
index 0000000..db8c5b8
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/10.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/11.aac b/tests/tests/media/assets/audio_only/11.aac
new file mode 100644
index 0000000..707dd38
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/11.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/12.aac b/tests/tests/media/assets/audio_only/12.aac
new file mode 100644
index 0000000..5ebe080
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/12.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/index.m3u8 b/tests/tests/media/assets/audio_only/index.m3u8
new file mode 100644
index 0000000..fedfafa
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/index.m3u8
@@ -0,0 +1,31 @@
+#EXTM3U
+#EXT-X-INDEPENDENT-SEGMENTS
+#EXT-X-VERSION:5
+#EXT-X-TARGETDURATION:10
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXT-X-KEY:METHOD=SAMPLE-AES,URI="00.key",IV=0x76fb8e8c870c8f95234d6c40aac52902
+#EXTINF:9.984,
+00.aac
+#EXTINF:9.984,
+01.aac
+#EXTINF:9.984,
+02.aac
+#EXTINF:9.984,
+03.aac
+#EXTINF:9.984,
+04.aac
+#EXTINF:9.984,
+05.aac
+#EXTINF:9.984,
+06.aac
+#EXTINF:9.984,
+07.aac
+#EXTINF:9.984,
+08.aac
+#EXTINF:9.984,
+09.aac
+#EXTINF:9.984,
+10.aac
+#EXTINF:9.984,
+11.aac
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/165340/00.ts b/tests/tests/media/assets/hls_variant/165340/00.ts
new file mode 100644
index 0000000..8a95fc5
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/01.ts b/tests/tests/media/assets/hls_variant/165340/01.ts
new file mode 100644
index 0000000..7983a01
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/02.ts b/tests/tests/media/assets/hls_variant/165340/02.ts
new file mode 100644
index 0000000..2582937
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/03.ts b/tests/tests/media/assets/hls_variant/165340/03.ts
new file mode 100644
index 0000000..4e4711e
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/04.ts b/tests/tests/media/assets/hls_variant/165340/04.ts
new file mode 100644
index 0000000..e210aac
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/05.ts b/tests/tests/media/assets/hls_variant/165340/05.ts
new file mode 100644
index 0000000..5d445bf
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/06.ts b/tests/tests/media/assets/hls_variant/165340/06.ts
new file mode 100644
index 0000000..e83d2a3
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/07.ts b/tests/tests/media/assets/hls_variant/165340/07.ts
new file mode 100644
index 0000000..37322c0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/08.ts b/tests/tests/media/assets/hls_variant/165340/08.ts
new file mode 100644
index 0000000..25f9f00
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/09.ts b/tests/tests/media/assets/hls_variant/165340/09.ts
new file mode 100644
index 0000000..2debe48
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/10.ts b/tests/tests/media/assets/hls_variant/165340/10.ts
new file mode 100644
index 0000000..3eed736
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/11.ts b/tests/tests/media/assets/hls_variant/165340/11.ts
new file mode 100644
index 0000000..7ae79e9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/12.ts b/tests/tests/media/assets/hls_variant/165340/12.ts
new file mode 100644
index 0000000..4153626
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/13.ts b/tests/tests/media/assets/hls_variant/165340/13.ts
new file mode 100644
index 0000000..027adf4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/14.ts b/tests/tests/media/assets/hls_variant/165340/14.ts
new file mode 100644
index 0000000..ea7d0be
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/15.ts b/tests/tests/media/assets/hls_variant/165340/15.ts
new file mode 100644
index 0000000..48c92c9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/16.ts b/tests/tests/media/assets/hls_variant/165340/16.ts
new file mode 100644
index 0000000..19f0ebd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/16.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/17.ts b/tests/tests/media/assets/hls_variant/165340/17.ts
new file mode 100644
index 0000000..7d4897d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/17.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/18.ts b/tests/tests/media/assets/hls_variant/165340/18.ts
new file mode 100644
index 0000000..47431d0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/18.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/19.ts b/tests/tests/media/assets/hls_variant/165340/19.ts
new file mode 100644
index 0000000..9e98a4f
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/19.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/20.ts b/tests/tests/media/assets/hls_variant/165340/20.ts
new file mode 100644
index 0000000..e674296
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/20.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/21.ts b/tests/tests/media/assets/hls_variant/165340/21.ts
new file mode 100644
index 0000000..2affe9d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/21.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/22.ts b/tests/tests/media/assets/hls_variant/165340/22.ts
new file mode 100644
index 0000000..0634296
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/22.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/23.ts b/tests/tests/media/assets/hls_variant/165340/23.ts
new file mode 100644
index 0000000..faf9ca8
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/23.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/24.ts b/tests/tests/media/assets/hls_variant/165340/24.ts
new file mode 100644
index 0000000..3b3f4d7
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/24.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/index.m3u8 b/tests/tests/media/assets/hls_variant/165340/index.m3u8
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/index.m3u8
@@ -0,0 +1,53 @@
+#EXTM3U
+#EXT-X-VERSION:3
+#EXT-X-TARGETDURATION:5
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:5,
+00.ts
+#EXTINF:5,
+01.ts
+#EXTINF:5,
+02.ts
+#EXTINF:5,
+03.ts
+#EXTINF:5,
+04.ts
+#EXTINF:5,
+05.ts
+#EXTINF:5,
+06.ts
+#EXTINF:5,
+07.ts
+#EXTINF:5,
+08.ts
+#EXTINF:5,
+09.ts
+#EXTINF:5,
+10.ts
+#EXTINF:5,
+11.ts
+#EXTINF:5,
+12.ts
+#EXTINF:5,
+13.ts
+#EXTINF:5,
+14.ts
+#EXTINF:5,
+15.ts
+#EXTINF:5,
+16.ts
+#EXTINF:5,
+17.ts
+#EXTINF:5,
+18.ts
+#EXTINF:5,
+19.ts
+#EXTINF:5,
+20.ts
+#EXTINF:5,
+21.ts
+#EXTINF:5,
+22.ts
+#EXTINF:5,
+23.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/1676816/00.ts b/tests/tests/media/assets/hls_variant/1676816/00.ts
new file mode 100644
index 0000000..aba6f79
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/01.ts b/tests/tests/media/assets/hls_variant/1676816/01.ts
new file mode 100644
index 0000000..18c382b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/02.ts b/tests/tests/media/assets/hls_variant/1676816/02.ts
new file mode 100644
index 0000000..8b45649
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/03.ts b/tests/tests/media/assets/hls_variant/1676816/03.ts
new file mode 100644
index 0000000..5a1dee6
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/04.ts b/tests/tests/media/assets/hls_variant/1676816/04.ts
new file mode 100644
index 0000000..69c4dfa
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/05.ts b/tests/tests/media/assets/hls_variant/1676816/05.ts
new file mode 100644
index 0000000..bd1e938
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/06.ts b/tests/tests/media/assets/hls_variant/1676816/06.ts
new file mode 100644
index 0000000..dfdfe31
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/07.ts b/tests/tests/media/assets/hls_variant/1676816/07.ts
new file mode 100644
index 0000000..be22e90
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/08.ts b/tests/tests/media/assets/hls_variant/1676816/08.ts
new file mode 100644
index 0000000..a892318
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/09.ts b/tests/tests/media/assets/hls_variant/1676816/09.ts
new file mode 100644
index 0000000..9a1e3c9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/10.ts b/tests/tests/media/assets/hls_variant/1676816/10.ts
new file mode 100644
index 0000000..528e424
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/11.ts b/tests/tests/media/assets/hls_variant/1676816/11.ts
new file mode 100644
index 0000000..2ad52f9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/12.ts b/tests/tests/media/assets/hls_variant/1676816/12.ts
new file mode 100644
index 0000000..5275b47
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/13.ts b/tests/tests/media/assets/hls_variant/1676816/13.ts
new file mode 100644
index 0000000..5894d31
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/14.ts b/tests/tests/media/assets/hls_variant/1676816/14.ts
new file mode 100644
index 0000000..44f5200
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/15.ts b/tests/tests/media/assets/hls_variant/1676816/15.ts
new file mode 100644
index 0000000..e548fb1
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/16.ts b/tests/tests/media/assets/hls_variant/1676816/16.ts
new file mode 100644
index 0000000..9ad2c6a
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/16.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/17.ts b/tests/tests/media/assets/hls_variant/1676816/17.ts
new file mode 100644
index 0000000..1cd735f
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/17.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/18.ts b/tests/tests/media/assets/hls_variant/1676816/18.ts
new file mode 100644
index 0000000..a593dba
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/18.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/19.ts b/tests/tests/media/assets/hls_variant/1676816/19.ts
new file mode 100644
index 0000000..3fb49cb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/19.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/20.ts b/tests/tests/media/assets/hls_variant/1676816/20.ts
new file mode 100644
index 0000000..7a586e7
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/20.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/21.ts b/tests/tests/media/assets/hls_variant/1676816/21.ts
new file mode 100644
index 0000000..bd70554
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/21.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/22.ts b/tests/tests/media/assets/hls_variant/1676816/22.ts
new file mode 100644
index 0000000..12ea80d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/22.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/23.ts b/tests/tests/media/assets/hls_variant/1676816/23.ts
new file mode 100644
index 0000000..c1b5be9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/23.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/24.ts b/tests/tests/media/assets/hls_variant/1676816/24.ts
new file mode 100644
index 0000000..76bd0b5
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/24.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/index.m3u8 b/tests/tests/media/assets/hls_variant/1676816/index.m3u8
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/index.m3u8
@@ -0,0 +1,53 @@
+#EXTM3U
+#EXT-X-VERSION:3
+#EXT-X-TARGETDURATION:5
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:5,
+00.ts
+#EXTINF:5,
+01.ts
+#EXTINF:5,
+02.ts
+#EXTINF:5,
+03.ts
+#EXTINF:5,
+04.ts
+#EXTINF:5,
+05.ts
+#EXTINF:5,
+06.ts
+#EXTINF:5,
+07.ts
+#EXTINF:5,
+08.ts
+#EXTINF:5,
+09.ts
+#EXTINF:5,
+10.ts
+#EXTINF:5,
+11.ts
+#EXTINF:5,
+12.ts
+#EXTINF:5,
+13.ts
+#EXTINF:5,
+14.ts
+#EXTINF:5,
+15.ts
+#EXTINF:5,
+16.ts
+#EXTINF:5,
+17.ts
+#EXTINF:5,
+18.ts
+#EXTINF:5,
+19.ts
+#EXTINF:5,
+20.ts
+#EXTINF:5,
+21.ts
+#EXTINF:5,
+22.ts
+#EXTINF:5,
+23.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/344388/00.ts b/tests/tests/media/assets/hls_variant/344388/00.ts
new file mode 100644
index 0000000..e26ad20
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/01.ts b/tests/tests/media/assets/hls_variant/344388/01.ts
new file mode 100644
index 0000000..fa5395d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/02.ts b/tests/tests/media/assets/hls_variant/344388/02.ts
new file mode 100644
index 0000000..a924b05
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/03.ts b/tests/tests/media/assets/hls_variant/344388/03.ts
new file mode 100644
index 0000000..4136491
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/04.ts b/tests/tests/media/assets/hls_variant/344388/04.ts
new file mode 100644
index 0000000..cf03032
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/05.ts b/tests/tests/media/assets/hls_variant/344388/05.ts
new file mode 100644
index 0000000..25d127b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/06.ts b/tests/tests/media/assets/hls_variant/344388/06.ts
new file mode 100644
index 0000000..f132be4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/07.ts b/tests/tests/media/assets/hls_variant/344388/07.ts
new file mode 100644
index 0000000..b1e7f36
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/08.ts b/tests/tests/media/assets/hls_variant/344388/08.ts
new file mode 100644
index 0000000..bbeb4fd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/09.ts b/tests/tests/media/assets/hls_variant/344388/09.ts
new file mode 100644
index 0000000..f444ab9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/10.ts b/tests/tests/media/assets/hls_variant/344388/10.ts
new file mode 100644
index 0000000..910dd43
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/11.ts b/tests/tests/media/assets/hls_variant/344388/11.ts
new file mode 100644
index 0000000..892a6b3
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/12.ts b/tests/tests/media/assets/hls_variant/344388/12.ts
new file mode 100644
index 0000000..2a8bfeb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/13.ts b/tests/tests/media/assets/hls_variant/344388/13.ts
new file mode 100644
index 0000000..bf9f1a4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/14.ts b/tests/tests/media/assets/hls_variant/344388/14.ts
new file mode 100644
index 0000000..45c604c
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/15.ts b/tests/tests/media/assets/hls_variant/344388/15.ts
new file mode 100644
index 0000000..4d5de4f
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/16.ts b/tests/tests/media/assets/hls_variant/344388/16.ts
new file mode 100644
index 0000000..9551838
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/16.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/17.ts b/tests/tests/media/assets/hls_variant/344388/17.ts
new file mode 100644
index 0000000..dde4452
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/17.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/18.ts b/tests/tests/media/assets/hls_variant/344388/18.ts
new file mode 100644
index 0000000..c7b3919
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/18.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/19.ts b/tests/tests/media/assets/hls_variant/344388/19.ts
new file mode 100644
index 0000000..5aa3c84
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/19.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/20.ts b/tests/tests/media/assets/hls_variant/344388/20.ts
new file mode 100644
index 0000000..0d509bb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/20.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/21.ts b/tests/tests/media/assets/hls_variant/344388/21.ts
new file mode 100644
index 0000000..252a953
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/21.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/22.ts b/tests/tests/media/assets/hls_variant/344388/22.ts
new file mode 100644
index 0000000..7098fdd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/22.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/23.ts b/tests/tests/media/assets/hls_variant/344388/23.ts
new file mode 100644
index 0000000..69bd886
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/23.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/24.ts b/tests/tests/media/assets/hls_variant/344388/24.ts
new file mode 100644
index 0000000..0542cc2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/24.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/index.m3u8 b/tests/tests/media/assets/hls_variant/344388/index.m3u8
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/index.m3u8
@@ -0,0 +1,53 @@
+#EXTM3U
+#EXT-X-VERSION:3
+#EXT-X-TARGETDURATION:5
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:5,
+00.ts
+#EXTINF:5,
+01.ts
+#EXTINF:5,
+02.ts
+#EXTINF:5,
+03.ts
+#EXTINF:5,
+04.ts
+#EXTINF:5,
+05.ts
+#EXTINF:5,
+06.ts
+#EXTINF:5,
+07.ts
+#EXTINF:5,
+08.ts
+#EXTINF:5,
+09.ts
+#EXTINF:5,
+10.ts
+#EXTINF:5,
+11.ts
+#EXTINF:5,
+12.ts
+#EXTINF:5,
+13.ts
+#EXTINF:5,
+14.ts
+#EXTINF:5,
+15.ts
+#EXTINF:5,
+16.ts
+#EXTINF:5,
+17.ts
+#EXTINF:5,
+18.ts
+#EXTINF:5,
+19.ts
+#EXTINF:5,
+20.ts
+#EXTINF:5,
+21.ts
+#EXTINF:5,
+22.ts
+#EXTINF:5,
+23.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/387360/00.ts b/tests/tests/media/assets/hls_variant/387360/00.ts
new file mode 100644
index 0000000..c7233c2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/01.ts b/tests/tests/media/assets/hls_variant/387360/01.ts
new file mode 100644
index 0000000..4d092dd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/02.ts b/tests/tests/media/assets/hls_variant/387360/02.ts
new file mode 100644
index 0000000..5b0322e
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/03.ts b/tests/tests/media/assets/hls_variant/387360/03.ts
new file mode 100644
index 0000000..5081ef0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/04.ts b/tests/tests/media/assets/hls_variant/387360/04.ts
new file mode 100644
index 0000000..0f6f0fe
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/05.ts b/tests/tests/media/assets/hls_variant/387360/05.ts
new file mode 100644
index 0000000..e455dec
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/06.ts b/tests/tests/media/assets/hls_variant/387360/06.ts
new file mode 100644
index 0000000..14afcb9d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/07.ts b/tests/tests/media/assets/hls_variant/387360/07.ts
new file mode 100644
index 0000000..6f23d02
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/08.ts b/tests/tests/media/assets/hls_variant/387360/08.ts
new file mode 100644
index 0000000..a3d8dfd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/09.ts b/tests/tests/media/assets/hls_variant/387360/09.ts
new file mode 100644
index 0000000..87d6de1
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/10.ts b/tests/tests/media/assets/hls_variant/387360/10.ts
new file mode 100644
index 0000000..04ab37a
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/11.ts b/tests/tests/media/assets/hls_variant/387360/11.ts
new file mode 100644
index 0000000..1fa238b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/12.ts b/tests/tests/media/assets/hls_variant/387360/12.ts
new file mode 100644
index 0000000..445b0b9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/13.ts b/tests/tests/media/assets/hls_variant/387360/13.ts
new file mode 100644
index 0000000..6bcd81b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/14.ts b/tests/tests/media/assets/hls_variant/387360/14.ts
new file mode 100644
index 0000000..f3f8e78
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/15.ts b/tests/tests/media/assets/hls_variant/387360/15.ts
new file mode 100644
index 0000000..6b12e72
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/16.ts b/tests/tests/media/assets/hls_variant/387360/16.ts
new file mode 100644
index 0000000..d95eeba
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/16.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/17.ts b/tests/tests/media/assets/hls_variant/387360/17.ts
new file mode 100644
index 0000000..141ae44
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/17.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/18.ts b/tests/tests/media/assets/hls_variant/387360/18.ts
new file mode 100644
index 0000000..fc52f1d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/18.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/19.ts b/tests/tests/media/assets/hls_variant/387360/19.ts
new file mode 100644
index 0000000..077db9b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/19.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/20.ts b/tests/tests/media/assets/hls_variant/387360/20.ts
new file mode 100644
index 0000000..4ffb301
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/20.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/21.ts b/tests/tests/media/assets/hls_variant/387360/21.ts
new file mode 100644
index 0000000..6072368
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/21.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/22.ts b/tests/tests/media/assets/hls_variant/387360/22.ts
new file mode 100644
index 0000000..5edc055
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/22.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/23.ts b/tests/tests/media/assets/hls_variant/387360/23.ts
new file mode 100644
index 0000000..7870e39
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/23.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/24.ts b/tests/tests/media/assets/hls_variant/387360/24.ts
new file mode 100644
index 0000000..f4fc858
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/24.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/index.m3u8 b/tests/tests/media/assets/hls_variant/387360/index.m3u8
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/index.m3u8
@@ -0,0 +1,53 @@
+#EXTM3U
+#EXT-X-VERSION:3
+#EXT-X-TARGETDURATION:5
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:5,
+00.ts
+#EXTINF:5,
+01.ts
+#EXTINF:5,
+02.ts
+#EXTINF:5,
+03.ts
+#EXTINF:5,
+04.ts
+#EXTINF:5,
+05.ts
+#EXTINF:5,
+06.ts
+#EXTINF:5,
+07.ts
+#EXTINF:5,
+08.ts
+#EXTINF:5,
+09.ts
+#EXTINF:5,
+10.ts
+#EXTINF:5,
+11.ts
+#EXTINF:5,
+12.ts
+#EXTINF:5,
+13.ts
+#EXTINF:5,
+14.ts
+#EXTINF:5,
+15.ts
+#EXTINF:5,
+16.ts
+#EXTINF:5,
+17.ts
+#EXTINF:5,
+18.ts
+#EXTINF:5,
+19.ts
+#EXTINF:5,
+20.ts
+#EXTINF:5,
+21.ts
+#EXTINF:5,
+22.ts
+#EXTINF:5,
+23.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/765178/00.ts b/tests/tests/media/assets/hls_variant/765178/00.ts
new file mode 100644
index 0000000..c544131
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/01.ts b/tests/tests/media/assets/hls_variant/765178/01.ts
new file mode 100644
index 0000000..11adb7a
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/02.ts b/tests/tests/media/assets/hls_variant/765178/02.ts
new file mode 100644
index 0000000..d5300f4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/03.ts b/tests/tests/media/assets/hls_variant/765178/03.ts
new file mode 100644
index 0000000..8a3ce79
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/04.ts b/tests/tests/media/assets/hls_variant/765178/04.ts
new file mode 100644
index 0000000..94b1ced
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/05.ts b/tests/tests/media/assets/hls_variant/765178/05.ts
new file mode 100644
index 0000000..d44d4a6
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/06.ts b/tests/tests/media/assets/hls_variant/765178/06.ts
new file mode 100644
index 0000000..52455dd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/07.ts b/tests/tests/media/assets/hls_variant/765178/07.ts
new file mode 100644
index 0000000..cea2858
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/08.ts b/tests/tests/media/assets/hls_variant/765178/08.ts
new file mode 100644
index 0000000..79a1ef1
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/09.ts b/tests/tests/media/assets/hls_variant/765178/09.ts
new file mode 100644
index 0000000..6e987f2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/10.ts b/tests/tests/media/assets/hls_variant/765178/10.ts
new file mode 100644
index 0000000..c5f1af4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/11.ts b/tests/tests/media/assets/hls_variant/765178/11.ts
new file mode 100644
index 0000000..1a96c19
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/12.ts b/tests/tests/media/assets/hls_variant/765178/12.ts
new file mode 100644
index 0000000..b6095bb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/13.ts b/tests/tests/media/assets/hls_variant/765178/13.ts
new file mode 100644
index 0000000..b91b740
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/14.ts b/tests/tests/media/assets/hls_variant/765178/14.ts
new file mode 100644
index 0000000..d033f16
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/15.ts b/tests/tests/media/assets/hls_variant/765178/15.ts
new file mode 100644
index 0000000..f294842
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/16.ts b/tests/tests/media/assets/hls_variant/765178/16.ts
new file mode 100644
index 0000000..15a9e9e
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/16.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/17.ts b/tests/tests/media/assets/hls_variant/765178/17.ts
new file mode 100644
index 0000000..e024ce0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/17.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/18.ts b/tests/tests/media/assets/hls_variant/765178/18.ts
new file mode 100644
index 0000000..9e7fea2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/18.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/19.ts b/tests/tests/media/assets/hls_variant/765178/19.ts
new file mode 100644
index 0000000..4bb80bf
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/19.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/20.ts b/tests/tests/media/assets/hls_variant/765178/20.ts
new file mode 100644
index 0000000..591fda9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/20.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/21.ts b/tests/tests/media/assets/hls_variant/765178/21.ts
new file mode 100644
index 0000000..a3cab10
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/21.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/22.ts b/tests/tests/media/assets/hls_variant/765178/22.ts
new file mode 100644
index 0000000..c60c3f8
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/22.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/23.ts b/tests/tests/media/assets/hls_variant/765178/23.ts
new file mode 100644
index 0000000..e60a254
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/23.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/24.ts b/tests/tests/media/assets/hls_variant/765178/24.ts
new file mode 100644
index 0000000..bc75f31
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/24.ts
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/index.m3u8 b/tests/tests/media/assets/hls_variant/765178/index.m3u8
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/index.m3u8
@@ -0,0 +1,53 @@
+#EXTM3U
+#EXT-X-VERSION:3
+#EXT-X-TARGETDURATION:5
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:5,
+00.ts
+#EXTINF:5,
+01.ts
+#EXTINF:5,
+02.ts
+#EXTINF:5,
+03.ts
+#EXTINF:5,
+04.ts
+#EXTINF:5,
+05.ts
+#EXTINF:5,
+06.ts
+#EXTINF:5,
+07.ts
+#EXTINF:5,
+08.ts
+#EXTINF:5,
+09.ts
+#EXTINF:5,
+10.ts
+#EXTINF:5,
+11.ts
+#EXTINF:5,
+12.ts
+#EXTINF:5,
+13.ts
+#EXTINF:5,
+14.ts
+#EXTINF:5,
+15.ts
+#EXTINF:5,
+16.ts
+#EXTINF:5,
+17.ts
+#EXTINF:5,
+18.ts
+#EXTINF:5,
+19.ts
+#EXTINF:5,
+20.ts
+#EXTINF:5,
+21.ts
+#EXTINF:5,
+22.ts
+#EXTINF:5,
+23.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/index.m3u8 b/tests/tests/media/assets/hls_variant/index.m3u8
new file mode 100644
index 0000000..2e94f5d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/index.m3u8
@@ -0,0 +1,12 @@
+#EXTM3U
+#EXT-X-INDEPENDENT-SEGMENTS
+#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=165340,RESOLUTION=256x144,CODECS="mp4a.40.5,avc1.42c00b"
+165340/index.m3u8
+#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=344388,RESOLUTION=426x240,CODECS="mp4a.40.5,avc1.4d4015"
+344388/index.m3u8
+#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=387360,RESOLUTION=640x360,CODECS="mp4a.40.2,avc1.4d401e"
+387360/index.m3u8
+#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=765178,RESOLUTION=854x480,CODECS="mp4a.40.2,avc1.4d401f"
+765178/index.m3u8
+#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=1676816,RESOLUTION=1280x720,CODECS="mp4a.40.2,avc1.4d401f"
+1676816/index.m3u8
diff --git a/tests/tests/media/assets/unmuxed_1000k/00.ts b/tests/tests/media/assets/unmuxed_1000k/00.ts
new file mode 100644
index 0000000..ac6a7a0
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/01.key b/tests/tests/media/assets/unmuxed_1000k/01.key
new file mode 100644
index 0000000..a5207e8
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/01.key
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/01.ts b/tests/tests/media/assets/unmuxed_1000k/01.ts
new file mode 100644
index 0000000..14ac277
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/02.ts b/tests/tests/media/assets/unmuxed_1000k/02.ts
new file mode 100644
index 0000000..3810424
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/03.ts b/tests/tests/media/assets/unmuxed_1000k/03.ts
new file mode 100644
index 0000000..4c6da90
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/04.ts b/tests/tests/media/assets/unmuxed_1000k/04.ts
new file mode 100644
index 0000000..666a849
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/05.ts b/tests/tests/media/assets/unmuxed_1000k/05.ts
new file mode 100644
index 0000000..af09b5f
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/06.ts b/tests/tests/media/assets/unmuxed_1000k/06.ts
new file mode 100644
index 0000000..09cdd5b
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/07.ts b/tests/tests/media/assets/unmuxed_1000k/07.ts
new file mode 100644
index 0000000..562769d
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/08.ts b/tests/tests/media/assets/unmuxed_1000k/08.ts
new file mode 100644
index 0000000..a70bc37
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/09.ts b/tests/tests/media/assets/unmuxed_1000k/09.ts
new file mode 100644
index 0000000..fadc56d
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/10.ts b/tests/tests/media/assets/unmuxed_1000k/10.ts
new file mode 100644
index 0000000..c22f7d0
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/11.ts b/tests/tests/media/assets/unmuxed_1000k/11.ts
new file mode 100644
index 0000000..4716332
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/12.ts b/tests/tests/media/assets/unmuxed_1000k/12.ts
new file mode 100644
index 0000000..f9a30ce
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/index.m3u8 b/tests/tests/media/assets/unmuxed_1000k/index.m3u8
new file mode 100644
index 0000000..2746ec0
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/index.m3u8
@@ -0,0 +1,31 @@
+#EXTM3U
+#EXT-X-VERSION:6
+#EXT-X-TARGETDURATION:12
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:12,
+00.ts
+#EXT-X-KEY:METHOD=SAMPLE-AES,URI="01.key",IV=0x6F27287F6FF6B10A45F9033697703E26,KEYFORMAT="identity"
+#EXT-X-DISCONTINUITY
+#EXTINF:9,
+01.ts
+#EXTINF:9,
+02.ts
+#EXTINF:12,
+03.ts
+#EXTINF:9,
+04.ts
+#EXTINF:9,
+05.ts
+#EXTINF:12,
+06.ts
+#EXTINF:9,
+07.ts
+#EXTINF:9,
+08.ts
+#EXTINF:12,
+09.ts
+#EXTINF:9,
+10.ts
+#EXTINF:9,
+11.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.key b/tests/tests/media/assets/unmuxed_1500k/00.key
new file mode 100644
index 0000000..eb61918
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/00.key
@@ -0,0 +1 @@
+ëÝbñhÒ{hï*üä®<
\ No newline at end of file
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.ts b/tests/tests/media/assets/unmuxed_1500k/00.ts
new file mode 100644
index 0000000..9891dc6
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/01.ts b/tests/tests/media/assets/unmuxed_1500k/01.ts
new file mode 100644
index 0000000..d374565
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/02.ts b/tests/tests/media/assets/unmuxed_1500k/02.ts
new file mode 100644
index 0000000..6a6fbdb
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/03.ts b/tests/tests/media/assets/unmuxed_1500k/03.ts
new file mode 100644
index 0000000..cba18a5
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/04.ts b/tests/tests/media/assets/unmuxed_1500k/04.ts
new file mode 100644
index 0000000..bed2e63
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/05.ts b/tests/tests/media/assets/unmuxed_1500k/05.ts
new file mode 100644
index 0000000..35504ca
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/06.ts b/tests/tests/media/assets/unmuxed_1500k/06.ts
new file mode 100644
index 0000000..8456a79
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/07.ts b/tests/tests/media/assets/unmuxed_1500k/07.ts
new file mode 100644
index 0000000..e19ec6b
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/08.ts b/tests/tests/media/assets/unmuxed_1500k/08.ts
new file mode 100644
index 0000000..9a695cd
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/09.ts b/tests/tests/media/assets/unmuxed_1500k/09.ts
new file mode 100644
index 0000000..eecdb09
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/10.ts b/tests/tests/media/assets/unmuxed_1500k/10.ts
new file mode 100644
index 0000000..ce1383a
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/11.ts b/tests/tests/media/assets/unmuxed_1500k/11.ts
new file mode 100644
index 0000000..99a9ba2
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/12.ts b/tests/tests/media/assets/unmuxed_1500k/12.ts
new file mode 100644
index 0000000..e63f897
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/13.ts b/tests/tests/media/assets/unmuxed_1500k/13.ts
new file mode 100644
index 0000000..50010e2
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/14.ts b/tests/tests/media/assets/unmuxed_1500k/14.ts
new file mode 100644
index 0000000..8667a91
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/15.ts b/tests/tests/media/assets/unmuxed_1500k/15.ts
new file mode 100644
index 0000000..124b1b5
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/index.m3u8 b/tests/tests/media/assets/unmuxed_1500k/index.m3u8
new file mode 100644
index 0000000..ee979a2
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/index.m3u8
@@ -0,0 +1,37 @@
+#EXTM3U
+#EXT-X-INDEPENDENT-SEGMENTS
+#EXT-X-VERSION:5
+#EXT-X-TARGETDURATION:10
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXT-X-KEY:METHOD=SAMPLE-AES,URI="00.key",IV=0x10428210ced85ee2ece4f45206ba81ce
+#EXTINF:5.04167,
+00.ts
+#EXTINF:6.83333,
+01.ts
+#EXTINF:3.875,
+02.ts
+#EXTINF:7.29167,
+03.ts
+#EXTINF:10,
+04.ts
+#EXTINF:10,
+05.ts
+#EXTINF:4.66667,
+06.ts
+#EXTINF:8.375,
+07.ts
+#EXTINF:7.70833,
+08.ts
+#EXTINF:9.66667,
+09.ts
+#EXTINF:6.5,
+10.ts
+#EXTINF:9.79167,
+11.ts
+#EXTINF:10,
+12.ts
+#EXTINF:4.16667,
+13.ts
+#EXTINF:8.75,
+14.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
index ff8efc7..921db5a 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
@@ -234,6 +234,12 @@
         playVideoWithRetries(uri, headers, cookies, null /* width */, null /* height */, playTime);
     }
 
+    protected void playLiveAudioOnlyTest(
+            Uri uri, Map<String, String> headers, List<HttpCookie> cookies,
+            int playTime) throws Exception {
+        playVideoWithRetries(uri, headers, cookies, -1 /* width */, -1 /* height */, playTime);
+    }
+
     protected void playVideoWithRetries(
             Uri uri, Map<String, String> headers, List<HttpCookie> cookies,
             Integer width, Integer height, int playTime) throws Exception {
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index b981a0b..80ec789 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -37,15 +37,23 @@
 import com.android.compatibility.common.util.MediaUtils;
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
 import java.net.HttpCookie;
+import java.net.Socket;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.http.impl.DefaultHttpServerConnection;
+import org.apache.http.impl.io.SocketOutputBuffer;
+import org.apache.http.io.SessionOutputBuffer;
+import org.apache.http.params.HttpParams;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Tests of MediaPlayer streaming capabilities.
  */
 public class StreamingMediaPlayerTest extends MediaPlayerTestBase {
+
     private static final String TAG = "StreamingMediaPlayerTest";
 
     private static final String HTTP_H263_AMR_VIDEO_1_KEY =
@@ -61,6 +69,9 @@
     private static final String HTTP_MPEG4_SP_AAC_VIDEO_2_KEY =
             "streaming_media_player_test_http_mpeg4_sp_aac_video2";
     private static final String MODULE_NAME = "CtsMediaTestCases";
+
+    private static final int LOCAL_HLS_BITS_PER_MS = 100 * 1000;
+
     private DynamicConfigDeviceSide dynamicConfig;
 
     private CtsTestServer mServer;
@@ -171,19 +182,15 @@
         playVideoTest(urlString, 640, 360);
     }
 
-    // Streaming HLS video from YouTube
+    // Streaming HLS video downloaded from YouTube
     public void testHLS() throws Exception {
         if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
             return; // skip
         }
 
         // Play stream for 60 seconds
-        playLiveVideoTest("http://www.youtube.com/api/manifest/hls_variant/id/"
-                + "0168724d02bd9945/itag/5/source/youtube/playlist_type/DVR/ip/"
-                + "0.0.0.0/ipbits/0/expire/19000000000/sparams/ip,ipbits,expire"
-                + ",id,itag,source,playlist_type/signature/773AB8ACC68A96E5AA48"
-                + "1996AD6A1BBCB70DCB87.95733B544ACC5F01A1223A837D2CF04DF85A336"
-                + "0/key/ik0/file/m3u8", 60 * 1000);
+        // limit rate to workaround multiplication overflow in framework
+        localHlsTest("hls_variant/index.m3u8", 60 * 1000, LOCAL_HLS_BITS_PER_MS, false /*isAudioOnly*/);
     }
 
     public void testHlsWithHeadersCookies() throws Exception {
@@ -191,14 +198,6 @@
             return; // skip
         }
 
-        final Uri uri = Uri.parse(
-                "http://www.youtube.com/api/manifest/hls_variant/id/"
-                + "0168724d02bd9945/itag/5/source/youtube/playlist_type/DVR/ip/"
-                + "0.0.0.0/ipbits/0/expire/19000000000/sparams/ip,ipbits,expire"
-                + ",id,itag,source,playlist_type/signature/773AB8ACC68A96E5AA48"
-                + "1996AD6A1BBCB70DCB87.95733B544ACC5F01A1223A837D2CF04DF85A336"
-                + "0/key/ik0/file/m3u8");
-
         // TODO: dummy values for headers/cookies till we find a server that actually needs them
         HashMap<String, String> headers = new HashMap<>();
         headers.put("header0", "value0");
@@ -218,7 +217,8 @@
         cookies.add(cookie);
 
         // Play stream for 60 seconds
-        playLiveVideoTest(uri, headers, cookies, 60 * 1000);
+        // limit rate to workaround multiplication overflow in framework
+        localHlsTest("hls_variant/index.m3u8", 60 * 1000, LOCAL_HLS_BITS_PER_MS, false /*isAudioOnly*/);
     }
 
     public void testHlsSampleAes_bbb_audio_only_overridable() throws Exception {
@@ -226,16 +226,14 @@
             return; // skip
         }
 
-        String defaultUrl = "http://storage.googleapis.com/wvmedia/cenc/hls/sample_aes/" +
-                            "bbb_1080p_30fps_11min/audio_only/prog_index.m3u8";
-
-        // if url override provided
-        String testUrl = (mInputUrl != null) ? mInputUrl : defaultUrl;
-
         // Play stream for 60 seconds
-        playLiveAudioOnlyTest(
-                testUrl,
-                60 * 1000);
+        if (mInputUrl != null) {
+            // if url override provided
+            playLiveAudioOnlyTest(mInputUrl, 60 * 1000);
+        } else {
+            localHlsTest("audio_only/index.m3u8", 60 * 1000, -1, true /*isAudioOnly*/);
+        }
+
     }
 
     public void testHlsSampleAes_bbb_unmuxed_1500k() throws Exception {
@@ -255,10 +253,7 @@
 
                 // Play 1080p stream for 60 seconds if platform supports.
                 if (vcaps.areSizeAndRateSupported(1920 ,1080, 30)) {
-                    playLiveVideoTest(
-                            "http://storage.googleapis.com/wvmedia/cenc/hls/sample_aes/" +
-                            "bbb_1080p_30fps_11min/unmuxed_1500k/prog_index.m3u8",
-                            60 * 1000);
+                    localHlsTest("unmuxed_1500k/index.m3u8", 60 * 1000, -1, false /*isAudioOnly*/);
                 }
             } catch (IllegalArgumentException e) {
             }
@@ -272,10 +267,7 @@
         }
 
         // Play 480p stream for 60 seconds
-        playLiveVideoTest(
-                "https://storage.googleapis.com/wvmedia/cenc/hls/sample_aes/" +
-                "bbb_480p_30fps/unmuxed_1000k/bbb_h264_main_480p_30fps_1000.m3u8",
-                60 * 1000);
+        localHlsTest("unmuxed_1000k/index.m3u8", 60 * 1000, -1, false /*isAudioOnly*/);
     }
 
     // Streaming audio from local HTTP server
@@ -493,21 +485,21 @@
         if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
             return; // skip
         }
-        localHlsTest("hls.m3u8", false, false);
+        localHlsTest("hls.m3u8", false, false, false /*isAudioOnly*/);
     }
 
     public void testPlayHlsStreamWithQueryString() throws Throwable {
         if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
             return; // skip
         }
-        localHlsTest("hls.m3u8", true, false);
+        localHlsTest("hls.m3u8", true, false, false /*isAudioOnly*/);
     }
 
     public void testPlayHlsStreamWithRedirect() throws Throwable {
         if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
             return; // skip
         }
-        localHlsTest("hls.m3u8", false, true);
+        localHlsTest("hls.m3u8", false, true, false /*isAudioOnly*/);
     }
 
     public void testPlayHlsStreamWithTimedId3() throws Throwable {
@@ -690,9 +682,29 @@
         worker.quit();
     }
 
-    private void localHlsTest(final String name, boolean appendQueryString, boolean redirect)
-            throws Throwable {
-        mServer = new CtsTestServer(mContext);
+    private void localHlsTest(final String name, boolean appendQueryString,
+            boolean redirect, boolean isAudioOnly) throws Exception {
+        localHlsTest(name, null, null, appendQueryString, redirect, 10, -1, isAudioOnly);
+    }
+
+    private void localHlsTest(final String name, int playTime, int bitsPerMs, boolean isAudioOnly)
+            throws Exception {
+        localHlsTest(name, null, null, false, false, playTime, bitsPerMs, isAudioOnly);
+    }
+
+    private void localHlsTest(String name, Map<String, String> headers, List<HttpCookie> cookies,
+            boolean appendQueryString, boolean redirect, int playTime, int bitsPerMs,
+            boolean isAudioOnly) throws Exception {
+        if (bitsPerMs >= 0) {
+            mServer = new CtsTestServer(mContext) {
+                @Override
+                protected DefaultHttpServerConnection createHttpServerConnection() {
+                    return new RateLimitHttpServerConnection(bitsPerMs);
+                }
+            };
+        } else {
+            mServer = new CtsTestServer(mContext);
+        }
         try {
             String stream_url = null;
             if (redirect) {
@@ -703,10 +715,67 @@
             if (appendQueryString) {
                 stream_url += "?foo=bar/baz";
             }
-
-            playLiveVideoTest(stream_url, 10);
+            if (isAudioOnly) {
+                playLiveAudioOnlyTest(Uri.parse(stream_url), headers, cookies, playTime);
+            } else {
+                playLiveVideoTest(Uri.parse(stream_url), headers, cookies, playTime);
+            }
         } finally {
             mServer.shutdown();
         }
     }
+
+    private static final class RateLimitHttpServerConnection extends DefaultHttpServerConnection {
+
+        private final int mBytesPerMs;
+        private int mBytesWritten;
+
+        public RateLimitHttpServerConnection(int bitsPerMs) {
+            mBytesPerMs = bitsPerMs / 8;
+        }
+
+        @Override
+        protected SessionOutputBuffer createHttpDataTransmitter(
+                Socket socket, int buffersize, HttpParams params) throws IOException {
+            return createSessionOutputBuffer(socket, buffersize, params);
+        }
+
+        SessionOutputBuffer createSessionOutputBuffer(
+                Socket socket, int buffersize, HttpParams params) throws IOException {
+            return new SocketOutputBuffer(socket, buffersize, params) {
+                @Override
+                public void write(int b) throws IOException {
+                    write(new byte[] {(byte)b});
+                }
+
+                @Override
+                public void write(byte[] b) throws IOException {
+                    write(b, 0, b.length);
+                }
+
+                @Override
+                public synchronized void write(byte[] b, int off, int len) throws IOException {
+                    mBytesWritten += len;
+                    if (mBytesWritten >= mBytesPerMs * 10) {
+                        int r = mBytesWritten % mBytesPerMs;
+                        int nano = 999999 * r / mBytesPerMs;
+                        delay(mBytesWritten / mBytesPerMs, nano);
+                        mBytesWritten = 0;
+                    }
+                    super.write(b, off, len);
+                }
+
+                private void delay(long millis, int nanos) throws IOException {
+                    try {
+                        Thread.sleep(millis, nanos);
+                        flush();
+                    } catch (InterruptedException e) {
+                        throw new InterruptedIOException();
+                    }
+                }
+
+            };
+        }
+    }
+
 }
diff --git a/tests/tests/net/jni/NativeMultinetworkJni.c b/tests/tests/net/jni/NativeMultinetworkJni.c
index 9156504..c2dff8d 100644
--- a/tests/tests/net/jni/NativeMultinetworkJni.c
+++ b/tests/tests/net/jni/NativeMultinetworkJni.c
@@ -179,13 +179,17 @@
     setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
 
     // For reference see:
-    //     https://tools.ietf.org/html/draft-tsvwg-quic-protocol-01#section-6.1
-    uint8_t quic_packet[] = {
-        0x0c,                    // public flags: 64bit conn ID, 8bit sequence number
+    //     https://tools.ietf.org/html/draft-tsvwg-quic-protocol#section-6.1
+    uint8_t quic_packet[1200] = {
+        0x0d,                    // public flags:
+                                 //   - version present (0x01),
+                                 //   - 64bit connection ID (0x0c),
+                                 //   - 1 byte packet number (0x00)
         0, 0, 0, 0, 0, 0, 0, 0,  // 64bit connection ID
-        0x01,                    // sequence number
+        0xaa, 0xda, 0xca, 0xaa,  // reserved-space version number
+        1,                       // 1 byte packet number
         0x00,                    // private flags
-        0x07,                    // type: regular frame type "PING"
+        0x07,                    // PING frame (cuz why not)
     };
 
     arc4random_buf(quic_packet + 1, 8);  // random connection ID
@@ -213,7 +217,7 @@
                   i + 1, MAX_RETRIES, rcvd, errnum);
         }
     }
-    if (rcvd < sent) {
+    if (rcvd < 9) {
         ALOGD("QUIC UDP %s: sent=%zd but rcvd=%zd, errno=%d", kPort, sent, rcvd, errnum);
         if (rcvd <= 0) {
             ALOGD("Does this network block UDP port %s?", kPort);
@@ -229,8 +233,7 @@
         return -EPROTO;
     }
 
-    // TODO: log, and compare to the IP address encoded in the
-    // response, since this should be a public reset packet.
+    // TODO: Replace this quick 'n' dirty test with proper QUIC-capable code.
 
     close(fd);
     return 0;
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index b22f6c7..537a987 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -27,6 +27,7 @@
     ctstestserver \
     ctstestrunner \
     compatibility-device-util \
+    compatibility-common-util-devicesidelib \
     guava \
     platform-test-annotations \
     legacy-android-test
diff --git a/tests/tests/security/src/android/security/cts/StagefrightTest.java b/tests/tests/security/src/android/security/cts/StagefrightTest.java
index 6cc6988..72bdb3a 100644
--- a/tests/tests/security/src/android/security/cts/StagefrightTest.java
+++ b/tests/tests/security/src/android/security/cts/StagefrightTest.java
@@ -57,6 +57,7 @@
 import java.util.HashMap;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.regex.Pattern;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -556,8 +557,23 @@
         MediaPlayer.OnPreparedListener,
         MediaPlayer.OnCompletionListener {
 
-        private final String[] validProcessNames = {
-            "mediaserver", "mediadrmserver", "media.extractor", "media.codec", "media.metrics"
+        private final Pattern[] validProcessPatterns = {
+            Pattern.compile("adsprpcd"),
+            Pattern.compile("android\\.hardware\\.cas@\\d+?\\.\\d+?-service"),
+            Pattern.compile("android\\.hardware\\.drm@\\d+?\\.\\d+?-service"),
+            Pattern.compile("android\\.hardware\\.drm@\\d+?\\.\\d+?-service\\.clearkey"),
+            Pattern.compile("android\\.hardware\\.drm@\\d+?\\.\\d+?-service\\.widevine"),
+            Pattern.compile("android\\.process\\.media"),
+            Pattern.compile("mediadrmserver"),
+            Pattern.compile("media\\.extractor"),
+            Pattern.compile("media\\.metrics"),
+            Pattern.compile("mediaserver"),
+            Pattern.compile("media\\.codec"),
+            Pattern.compile("media\\.swcodec"),
+            Pattern.compile("\\[?sdcard\\]?"), // name:/system/bin/sdcard, user:media_rw
+            // Match any vendor processes.
+            // It should only catch crashes that happen during the test.
+            Pattern.compile("vendor.*"),
         };
 
         @Override
@@ -605,7 +621,7 @@
                 if (crashes == null) {
                     Log.e(TAG, "Crash results not found for test " + getName());
                     return what;
-                } else if (CrashUtils.detectCrash(validProcessNames, true, crashes)) {
+                } else if (CrashUtils.securityCrashDetected(crashes, true, validProcessPatterns)) {
                     return what;
                 } else {
                     Log.i(TAG, "Crash ignored due to no security crash found for test " +
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
index 88475d1..6a36536 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -81,8 +81,8 @@
             new ShortCodeTest("al", "654321", CATEGORY_NOT_SHORT_CODE),
 
             new ShortCodeTest("am", "112", expectedReturnCode("112")),
-            new ShortCodeTest("am", "101", CATEGORY_FREE_SHORT_CODE),
-            new ShortCodeTest("am", "102", CATEGORY_FREE_SHORT_CODE),
+            //new ShortCodeTest("am", "101", CATEGORY_FREE_SHORT_CODE),
+            //new ShortCodeTest("am", "102", CATEGORY_FREE_SHORT_CODE),
             new ShortCodeTest("am", "103", CATEGORY_FREE_SHORT_CODE),
             new ShortCodeTest("am", "222", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
             new ShortCodeTest("am", "1111", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
diff --git a/tests/tests/text/src/android/text/format/cts/TimeTest.java b/tests/tests/text/src/android/text/format/cts/TimeTest.java
index f43ad12..df93f34 100644
--- a/tests/tests/text/src/android/text/format/cts/TimeTest.java
+++ b/tests/tests/text/src/android/text/format/cts/TimeTest.java
@@ -2825,6 +2825,13 @@
         Fields.verifyTimeEquals(expected, t);
     }
 
+    @Test
+    public void test_bug118835133() {
+        Time t = new Time("Asia/Singapore");
+        Fields.set(t, 2018, 9, 30, 12, 48, 32, 0 /* isDst */, 0, 0, 0);
+        // With http://b/118835133 toMillis() returns -1.
+        assertEquals(1540874912000L, t.toMillis(true /* ignoreDst */));
+    }
     private static void verifyNormalizeResult(boolean normalizeArgument, Time toNormalize,
             Time expectedTime, long expectedTimeMillis) {
         long actualTimeMillis = toNormalize.normalize(normalizeArgument /* ignore isDst */);
diff --git a/tests/tests/view/res/layout/view_layout.xml b/tests/tests/view/res/layout/view_layout.xml
index 6f886bb..fbdddc2 100644
--- a/tests/tests/view/res/layout/view_layout.xml
+++ b/tests/tests/view/res/layout/view_layout.xml
@@ -26,8 +26,8 @@
 
     <android.view.cts.MockView
         android:id="@+id/mock_view"
-        android:layout_width="100dp"
-        android:layout_height="75dp"/>
+        android:layout_width="75dp"
+        android:layout_height="100dp"/>
 
     <android.view.cts.MockView
         android:id="@+id/scroll_view"
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 6625e0a..cdb2223 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -114,7 +114,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -1822,8 +1824,8 @@
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
         float density = view.getContext().getResources().getDisplayMetrics().density;
-        int size1 = (int) (100 * density + 0.5);
-        int size2 = (int) (75 * density + 0.5);
+        int size1 = (int) (75 * density + 0.5);
+        int size2 = (int) (100 * density + 0.5);
 
         assertTrue(view.hasCalledOnMeasure());
         assertEquals(size1, view.getMeasuredWidth());
@@ -2422,8 +2424,8 @@
         Rect rect = new Rect();
 
         float density = view.getContext().getResources().getDisplayMetrics().density;
-        int size1 = (int) (100 * density + 0.5);
-        int size2 = (int) (75 * density + 0.5);
+        int size1 = (int) (75 * density + 0.5);
+        int size2 = (int) (100 * density + 0.5);
 
         assertTrue(view.getLocalVisibleRect(rect));
         assertEquals(0, rect.left);
@@ -2776,6 +2778,92 @@
         assertFalse(mockView1.hasCalledOnTouchEvent());
     }
 
+    /**
+     * Ensure two MotionEvents are equal, for the purposes of this test only.
+     * Only compare actions, source, and times.
+     * Do not compare coordinates, because the injected event has coordinates relative to
+     * the screen, while the event received by view will be adjusted relative to the parent.
+     *
+     * Due to event batching, if two or more input events are injected / occur between two
+     * consecutive vsync's, they might end up getting combined into a single MotionEvent.
+     * It is caller's responsibility to ensure that the events were injected with a gap that's
+     * larger than time between two vsyncs, in order for this function to behave predictably.
+     *
+     * Recycle both MotionEvents.
+     */
+    private static void compareAndRecycleMotionEvents(MotionEvent event1, MotionEvent event2) {
+        if (event1 == null && event2 == null) {
+            return;
+        }
+
+        if (event1 == null) {
+            event2.recycle();
+            fail("Expected non-null event in first position");
+        }
+        if (event2 == null) {
+            event1.recycle();
+            fail("Expected non-null event in second position");
+        }
+
+        assertEquals(event1.getAction(), event2.getAction());
+        assertEquals(event1.getPointerCount(), event2.getPointerCount());
+        assertEquals(event1.getSource(), event2.getSource());
+        assertEquals(event1.getDownTime(), event2.getDownTime());
+        // If resampling occurs, the "real" (injected) events will become historical data,
+        // and resampled events will be inserted into MotionEvent and returned by the standard api.
+        // Since the injected event should contain no history, but the event received by
+        // the view might, we could distinguish them. But for simplicity, only require that
+        // the events are close in time if historical data is present.
+        if (event1.getHistorySize() == 0 && event2.getHistorySize() == 0) {
+            assertEquals(event1.getEventTime(), event2.getEventTime());
+        } else {
+            assertEquals(event1.getEventTime(), event2.getEventTime(), 20 /*delta*/);
+        }
+
+        event1.recycle();
+        event2.recycle();
+    }
+
+    @Test
+    public void testOnTouchListener() {
+        BlockingQueue<MotionEvent> events = new LinkedBlockingQueue<>();
+        class TestTouchListener implements View.OnTouchListener {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                events.add(MotionEvent.obtain(event));
+                return true;
+            }
+        }
+
+        // Inject some touch events
+        TestTouchListener listener = new TestTouchListener();
+        View view = mActivity.findViewById(R.id.mock_view);
+        view.setOnTouchListener(listener);
+
+        int[] xy = new int[2];
+        view.getLocationOnScreen(xy);
+
+        final int viewWidth = view.getWidth();
+        final int viewHeight = view.getHeight();
+        final float x = xy[0] + viewWidth / 2.0f;
+        final float y = xy[1] + viewHeight / 2.0f;
+
+        final long downTime = SystemClock.uptimeMillis();
+        MotionEvent downEvent =
+                MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0);
+        downEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+        mInstrumentation.getUiAutomation().injectInputEvent(downEvent, true);
+        final long eventTime = SystemClock.uptimeMillis();
+        MotionEvent upEvent =
+                MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0);
+        upEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+        mInstrumentation.getUiAutomation().injectInputEvent(upEvent, true);
+
+        compareAndRecycleMotionEvents(downEvent, events.poll());
+        compareAndRecycleMotionEvents(upEvent, events.poll());
+        assertTrue(events.isEmpty());
+    }
+
     @Test
     public void testInvalidate1() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
old mode 100644
new mode 100755
index 51e7d94..95c860e
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -1792,16 +1792,20 @@
         assertEquals(
                 mOnUiThread.getHeight(),
                 mOnUiThread.getContentHeight() * mOnUiThread.getScale(),
-                tolerance * mOnUiThread.getScale());
+                tolerance * Math.max(mOnUiThread.getScale(), 1.0f));
 
         // Make pageHeight bigger than the larger dimension of the device, so the page is taller
         // than viewport. Because when layout_height set to match_parent, getContentHeight() will
         // give maximum value between the actual web content height and the viewport height. When
         // viewport height is bigger, |extraSpace| below is not the extra space on the web page.
-        // Note that we are passing physical pixels rather than CSS pixels here, since screen
-        // density scale is generally greater than 1, it only makes the page content taller.
+        // Note that we are passing physical pixels rather than CSS pixels here, when screen density
+        // scale is lower than 1.0f, we need to scale it up.
         DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
-        final int pageHeight = Math.max(metrics.widthPixels, metrics.heightPixels);
+        final float scaleFactor = Math.max(1.0f, 1.0f / mOnUiThread.getScale());
+        final int pageHeight =
+                (int)(Math.ceil(Math.max(metrics.widthPixels, metrics.heightPixels)
+                * scaleFactor));
+
         // set the margin to 0
         final String p = "<p style=\"height:" + pageHeight
                 + "px;margin:0px auto;\">Get the height of HTML content.</p>";
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index c25c620..2c483d7 100755
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -635,6 +635,7 @@
     public void testShowAtLocation() throws Throwable {
         int[] popupContentViewInWindowXY = new int[2];
         int[] popupContentViewOnScreenXY = new int[2];
+        Rect containingRect = new Rect();
 
         mPopupWindow = createPopupWindow(createPopupContent(CONTENT_SIZE_DP, CONTENT_SIZE_DP));
         // Do not attach within the decor; we will be measuring location
@@ -658,11 +659,12 @@
         assertTrue(mPopupWindow.isShowing());
         mPopupWindow.getContentView().getLocationInWindow(popupContentViewInWindowXY);
         mPopupWindow.getContentView().getLocationOnScreen(popupContentViewOnScreenXY);
+        upperAnchor.getWindowDisplayFrame(containingRect);
 
         assertTrue(popupContentViewInWindowXY[0] >= 0);
         assertTrue(popupContentViewInWindowXY[1] >= 0);
-        assertEquals(popupContentViewInWindowXY[0] + xOff, popupContentViewOnScreenXY[0]);
-        assertEquals(popupContentViewInWindowXY[1] + yOff, popupContentViewOnScreenXY[1]);
+        assertEquals(containingRect.left + popupContentViewInWindowXY[0] + xOff, popupContentViewOnScreenXY[0]);
+        assertEquals(containingRect.top + popupContentViewInWindowXY[1] + yOff, popupContentViewOnScreenXY[1]);
 
         dismissPopup();
     }
@@ -943,6 +945,7 @@
         int[] fstXY = new int[2];
         int[] sndXY = new int[2];
         int[] viewInWindowXY = new int[2];
+        Rect containingRect = new Rect();
         final Point popupPos = new Point();
 
         mActivityRule.runOnUiThread(() -> {
@@ -962,6 +965,7 @@
         showPopup();
         mPopupWindow.getContentView().getLocationInWindow(viewInWindowXY);
         final View containerView = mActivity.findViewById(R.id.main_container);
+        containerView.getWindowDisplayFrame(containingRect);
 
         // update if it is not shown
         mActivityRule.runOnUiThread(() -> mPopupWindow.update(80, 80));
@@ -983,8 +987,8 @@
         assertEquals(50, mPopupWindow.getHeight());
 
         mPopupWindow.getContentView().getLocationOnScreen(fstXY);
-        assertEquals(popupPos.x + viewInWindowXY[0], fstXY[0]);
-        assertEquals(popupPos.y + viewInWindowXY[1], fstXY[1]);
+        assertEquals(containingRect.left + popupPos.x + viewInWindowXY[0], fstXY[0]);
+        assertEquals(containingRect.top + popupPos.y + viewInWindowXY[1], fstXY[1]);
 
         popupPos.set(windowInsets.getStableInsetLeft() + 4, windowInsets.getStableInsetTop());
 
@@ -998,8 +1002,8 @@
         assertEquals(50, mPopupWindow.getHeight());
 
         mPopupWindow.getContentView().getLocationOnScreen(sndXY);
-        assertEquals(popupPos.x + viewInWindowXY[0], sndXY[0]);
-        assertEquals(popupPos.y + viewInWindowXY[1], sndXY[1]);
+        assertEquals(containingRect.left + popupPos.x + viewInWindowXY[0], sndXY[0]);
+        assertEquals(containingRect.top + popupPos.y + viewInWindowXY[1], sndXY[1]);
 
         dismissPopup();
     }
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 50100ad..a84fb09 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -29,7 +29,7 @@
 LOCAL_SUITE_TARGET_ARCH := $(TARGET_ARCH)
 LOCAL_SUITE_NAME := CTS
 LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
-LOCAL_SUITE_VERSION := 8.1_r16
+LOCAL_SUITE_VERSION := 8.1_r17
 LOCAL_STATIC_JAVA_LIBRARIES += cts-tradefed-harness
 
 LOCAL_MODULE := cts-tradefed