diff --git a/src/cobalt/bindings/testing/bindings_test_base.h b/src/cobalt/bindings/testing/bindings_test_base.h
index 768dfb3..ddb7ca5 100644
--- a/src/cobalt/bindings/testing/bindings_test_base.h
+++ b/src/cobalt/bindings/testing/bindings_test_base.h
@@ -67,7 +67,8 @@
     scoped_refptr<script::SourceCode> source =
         script::SourceCode::CreateSourceCode(
             script, base::SourceLocation("[object BindingsTestBase]", 1, 1));
-    return global_environment_->EvaluateScript(source, out_result);
+    return global_environment_->EvaluateScript(source, out_result,
+                                               false /*mute_errors*/);
   }
 
   bool EvaluateScript(const std::string& script,
@@ -77,8 +78,8 @@
     scoped_refptr<script::SourceCode> source =
         script::SourceCode::CreateSourceCode(
             script, base::SourceLocation("[object BindingsTestBase]", 1, 1));
-    return global_environment_->EvaluateScript(source, owning_object,
-                                               out_opaque_handle);
+    return global_environment_->EvaluateScript(
+        source, owning_object, out_opaque_handle, false /*mute_errors*/);
   }
 
   void CollectGarbage() { engine_->CollectGarbage(); }
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index a946dee..636ebf5 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -495,18 +495,22 @@
   }
 #endif
 
+  base::optional<std::string> partition_key;
   if (command_line->HasSwitch(browser::switches::kLocalStoragePartitionUrl)) {
     std::string local_storage_partition_url = command_line->GetSwitchValueASCII(
         browser::switches::kLocalStoragePartitionUrl);
-    base::optional<std::string> partition_key =
-        base::GetApplicationKey(GURL(local_storage_partition_url));
+    partition_key = base::GetApplicationKey(GURL(local_storage_partition_url));
     CHECK(partition_key) << "local_storage_partition_url is not a valid URL.";
+  } else {
+    partition_key = base::GetApplicationKey(initial_url);
+  }
+  options.storage_manager_options.savegame_options.id = partition_key;
 
-    base::optional<std::string> default_partition_key =
-        base::GetApplicationKey(GURL(kDefaultURL));
-    if (*partition_key != *default_partition_key) {
-      options.storage_manager_options.savegame_options.id = *partition_key;
-    }
+  base::optional<std::string> default_key =
+      base::GetApplicationKey(GURL(kDefaultURL));
+  if (partition_key == default_key) {
+    options.storage_manager_options.savegame_options.fallback_to_default_id =
+        true;
   }
 
   // User can specify an extra search path entry for files loaded via file://.
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 9333666..4026fb1 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -713,8 +713,9 @@
   // JavaScript is being run. Track it in the global stats.
   dom::GlobalStats::GetInstance()->StartJavaScriptEvent();
 
-  *result = script_runner_->Execute(script_utf8, script_location,
-      out_succeeded);
+  // This should only be called for Cobalt javascript, errors not expected.
+  *result = script_runner_->Execute(script_utf8, script_location, out_succeeded,
+                                    true /*mute error reports*/);
 
   // JavaScript is done running. Stop tracking it in the global stats.
   dom::GlobalStats::GetInstance()->StopJavaScriptEvent();
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index d4d1d7c..6125516 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-103922
\ No newline at end of file
+104689
\ No newline at end of file
diff --git a/src/cobalt/css_parser/parser.cc b/src/cobalt/css_parser/parser.cc
index 98b1521..5397d14 100644
--- a/src/cobalt/css_parser/parser.cc
+++ b/src/cobalt/css_parser/parser.cc
@@ -399,9 +399,7 @@
       }
       return false;
     case 2:
-      LogError(
-          "the html put too many queries on bison stack without "
-          "closing/reducing");
+      LogError("bison parser is out of memory");
       return false;
     default:
       NOTREACHED();
diff --git a/src/cobalt/css_parser/parser_test.cc b/src/cobalt/css_parser/parser_test.cc
index 8af545c..aad3f22 100644
--- a/src/cobalt/css_parser/parser_test.cc
+++ b/src/cobalt/css_parser/parser_test.cc
@@ -129,7 +129,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, HandlesInvalidAtRuleEndsWithSemicolons) {
@@ -141,7 +141,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("@casino-royale;", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, HandlesInvalidAtRuleWithoutSemicolonsAtTheEndOfFile) {
@@ -153,7 +153,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("@casino-royale", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, HandlesInvalidAtRuleWithNoMatchingEndBrace) {
@@ -165,7 +165,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("@casino-royale }", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, ComputesErrorLocationOnFirstLine) {
@@ -176,7 +176,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet = parser_.ParseStyleSheet(
       "cucumber", base::SourceLocation("[object ParserTest]", 10, 10));
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, ComputesErrorLocationOnSecondLine) {
@@ -189,14 +189,14 @@
       "cucumber",
       base::SourceLocation("[object ParserTest]", 10, 10));
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, IgnoresSgmlCommentDelimiters) {
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("<!-- body {} -->", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(1, style_sheet->css_rules()->length());
+  EXPECT_EQ(1, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, RecoversFromInvalidAtToken) {
@@ -208,7 +208,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet = parser_.ParseStyleSheet(
       "body {} @cobalt-magic; div {}", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(2, style_sheet->css_rules()->length());
+  EXPECT_EQ(2, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, RecoversFromInvalidRuleWhichEndsWithSemicolon) {
@@ -219,7 +219,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet = parser_.ParseStyleSheet(
       "body {} @charset 'utf-8'; div {}", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(2, style_sheet->css_rules()->length());
+  EXPECT_EQ(2, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, RecoversFromInvalidRuleWhichEndsWithBlock) {
@@ -230,7 +230,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("body {} !important {} div {}", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(2, style_sheet->css_rules()->length());
+  EXPECT_EQ(2, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, SemicolonsDonotEndQualifiedRules) {
@@ -241,18 +241,18 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("foo; bar {} div {}", source_location_);
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(1, style_sheet->css_rules()->length());
+  EXPECT_EQ(1, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, ParsesAttributeSelectorNoValue) {
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("[attr] {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -274,11 +274,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("[attr=\"value\"] {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -301,11 +301,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("[attr=value] {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -328,11 +328,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(".my-class {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -353,11 +353,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":after {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -378,11 +378,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("::after {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -403,11 +403,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":before {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -428,11 +428,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("::before {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -453,11 +453,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":active {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -478,11 +478,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":empty {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -502,11 +502,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":focus {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -526,11 +526,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":hover {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -550,11 +550,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":not(div.my-class) {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -593,7 +593,7 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":not() {}", source_location_);
 
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, ParsesNotPseudoClassShouldNotTakeComplexSelector) {
@@ -604,18 +604,18 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet(":not(div span) {}", source_location_);
 
-  EXPECT_EQ(0, style_sheet->css_rules()->length());
+  EXPECT_EQ(0, style_sheet->css_rules_same_origin()->length());
 }
 
 TEST_F(ParserTest, ParsesIdSelector) {
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("#my-id {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -636,11 +636,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("div {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -661,11 +661,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("* {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -686,11 +686,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("div.my-class {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -716,11 +716,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("div div {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -737,11 +737,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("div ~ div {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -758,11 +758,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("div > div {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -779,11 +779,11 @@
   scoped_refptr<cssom::CSSStyleSheet> style_sheet =
       parser_.ParseStyleSheet("div + div {}", source_location_);
 
-  ASSERT_EQ(1, style_sheet->css_rules()->length());
+  ASSERT_EQ(1, style_sheet->css_rules_same_origin()->length());
   ASSERT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
   cssom::CSSStyleRule* style_rule = static_cast<cssom::CSSStyleRule*>(
-      style_sheet->css_rules()->Item(0).get());
+      style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_EQ(1, style_rule->selectors().size());
   cssom::ComplexSelector* complex_selector =
       dynamic_cast<cssom::ComplexSelector*>(
@@ -947,9 +947,9 @@
       "#my-id {} \n",
       source_location_);
 
-  EXPECT_EQ(1, style_sheet->css_rules()->length());
+  EXPECT_EQ(1, style_sheet->css_rules_same_origin()->length());
   EXPECT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
 }
 
 TEST_F(ParserTest, WarnsAboutInvalidAtRuleCurlyBraceInsideOfAnotherBlock) {
@@ -969,9 +969,9 @@
       "#my-id {} \n",
       source_location_);
 
-  EXPECT_EQ(1, style_sheet->css_rules()->length());
+  EXPECT_EQ(1, style_sheet->css_rules_same_origin()->length());
   EXPECT_EQ(cssom::CSSRule::kStyleRule,
-            style_sheet->css_rules()->Item(0)->type());
+            style_sheet->css_rules_same_origin()->Item(0)->type());
 }
 
 TEST_F(ParserTest, StyleSheetEndsWhileRuleIsStillOpen) {
@@ -985,11 +985,11 @@
       source_location_);
 
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(1, style_sheet->css_rules()->length());
+  EXPECT_EQ(1, style_sheet->css_rules_same_origin()->length());
 
   cssom::CSSKeyframesRule* keyframes_rule =
       dynamic_cast<cssom::CSSKeyframesRule*>(
-          style_sheet->css_rules()->Item(0).get());
+          style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_TRUE(keyframes_rule);
   EXPECT_EQ("foo3", keyframes_rule->name());
 
@@ -6937,11 +6937,11 @@
       source_location_);
 
   ASSERT_TRUE(style_sheet);
-  EXPECT_EQ(1, style_sheet->css_rules()->length());
+  EXPECT_EQ(1, style_sheet->css_rules_same_origin()->length());
 
   cssom::CSSKeyframesRule* keyframes_rule =
       dynamic_cast<cssom::CSSKeyframesRule*>(
-          style_sheet->css_rules()->Item(0).get());
+          style_sheet->css_rules_same_origin()->Item(0).get());
   ASSERT_TRUE(keyframes_rule);
   EXPECT_EQ("foo3", keyframes_rule->name());
 
diff --git a/src/cobalt/cssom/cascaded_style_test.cc b/src/cobalt/cssom/cascaded_style_test.cc
index 2e8a913..bad631e 100644
--- a/src/cobalt/cssom/cascaded_style_test.cc
+++ b/src/cobalt/cssom/cascaded_style_test.cc
@@ -144,6 +144,7 @@
       std::make_pair(css_style_rule_2, cascade_precedence_2));
 
   scoped_refptr<CSSStyleSheet> parent_style_sheet(new CSSStyleSheet());
+  parent_style_sheet->SetOriginClean(true);
   parent_style_sheet->SetLocationUrl(GURL("https:///www.youtube.com/tv/img"));
   css_style_rule_2->set_parent_style_sheet(parent_style_sheet.get());
 
@@ -187,6 +188,7 @@
       std::make_pair(css_style_rule, cascade_precedence));
 
   scoped_refptr<CSSStyleSheet> parent_style_sheet(new CSSStyleSheet());
+  parent_style_sheet->SetOriginClean(true);
   css_style_rule->set_parent_style_sheet(parent_style_sheet.get());
 
   scoped_refptr<CSSComputedStyleData> computed_style = PromoteToCascadedStyle(
diff --git a/src/cobalt/cssom/css_font_face_rule_test.cc b/src/cobalt/cssom/css_font_face_rule_test.cc
index 3980882..89dcadb 100644
--- a/src/cobalt/cssom/css_font_face_rule_test.cc
+++ b/src/cobalt/cssom/css_font_face_rule_test.cc
@@ -48,6 +48,7 @@
 class CSSFontFaceRuleTest : public ::testing::Test {
  protected:
   CSSFontFaceRuleTest() : css_style_sheet_(new CSSStyleSheet(&css_parser_)) {
+    css_style_sheet_->SetOriginClean(true);
     StyleSheetVector style_sheets;
     style_sheets.push_back(css_style_sheet_);
     style_sheet_list_ = new StyleSheetList(style_sheets, &mutation_observer_);
diff --git a/src/cobalt/cssom/css_style_sheet.cc b/src/cobalt/cssom/css_style_sheet.cc
index 4318abb..b1575d3 100644
--- a/src/cobalt/cssom/css_style_sheet.cc
+++ b/src/cobalt/cssom/css_style_sheet.cc
@@ -24,6 +24,7 @@
 #include "cobalt/cssom/css_style_declaration.h"
 #include "cobalt/cssom/css_style_rule.h"
 #include "cobalt/cssom/style_sheet_list.h"
+#include "cobalt/dom/dom_exception.h"
 
 namespace cobalt {
 namespace cssom {
@@ -72,15 +73,32 @@
     : parent_style_sheet_list_(NULL),
       css_parser_(NULL),
       media_rules_changed_(false),
-      origin_(kNormalAuthor) {}
+      origin_(kNormalAuthor),
+      origin_clean_(false) {}
 
 CSSStyleSheet::CSSStyleSheet(CSSParser* css_parser)
     : parent_style_sheet_list_(NULL),
       css_parser_(css_parser),
       media_rules_changed_(false),
-      origin_(kNormalAuthor) {}
+      origin_(kNormalAuthor),
+      origin_clean_(false) {}
 
-const scoped_refptr<CSSRuleList>& CSSStyleSheet::css_rules() {
+// https://drafts.csswg.org/cssom/#dom-cssstylesheet-cssrules
+const scoped_refptr<CSSRuleList>& CSSStyleSheet::css_rules(
+    script::ExceptionState* exception_state) {
+  if (!origin_clean_) {
+    dom::DOMException::Raise(
+        dom::DOMException::kSecurityErr,
+        "Website trys to access css rules from a CSSStyleSheet "
+        "fetched from another origin.",
+        exception_state);
+    DCHECK(!null_css_rule_list_);
+    return null_css_rule_list_;
+  }
+  return css_rules_same_origin();
+}
+
+const scoped_refptr<CSSRuleList>& CSSStyleSheet::css_rules_same_origin() {
   if (!css_rule_list_) {
     set_css_rules(new CSSRuleList());
   }
@@ -88,9 +106,24 @@
   return css_rule_list_;
 }
 
-unsigned int CSSStyleSheet::InsertRule(const std::string& rule,
-                                       unsigned int index) {
-  return css_rules()->InsertRule(rule, index);
+// https://drafts.csswg.org/cssom/#dom-cssstylesheet-insertrule
+unsigned int CSSStyleSheet::InsertRule(
+    const std::string& rule, unsigned int index,
+    script::ExceptionState* exception_state) {
+  if (!origin_clean_) {
+    dom::DOMException::Raise(
+        dom::DOMException::kSecurityErr,
+        "Website trys to insert css rule to a CSSStyleSheet fetched"
+        "from another origin.",
+        exception_state);
+    return 0;
+  }
+  return css_rules_same_origin()->InsertRule(rule, index);
+}
+
+unsigned int CSSStyleSheet::InsertRuleSameOrigin(const std::string& rule,
+                                                 unsigned int index) {
+  return css_rules_same_origin()->InsertRule(rule, index);
 }
 
 void CSSStyleSheet::OnCSSMutation() {
diff --git a/src/cobalt/cssom/css_style_sheet.h b/src/cobalt/cssom/css_style_sheet.h
index aefa0de..1d3dabb 100644
--- a/src/cobalt/cssom/css_style_sheet.h
+++ b/src/cobalt/cssom/css_style_sheet.h
@@ -27,6 +27,7 @@
 #include "cobalt/cssom/mutation_observer.h"
 #include "cobalt/cssom/style_sheet.h"
 #include "cobalt/math/size.h"
+#include "cobalt/script/exception_state.h"
 #include "googleurl/src/gurl.h"
 
 namespace cobalt {
@@ -48,11 +49,22 @@
   // Web API: CSSStyleSheet
   //
   // Returns a read-only, live object representing the CSS rules.
-  const scoped_refptr<CSSRuleList>& css_rules();
+  const scoped_refptr<CSSRuleList>& css_rules(
+      cobalt::script::ExceptionState* exception_state);
+
+  // Bypass same origin policy to get css rules. This assumes that the request
+  // comes from same origin and should not be accessible to javascript code.
+  const scoped_refptr<CSSRuleList>& css_rules_same_origin();
 
   // Inserts a new rule into the current style sheet. This Web API takes a
   // string as input and parses it into a rule.
-  unsigned int InsertRule(const std::string& rule, unsigned int index);
+  unsigned int InsertRule(const std::string& rule, unsigned int index,
+                          cobalt::script::ExceptionState* exception_state);
+
+  // Insert css rules without disallowing cross-origin access. This should be
+  // used internally by Cobalt.
+  unsigned int InsertRuleSameOrigin(const std::string& rule,
+                                    unsigned int index);
 
   // Custom, not in any spec.
   //
@@ -82,6 +94,8 @@
   // that is reset in EvaluateMediaRules().
   void OnMediaRuleMutation() { media_rules_changed_ = true; }
 
+  void SetOriginClean(bool origin_clean) { origin_clean_ = origin_clean; }
+
   DEFINE_WRAPPABLE_TYPE(CSSStyleSheet);
 
  private:
@@ -89,6 +103,9 @@
 
   scoped_refptr<CSSRuleList> css_rule_list_;
 
+  // Null scoped_refptr used when access to css rules should be blocked.
+  scoped_refptr<CSSRuleList> null_css_rule_list_;
+
   StyleSheetList* parent_style_sheet_list_;
   CSSParser* const css_parser_;
   GURL location_url_;
@@ -104,6 +121,11 @@
   // Origin of this style sheet.
   Origin origin_;
 
+  // https://drafts.csswg.org/cssom/#concept-css-style-sheet-origin-clean-flag
+  // It is used to block cross-origin website's access to the fetched style
+  // sheet. It is only possible to be set false when creating a HTMLLinkElement
+  bool origin_clean_;
+
   // Since CSSRuleList is merely a proxy, it needs access to CSS rules stored
   // in the stylesheet.
   friend class CSSRuleList;
diff --git a/src/cobalt/cssom/css_style_sheet.idl b/src/cobalt/cssom/css_style_sheet.idl
index 49ed8d7..71d88ca 100644
--- a/src/cobalt/cssom/css_style_sheet.idl
+++ b/src/cobalt/cssom/css_style_sheet.idl
@@ -15,6 +15,6 @@
 // https://www.w3.org/TR/2013/WD-cssom-20131205/#the-cssstylesheet-interface
 
 interface CSSStyleSheet : StyleSheet {
-  [SameObject] readonly attribute CSSRuleList cssRules;
-  unsigned long insertRule(DOMString rule, unsigned long index);
+  [SameObject, RaisesException] readonly attribute CSSRuleList cssRules;
+  [RaisesException] unsigned long insertRule(DOMString rule, unsigned long index);
 };
diff --git a/src/cobalt/cssom/css_style_sheet_test.cc b/src/cobalt/cssom/css_style_sheet_test.cc
index e817f48..25b8a0b 100644
--- a/src/cobalt/cssom/css_style_sheet_test.cc
+++ b/src/cobalt/cssom/css_style_sheet_test.cc
@@ -46,6 +46,7 @@
 class CSSStyleSheetTest : public ::testing::Test {
  protected:
   CSSStyleSheetTest() : css_style_sheet_(new CSSStyleSheet(&css_parser_)) {
+    css_style_sheet_->SetOriginClean(true);
     StyleSheetVector style_sheets;
     style_sheets.push_back(css_style_sheet_);
     style_sheet_list_ = new StyleSheetList(style_sheets, &mutation_observer_);
@@ -63,17 +64,20 @@
 
   EXPECT_CALL(css_parser_, ParseRule(css_text, _))
       .WillOnce(Return(scoped_refptr<CSSRule>()));
-  css_style_sheet_->InsertRule(css_text, 0);
+  css_style_sheet_->InsertRuleSameOrigin(css_text, 0);
 }
 
 TEST_F(CSSStyleSheetTest, CSSRuleListIsCached) {
-  scoped_refptr<CSSRuleList> rule_list_1 = css_style_sheet_->css_rules();
-  scoped_refptr<CSSRuleList> rule_list_2 = css_style_sheet_->css_rules();
+  scoped_refptr<CSSRuleList> rule_list_1 =
+      css_style_sheet_->css_rules_same_origin();
+  scoped_refptr<CSSRuleList> rule_list_2 =
+      css_style_sheet_->css_rules_same_origin();
   ASSERT_EQ(rule_list_1, rule_list_2);
 }
 
 TEST_F(CSSStyleSheetTest, CSSRuleListIsLive) {
-  scoped_refptr<CSSRuleList> rule_list = css_style_sheet_->css_rules();
+  scoped_refptr<CSSRuleList> rule_list =
+      css_style_sheet_->css_rules_same_origin();
   ASSERT_EQ(0, rule_list->length());
   ASSERT_FALSE(rule_list->Item(0).get());
 
@@ -86,7 +90,7 @@
   ASSERT_EQ(1, rule_list->length());
   ASSERT_EQ(rule, rule_list->Item(0));
   ASSERT_FALSE(rule_list->Item(1).get());
-  ASSERT_EQ(rule_list, css_style_sheet_->css_rules());
+  ASSERT_EQ(rule_list, css_style_sheet_->css_rules_same_origin());
 }
 
 TEST_F(CSSStyleSheetTest, CSSMutationIsReportedAtStyleSheetList) {
@@ -104,7 +108,8 @@
   // EvaluateMediaRules(), even when called with the same media parameters as
   // before. That also tests that OnMediaRuleMutation() should be called and
   // that the flag it sets should be honored.
-  scoped_refptr<CSSRuleList> rule_list = css_style_sheet_->css_rules();
+  scoped_refptr<CSSRuleList> rule_list =
+      css_style_sheet_->css_rules_same_origin();
   // A CSSMediaRule with no expression always evaluates to true.
   scoped_refptr<CSSMediaRule> rule = new CSSMediaRule();
 
@@ -127,7 +132,8 @@
   scoped_refptr<MediaList> media_list(new MediaList());
   media_list->Append(media_query);
   scoped_refptr<CSSMediaRule> rule = new CSSMediaRule(media_list, NULL);
-  scoped_refptr<CSSRuleList> rule_list = css_style_sheet_->css_rules();
+  scoped_refptr<CSSRuleList> rule_list =
+      css_style_sheet_->css_rules_same_origin();
 
   EXPECT_CALL(mutation_observer_, OnCSSMutation()).Times(1);
   rule_list->AppendCSSRule(rule);
@@ -159,7 +165,7 @@
   // added to the style sheet.
 
   EXPECT_CALL(mutation_observer_, OnCSSMutation()).Times(1);
-  css_style_sheet_->css_rules()->AppendCSSRule(rule);
+  css_style_sheet_->css_rules_same_origin()->AppendCSSRule(rule);
 
   // This should result in a call to OnCSSMutation(), because the added media
   // rule evaluates to true, so its rule list needs to be traversed for the next
diff --git a/src/cobalt/cssom/style_sheet_list_test.cc b/src/cobalt/cssom/style_sheet_list_test.cc
index 3a0fce2..40b4b70 100644
--- a/src/cobalt/cssom/style_sheet_list_test.cc
+++ b/src/cobalt/cssom/style_sheet_list_test.cc
@@ -26,6 +26,7 @@
   ASSERT_FALSE(style_sheet_list->Item(0).get());
 
   scoped_refptr<CSSStyleSheet> style_sheet = new CSSStyleSheet();
+  style_sheet->SetOriginClean(true);
   StyleSheetVector style_sheet_vector;
   style_sheet_vector.push_back(style_sheet);
   style_sheet_list = new StyleSheetList(style_sheet_vector, NULL);
diff --git a/src/cobalt/cssom/user_agent_style_sheet.cc b/src/cobalt/cssom/user_agent_style_sheet.cc
index aa36c3e..3c3fb81 100644
--- a/src/cobalt/cssom/user_agent_style_sheet.cc
+++ b/src/cobalt/cssom/user_agent_style_sheet.cc
@@ -42,6 +42,7 @@
               static_cast<size_t>(html_css_file_contents.size)),
           base::SourceLocation(kUserAgentStyleSheetFileName, 1, 1));
   user_agent_style_sheet->set_origin(kNormalUserAgent);
+  user_agent_style_sheet->SetOriginClean(true);
   return user_agent_style_sheet;
 }
 
diff --git a/src/cobalt/debug/debug_script_runner.cc b/src/cobalt/debug/debug_script_runner.cc
index 4a61086..36a44ca 100644
--- a/src/cobalt/debug/debug_script_runner.cc
+++ b/src/cobalt/debug/debug_script_runner.cc
@@ -82,7 +82,8 @@
       script::SourceCode::CreateSourceCode(js_code, GetInlineSourceLocation());
 
   ForceEnableEval();
-  bool succeeded = global_environment_->EvaluateScript(source_code, result);
+  bool succeeded = global_environment_->EvaluateScript(source_code, result,
+                                                       false /*mute_errors*/);
   SetEvalAllowedFromCsp();
   return succeeded;
 }
diff --git a/src/cobalt/dom/custom_event_test.cc b/src/cobalt/dom/custom_event_test.cc
index 65c85c1..6712aff 100644
--- a/src/cobalt/dom/custom_event_test.cc
+++ b/src/cobalt/dom/custom_event_test.cc
@@ -110,7 +110,8 @@
 
   global_environment_->EnableEval();
   global_environment_->SetReportEvalCallback(base::Closure());
-  bool succeeded = global_environment_->EvaluateScript(source_code, result);
+  bool succeeded = global_environment_->EvaluateScript(source_code, result,
+                                                       false /*mute_errors*/);
   return succeeded;
 }
 }  // namespace
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc
index 211b221..3249b8c 100644
--- a/src/cobalt/dom/document.cc
+++ b/src/cobalt/dom/document.cc
@@ -381,27 +381,84 @@
   return style_sheets_;
 }
 
-void Document::set_cookie(const std::string& cookie) {
-#if defined(COBALT_BUILD_TYPE_GOLD)
-  UNREFERENCED_PARAMETER(cookie);
-#else
+// https://html.spec.whatwg.org/#cookie-averse-document-object
+bool Document::IsCookieAverseDocument() const {
+  return !HasBrowsingContext() || (!location_->url().SchemeIs("ftp") &&
+                                   !location_->url().SchemeIs("http") &&
+                                   !location_->url().SchemeIs("https"));
+}
+
+// https://html.spec.whatwg.org/#dom-document-cookie
+void Document::set_cookie(const std::string& cookie,
+                          script::ExceptionState* exception_state) {
+  if (IsCookieAverseDocument()) {
+    DLOG(WARNING) << "Document is a cookie-averse Document object, not "
+                     "setting cookie.";
+    return;
+  }
+  if (location_->OriginObject().is_opaque()) {
+    DOMException::Raise(DOMException::kSecurityErr,
+                        "Document origin is opaque, cookie setting failed",
+                        exception_state);
+    return;
+  }
   if (cookie_jar_) {
     cookie_jar_->SetCookie(url_as_gurl(), cookie);
   }
-#endif
 }
 
-std::string Document::cookie() const {
-#if defined(COBALT_BUILD_TYPE_GOLD)
-  return std::string();
-#else
+// https://html.spec.whatwg.org/#dom-document-cookie
+std::string Document::cookie(script::ExceptionState* exception_state) const {
+  if (IsCookieAverseDocument()) {
+    DLOG(WARNING) << "Document is a cookie-averse Document object, returning "
+                     "empty cookie.";
+    return "";
+  }
+  if (location_->OriginObject().is_opaque()) {
+    DOMException::Raise(DOMException::kSecurityErr,
+                        "Document origin is opaque, cookie getting failed",
+                        exception_state);
+    return "";
+  }
   if (cookie_jar_) {
     return cookie_jar_->GetCookies(url_as_gurl());
   } else {
     DLOG(WARNING) << "Document has no cookie jar";
     return "";
   }
-#endif
+}
+
+void Document::set_cookie(const std::string& cookie) {
+  if (IsCookieAverseDocument()) {
+    DLOG(WARNING) << "Document is a cookie-averse Document object, not "
+                     "setting cookie.";
+    return;
+  }
+  if (location_->OriginObject().is_opaque()) {
+    DLOG(WARNING) << "Document origin is opaque, cookie setting failed";
+    return;
+  }
+  if (cookie_jar_) {
+    cookie_jar_->SetCookie(url_as_gurl(), cookie);
+  }
+}
+
+std::string Document::cookie() const {
+  if (IsCookieAverseDocument()) {
+    DLOG(WARNING) << "Document is a cookie-averse Document object, returning "
+                     "empty cookie.";
+    return "";
+  }
+  if (location_->OriginObject().is_opaque()) {
+    DLOG(WARNING) << "Document origin is opaque, cookie getting failed";
+    return "";
+  }
+  if (cookie_jar_) {
+    return cookie_jar_->GetCookies(url_as_gurl());
+  } else {
+    DLOG(WARNING) << "Document has no cookie jar";
+    return "";
+  }
 }
 
 void Document::Accept(NodeVisitor* visitor) { visitor->Visit(this); }
@@ -607,13 +664,14 @@
 void AppendRulesFromCSSStyleSheetToSelectorTree(
     const scoped_refptr<cssom::CSSStyleSheet>& style_sheet,
     cssom::SelectorTree* selector_tree) {
-  AppendRulesFromCSSRuleListToSelectorTree(style_sheet->css_rules(),
+  AppendRulesFromCSSRuleListToSelectorTree(style_sheet->css_rules_same_origin(),
                                            selector_tree);
 }
 
 void ClearAddedToSelectorTreeFromCSSStyleSheetRules(
     const scoped_refptr<cssom::CSSStyleSheet>& style_sheet) {
-  RemoveRulesFromCSSRuleListFromSelectorTree(style_sheet->css_rules(), NULL);
+  RemoveRulesFromCSSRuleListFromSelectorTree(
+      style_sheet->css_rules_same_origin(), NULL);
 }
 
 }  // namespace
@@ -659,8 +717,8 @@
 }
 
 bool Document::UpdateComputedStyleOnElementAndAncestor(HTMLElement* element) {
-  TRACE_EVENT0(
-      "cobalt::dom", "Document::UpdateComputedStyleOnElementAndAncestor");
+  TRACE_EVENT0("cobalt::dom",
+               "Document::UpdateComputedStyleOnElementAndAncestor");
   if (!element || element->node_document() != this) {
     return false;
   }
diff --git a/src/cobalt/dom/document.h b/src/cobalt/dom/document.h
index 42c824f..52a5d30 100644
--- a/src/cobalt/dom/document.h
+++ b/src/cobalt/dom/document.h
@@ -218,6 +218,11 @@
   }
 
   // https://www.w3.org/TR/html5/dom.html#dom-document-cookie
+  void set_cookie(const std::string& cookie,
+                  script::ExceptionState* exception_state);
+  std::string cookie(script::ExceptionState* exception_state) const;
+
+  // For Cobalt code use only. Logs warnings instead of raising exceptions.
   void set_cookie(const std::string& cookie);
   std::string cookie() const;
 
@@ -265,7 +270,7 @@
   // Returns whether the document has browsing context. Having the browsing
   // context means the document is shown on the screen.
   //   https://www.w3.org/TR/html5/browsers.html#browsing-context
-  bool HasBrowsingContext() { return !!window_; }
+  bool HasBrowsingContext() const { return !!window_; }
 
   void set_window(Window* window) { window_ = window; }
   const scoped_refptr<Window> window();
@@ -431,6 +436,8 @@
   // Animations, using all the style sheets in the document.
   void UpdateKeyframes();
 
+  bool IsCookieAverseDocument() const;
+
   // Reference to HTML element context.
   HTMLElementContext* const html_element_context_;
   // Reference to the associated window object.
diff --git a/src/cobalt/dom/document.idl b/src/cobalt/dom/document.idl
index a2e81ee..0a832e4 100644
--- a/src/cobalt/dom/document.idl
+++ b/src/cobalt/dom/document.idl
@@ -34,7 +34,7 @@
   [NewObject] Comment createComment(DOMString data);
 
   [NewObject, RaisesException] Event createEvent(DOMString interfaceName);
-  attribute DOMString cookie;
+  [RaisesException] attribute DOMString cookie;
 };
 
 Document implements GlobalEventHandlers;
diff --git a/src/cobalt/dom/dom_settings.cc b/src/cobalt/dom/dom_settings.cc
index 35bee6d..fab84d0 100644
--- a/src/cobalt/dom/dom_settings.cc
+++ b/src/cobalt/dom/dom_settings.cc
@@ -63,7 +63,7 @@
   return window()->document()->url_as_gurl();
 }
 
-const dom::URLUtils::Origin& DOMSettings::document_origin() const {
+const loader::Origin& DOMSettings::document_origin() const {
   return window()->document()->location()->OriginObject();
 }
 
diff --git a/src/cobalt/dom/dom_settings.h b/src/cobalt/dom/dom_settings.h
index 77ebe51..6d9d65e 100644
--- a/src/cobalt/dom/dom_settings.h
+++ b/src/cobalt/dom/dom_settings.h
@@ -130,7 +130,7 @@
   virtual const GURL& base_url() const;
 
   // Return's document's origin.
-  const URLUtils::Origin& document_origin() const;
+  const loader::Origin& document_origin() const;
 
  private:
   const int max_dom_element_depth_;
diff --git a/src/cobalt/dom/error_event_test.cc b/src/cobalt/dom/error_event_test.cc
index 40a51d2..7995e45 100644
--- a/src/cobalt/dom/error_event_test.cc
+++ b/src/cobalt/dom/error_event_test.cc
@@ -110,7 +110,8 @@
 
   global_environment_->EnableEval();
   global_environment_->SetReportEvalCallback(base::Closure());
-  bool succeeded = global_environment_->EvaluateScript(source_code, result);
+  bool succeeded = global_environment_->EvaluateScript(source_code, result,
+                                                       false /*mute_errors*/);
   return succeeded;
 }
 }  // namespace
diff --git a/src/cobalt/dom/font_face_updater.cc b/src/cobalt/dom/font_face_updater.cc
index 453dea3..1f47d20 100644
--- a/src/cobalt/dom/font_face_updater.cc
+++ b/src/cobalt/dom/font_face_updater.cc
@@ -247,8 +247,8 @@
 
 void FontFaceUpdater::ProcessCSSStyleSheet(
     const scoped_refptr<cssom::CSSStyleSheet>& style_sheet) {
-  if (style_sheet && style_sheet->css_rules()) {
-    style_sheet->css_rules()->Accept(this);
+  if (style_sheet && style_sheet->css_rules_same_origin()) {
+    style_sheet->css_rules_same_origin()->Accept(this);
   }
 }
 
diff --git a/src/cobalt/dom/html_link_element.cc b/src/cobalt/dom/html_link_element.cc
index ab3dfb6..e18a057 100644
--- a/src/cobalt/dom/html_link_element.cc
+++ b/src/cobalt/dom/html_link_element.cc
@@ -127,6 +127,8 @@
       &CspDelegate::CanLoad, base::Unretained(document->csp_delegate()),
       GetCspResourceTypeForRel(rel()));
 
+  fetched_last_url_origin_ = loader::Origin();
+
   if (IsRelContentCriticalResource(rel())) {
     // The element must delay the load event of the element's document until all
     // the attempts to obtain the resource and its critical subresources are
@@ -144,10 +146,15 @@
       base::Bind(&HTMLLinkElement::OnLoadingError, base::Unretained(this))));
 }
 
-void HTMLLinkElement::OnLoadingDone(const std::string& content) {
+void HTMLLinkElement::OnLoadingDone(const std::string& content,
+                                    const loader::Origin& last_url_origin) {
   TRACK_MEMORY_SCOPE("DOM");
   DCHECK(thread_checker_.CalledOnValidThread());
   TRACE_EVENT0("cobalt::dom", "HTMLLinkElement::OnLoadingDone()");
+
+  // Get resource's final destination url from loader.
+  fetched_last_url_origin_ = last_url_origin;
+
   Document* document = node_document();
   if (rel() == "stylesheet") {
     OnStylesheetLoaded(document, content);
@@ -211,10 +218,17 @@
 
 void HTMLLinkElement::OnStylesheetLoaded(Document* document,
                                          const std::string& content) {
-  style_sheet_ =
+  scoped_refptr<cssom::CSSStyleSheet> css_style_sheet =
       document->html_element_context()->css_parser()->ParseStyleSheet(
           content, base::SourceLocation(href(), 1, 1));
-  style_sheet_->SetLocationUrl(absolute_url_);
+  css_style_sheet->SetLocationUrl(absolute_url_);
+  // If not loading from network-fetched resources or fetched resource is same
+  // origin as the document, set origin-clean flag to true.
+  if (!loader_ || document->url_as_gurl().SchemeIsFile() ||
+      (fetched_last_url_origin_ == document->location()->OriginObject())) {
+    css_style_sheet->SetOriginClean(true);
+  }
+  style_sheet_ = css_style_sheet;
   document->OnStyleSheetsModified();
 }
 
diff --git a/src/cobalt/dom/html_link_element.h b/src/cobalt/dom/html_link_element.h
index 1390480..f9f41c1 100644
--- a/src/cobalt/dom/html_link_element.h
+++ b/src/cobalt/dom/html_link_element.h
@@ -22,6 +22,7 @@
 #include "base/threading/thread_checker.h"
 #include "cobalt/cssom/style_sheet.h"
 #include "cobalt/dom/html_element.h"
+#include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/fetcher_factory.h"
 #include "cobalt/loader/loader.h"
 #include "cobalt/loader/text_decoder.h"
@@ -70,7 +71,8 @@
   // From the spec: HTMLLinkElement.
   void Obtain();
 
-  void OnLoadingDone(const std::string& content);
+  void OnLoadingDone(const std::string& content,
+                     const loader::Origin& last_url_origin);
   void OnLoadingError(const std::string& error);
   void OnSplashscreenLoaded(Document* document, const std::string& content);
   void OnStylesheetLoaded(Document* document, const std::string& content);
@@ -90,6 +92,8 @@
 
   // The style sheet associated with this element.
   scoped_refptr<cssom::StyleSheet> style_sheet_;
+
+  loader::Origin fetched_last_url_origin_;
 };
 
 }  // namespace dom
diff --git a/src/cobalt/dom/html_script_element.cc b/src/cobalt/dom/html_script_element.cc
index 652c504..3baa07f 100644
--- a/src/cobalt/dom/html_script_element.cc
+++ b/src/cobalt/dom/html_script_element.cc
@@ -239,6 +239,9 @@
                    CspDelegate::kScript);
   }
 
+  // Clear origin before start.
+  fetched_last_url_origin_ = loader::Origin();
+
   switch (load_option_) {
     case 2: {
       // If the element has a src attribute, and the element has been flagged as
@@ -337,6 +340,7 @@
           csp_delegate->AllowInline(CspDelegate::kScript,
                                     inline_script_location_,
                                     text)) {
+        fetched_last_url_origin_ = document_->location()->OriginObject();
         ExecuteInternal();
       } else {
         PreventGarbageCollectionAndPostToDispatchEvent(FROM_HERE,
@@ -347,10 +351,12 @@
   }
 }
 
-void HTMLScriptElement::OnSyncLoadingDone(const std::string& content) {
+void HTMLScriptElement::OnSyncLoadingDone(
+    const std::string& content, const loader::Origin& last_url_origin) {
   TRACE_EVENT0("cobalt::dom", "HTMLScriptElement::OnSyncLoadingDone()");
   content_ = content;
   is_sync_load_successful_ = true;
+  fetched_last_url_origin_ = last_url_origin;
 }
 
 void HTMLScriptElement::OnSyncLoadingError(const std::string& error) {
@@ -360,7 +366,8 @@
 
 // Algorithm for OnLoadingDone:
 //   https://www.w3.org/TR/html5/scripting-1.html#prepare-a-script
-void HTMLScriptElement::OnLoadingDone(const std::string& content) {
+void HTMLScriptElement::OnLoadingDone(const std::string& content,
+                                      const loader::Origin& last_url_origin) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(load_option_ == 4 || load_option_ == 5);
   TRACE_EVENT0("cobalt::dom", "HTMLScriptElement::OnLoadingDone()");
@@ -368,6 +375,7 @@
     AllowGarbageCollection();
     return;
   }
+  fetched_last_url_origin_ = last_url_origin;
 
   content_ = content;
   switch (load_option_) {
@@ -522,8 +530,10 @@
   // script was obtained, the script block's type as the scripting language, and
   // the script settings object of the script element's Document's Window
   // object.
-  html_element_context()->script_runner()->Execute(content, script_location,
-      NULL /* output: succeeded */);
+  bool mute_errors =
+      fetched_last_url_origin_ != document_->location()->OriginObject();
+  html_element_context()->script_runner()->Execute(
+      content, script_location, NULL /* output: succeeded */, mute_errors);
 
   // 5. 6. Not needed by Cobalt.
 
diff --git a/src/cobalt/dom/html_script_element.h b/src/cobalt/dom/html_script_element.h
index 8307158..b444426 100644
--- a/src/cobalt/dom/html_script_element.h
+++ b/src/cobalt/dom/html_script_element.h
@@ -22,6 +22,7 @@
 #include "base/threading/thread_checker.h"
 #include "cobalt/base/source_location.h"
 #include "cobalt/dom/html_element.h"
+#include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/loader.h"
 
 namespace cobalt {
@@ -89,10 +90,12 @@
   //
   void Prepare();
 
-  void OnSyncLoadingDone(const std::string& content);
+  void OnSyncLoadingDone(const std::string& content,
+                         const loader::Origin& last_url_origin);
   void OnSyncLoadingError(const std::string& error);
 
-  void OnLoadingDone(const std::string& content);
+  void OnLoadingDone(const std::string& content,
+                     const loader::Origin& last_url_origin);
   void OnLoadingError(const std::string& error);
 
   void ExecuteExternal() {
@@ -138,6 +141,11 @@
 
   // Whether or not the script should execute at all.
   bool should_execute_;
+
+  // Will be compared with document's origin to derive mute_errors flag
+  // javascript parser takes in to record if the error reqort should be muted
+  // due to cross-origin fetched script.
+  loader::Origin fetched_last_url_origin_;
 };
 
 }  // namespace dom
diff --git a/src/cobalt/dom/html_style_element.cc b/src/cobalt/dom/html_style_element.cc
index c55a3de..b64b6cd 100644
--- a/src/cobalt/dom/html_style_element.cc
+++ b/src/cobalt/dom/html_style_element.cc
@@ -82,10 +82,12 @@
   if (bypass_csp || text.empty() ||
       csp_delegate->AllowInline(CspDelegate::kStyle, inline_style_location_,
                                 text)) {
-    style_sheet_ =
+    scoped_refptr<cssom::CSSStyleSheet> css_style_sheet =
         document->html_element_context()->css_parser()->ParseStyleSheet(
             text, inline_style_location_);
-    style_sheet_->SetLocationUrl(GURL(inline_style_location_.file_path));
+    css_style_sheet->SetLocationUrl(GURL(inline_style_location_.file_path));
+    css_style_sheet->SetOriginClean(true);
+    style_sheet_ = css_style_sheet;
     document->OnStyleSheetsModified();
   } else {
     // Report a violation.
diff --git a/src/cobalt/dom/keyframes_map_updater.cc b/src/cobalt/dom/keyframes_map_updater.cc
index de597a4..dc1d636 100644
--- a/src/cobalt/dom/keyframes_map_updater.cc
+++ b/src/cobalt/dom/keyframes_map_updater.cc
@@ -38,8 +38,8 @@
     const scoped_refptr<cssom::CSSStyleSheet>& style_sheet) {
   // Iterate through each rule in the stylesheet and add any CSSKeyframesRule
   // objects to our keyframes map.
-  if (style_sheet && style_sheet->css_rules()) {
-    style_sheet->css_rules()->Accept(this);
+  if (style_sheet && style_sheet->css_rules_same_origin()) {
+    style_sheet->css_rules_same_origin()->Accept(this);
   }
 }
 
diff --git a/src/cobalt/dom/location.h b/src/cobalt/dom/location.h
index 64baf0b..7d93324 100644
--- a/src/cobalt/dom/location.h
+++ b/src/cobalt/dom/location.h
@@ -89,7 +89,7 @@
   const GURL& url() const { return url_utils_.url(); }
   void set_url(const GURL& url) { url_utils_.set_url(url); }
 
-  const URLUtils::Origin& OriginObject() const {
+  const loader::Origin& OriginObject() const {
     return url_utils_.OriginObject();
   }
 
diff --git a/src/cobalt/dom/rule_matching_test.cc b/src/cobalt/dom/rule_matching_test.cc
index 6a562fc..d4c7d8c 100644
--- a/src/cobalt/dom/rule_matching_test.cc
+++ b/src/cobalt/dom/rule_matching_test.cc
@@ -103,7 +103,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -116,7 +116,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -129,7 +129,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -142,7 +142,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -155,7 +155,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -179,7 +179,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -192,7 +192,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -205,7 +205,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -218,7 +218,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -252,7 +252,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -282,7 +282,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -311,7 +311,7 @@
   matching_rules =
       html_element->pseudo_element(kAfterPseudoElementType)->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 
   html_element = body_->last_element_child()->AsHTMLElement();
@@ -321,7 +321,7 @@
   matching_rules =
       html_element->pseudo_element(kAfterPseudoElementType)->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -339,7 +339,7 @@
   matching_rules =
       html_element->pseudo_element(kAfterPseudoElementType)->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -370,7 +370,7 @@
   matching_rules =
       html_element->pseudo_element(kBeforePseudoElementType)->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 
   html_element = body_->last_element_child()->AsHTMLElement();
@@ -380,7 +380,7 @@
   matching_rules =
       html_element->pseudo_element(kBeforePseudoElementType)->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -398,7 +398,7 @@
   matching_rules =
       html_element->pseudo_element(kBeforePseudoElementType)->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -435,7 +435,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -466,7 +466,7 @@
           ->AsHTMLElement()
           ->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -496,7 +496,7 @@
           ->AsHTMLElement()
           ->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -525,7 +525,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->last_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -549,7 +549,7 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->last_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -574,11 +574,11 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       body_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(3, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[1].first);
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[2].first);
 
   std::vector<cssom::Specificity> vs;
@@ -606,7 +606,7 @@
           ->AsHTMLElement()
           ->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -750,9 +750,9 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       head_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_NE(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_NE(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
-  EXPECT_EQ(GetDocumentStyleSheet(1)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(1)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 
   head_->RemoveChild(div2);
@@ -763,9 +763,9 @@
   matching_rules =
       head_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(1, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
-  EXPECT_NE(GetDocumentStyleSheet(1)->css_rules()->Item(0),
+  EXPECT_NE(GetDocumentStyleSheet(1)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
@@ -787,9 +787,9 @@
   cssom::RulesWithCascadePrecedence* matching_rules =
       head_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(2, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
-  EXPECT_NE(GetDocumentStyleSheet(1)->css_rules()->Item(0),
+  EXPECT_NE(GetDocumentStyleSheet(1)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 
   head_->RemoveChild(div2);
@@ -800,9 +800,9 @@
   matching_rules =
       head_->first_element_child()->AsHTMLElement()->matching_rules();
   ASSERT_EQ(2, matching_rules->size());
-  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules()->Item(0),
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
-  EXPECT_NE(GetDocumentStyleSheet(1)->css_rules()->Item(0),
+  EXPECT_NE(GetDocumentStyleSheet(1)->css_rules_same_origin()->Item(0),
             (*matching_rules)[0].first);
 }
 
diff --git a/src/cobalt/dom/testing/stub_css_parser.cc b/src/cobalt/dom/testing/stub_css_parser.cc
index 55bdbb5..9d4411c 100644
--- a/src/cobalt/dom/testing/stub_css_parser.cc
+++ b/src/cobalt/dom/testing/stub_css_parser.cc
@@ -22,7 +22,9 @@
     const std::string& input, const base::SourceLocation& input_location) {
   UNREFERENCED_PARAMETER(input);
   UNREFERENCED_PARAMETER(input_location);
-  return new cssom::CSSStyleSheet();
+  cssom::CSSStyleSheet* new_style_sheet = new cssom::CSSStyleSheet();
+  new_style_sheet->SetOriginClean(true);
+  return new_style_sheet;
 }
 
 scoped_refptr<cssom::CSSRule> StubCSSParser::ParseRule(
diff --git a/src/cobalt/dom/testing/stub_script_runner.cc b/src/cobalt/dom/testing/stub_script_runner.cc
index 148e67f..8ad635a 100644
--- a/src/cobalt/dom/testing/stub_script_runner.cc
+++ b/src/cobalt/dom/testing/stub_script_runner.cc
@@ -19,11 +19,11 @@
 namespace testing {
 
 std::string StubScriptRunner::Execute(
-    const std::string& script_utf8,
-    const base::SourceLocation& script_location,
-    bool* out_succeeded) {
+    const std::string& script_utf8, const base::SourceLocation& script_location,
+    bool* out_succeeded, bool mute_errors) {
   UNREFERENCED_PARAMETER(script_utf8);
   UNREFERENCED_PARAMETER(script_location);
+  UNREFERENCED_PARAMETER(mute_errors);
   if (out_succeeded) {
     *out_succeeded = true;
   }
diff --git a/src/cobalt/dom/testing/stub_script_runner.h b/src/cobalt/dom/testing/stub_script_runner.h
index 9c68840..fb42205 100644
--- a/src/cobalt/dom/testing/stub_script_runner.h
+++ b/src/cobalt/dom/testing/stub_script_runner.h
@@ -27,7 +27,7 @@
  public:
   std::string Execute(const std::string& script_utf8,
                       const base::SourceLocation& script_location,
-                      bool* out_succeeded) OVERRIDE;
+                      bool* out_succeeded, bool mute_errors) OVERRIDE;
 };
 
 }  // namespace testing
diff --git a/src/cobalt/dom/url_utils.cc b/src/cobalt/dom/url_utils.cc
index 57604bd..3cdea4e 100644
--- a/src/cobalt/dom/url_utils.cc
+++ b/src/cobalt/dom/url_utils.cc
@@ -14,83 +14,16 @@
 
 #include "cobalt/dom/url_utils.h"
 
-namespace {
-// Returns true if the url can have non-opaque origin.
-// Blob URLs needs to be pre-processed.
-bool NonBlobURLCanHaveTupleOrigin(const GURL& url) {
-  if (url.SchemeIs("https")) {
-    return true;
-  } else if (url.SchemeIs("http")) {
-    return true;
-  } else if (url.SchemeIs("ftp")) {
-    return true;
-  } else if (url.SchemeIs("ws")) {
-    return true;
-  } else if (url.SchemeIs("wss")) {
-    return true;
-  }
-  return false;
-}
-// Returns false if url should be opaque.
-// Otherwise, extract origin tuple from the url and assemble them as a string
-// for easier access and comparison.
-bool NonBlobURLGetOriginStr(const GURL& url, std::string* output) {
-  if (!NonBlobURLCanHaveTupleOrigin(url)) {
-    return false;
-  }
-  *output = url.scheme() + "://" + url.host() +
-            (url.has_port() ? ":" + url.port() : "");
-  return true;
-}
-}  // namespace
-
 namespace cobalt {
 namespace dom {
 
-URLUtils::Origin::Origin() : is_opaque_(true) {}
-
-URLUtils::Origin::Origin(const GURL& url) : is_opaque_(false) {
-  if (url.is_valid() && url.has_scheme() && url.has_host()) {
-    if (url.SchemeIs("blob")) {
-      // Let path_url be the result of parsing URL's path.
-      // Return a new opaque origin, if url is failure, and url's origin
-      // otherwise.
-      GURL path_url(url.path());
-      if (path_url.is_valid() && path_url.has_host() && path_url.has_scheme() &&
-          NonBlobURLGetOriginStr(path_url, &origin_str_)) {
-        return;
-      }
-    } else if (NonBlobURLGetOriginStr(url, &origin_str_)) {
-      // Assign a tuple origin if given url is allowed to have one.
-      return;
-    }
-  }
-  // Othwise, return a new opaque origin.
-  is_opaque_ = true;
-}
-
-std::string URLUtils::Origin::SerializedOrigin() const {
-  if (is_opaque_) {
-    return "null";
-  }
-  return origin_str_;
-}
-
-bool URLUtils::Origin::operator==(const Origin& rhs) const {
-  if (is_opaque_ || rhs.is_opaque_) {
-    return false;
-  } else {
-    return origin_str_ == rhs.origin_str_;
-  }
-}
-
 URLUtils::URLUtils(const GURL& url, bool is_opaque)
-    : url_(url), origin_(is_opaque ? Origin() : Origin(url)) {}
+    : url_(url), origin_(is_opaque ? loader::Origin() : loader::Origin(url)) {}
 URLUtils::URLUtils(const GURL& url, const UpdateStepsCallback& update_steps,
                    bool is_opaque)
     : url_(url),
       update_steps_(update_steps),
-      origin_(is_opaque ? Origin() : Origin(url)) {}
+      origin_(is_opaque ? loader::Origin() : loader::Origin(url)) {}
 
 std::string URLUtils::href() const { return url_.possibly_invalid_spec(); }
 
diff --git a/src/cobalt/dom/url_utils.h b/src/cobalt/dom/url_utils.h
index aa66825..9d163f9 100644
--- a/src/cobalt/dom/url_utils.h
+++ b/src/cobalt/dom/url_utils.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "base/callback.h"
+#include "cobalt/loader/origin.h"
 #include "googleurl/src/gurl.h"
 
 namespace cobalt {
@@ -35,34 +36,11 @@
 // callback. The callback should call set_url if necessary.
 class URLUtils {
  public:
-  // https://html.spec.whatwg.org/multipage/origin.html#concept-origin
-  class Origin {
-   public:
-    // To create an opaque origin, use Origin().
-    Origin();
-    // Initialize an origin to the url's origin.
-    // https://url.spec.whatwg.org/#concept-url-origin
-    explicit Origin(const GURL& url);
-    // https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin
-    std::string SerializedOrigin() const;
-    bool is_opaque() const { return is_opaque_; }
-    // Only document has an origin and no elements inherit document's origin, so
-    // opaque origin comparison can always return false.
-    // https://html.spec.whatwg.org/multipage/origin.html#same-origin
-    bool operator==(const Origin& rhs) const;
-    // Returns true if two origins are different(cross-origin).
-    bool operator!=(const Origin& rhs) const { return !(*this == rhs); }
-
-   private:
-    bool is_opaque_;
-    std::string origin_str_;
-  };
-
   typedef base::Callback<void(const std::string&)> UpdateStepsCallback;
 
   explicit URLUtils(const GURL& url, bool is_opaque = false);
   explicit URLUtils(const UpdateStepsCallback& update_steps)
-      : update_steps_(update_steps), origin_(Origin()) {}
+      : update_steps_(update_steps) {}
   URLUtils(const GURL& url, const UpdateStepsCallback& update_steps,
            bool is_opaque = false);
 
@@ -99,7 +77,7 @@
   const GURL& url() const { return url_; }
   void set_url(const GURL& url) { url_ = url; }
 
-  const Origin& OriginObject() const { return origin_; }
+  const loader::Origin& OriginObject() const { return origin_; }
 
  private:
   // From the spec: URLUtils.
@@ -107,7 +85,7 @@
 
   GURL url_;
   UpdateStepsCallback update_steps_;
-  Origin origin_;
+  loader::Origin origin_;
 };
 
 }  // namespace dom
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index 17149cf..e5a0eda 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -158,6 +158,7 @@
       ALLOW_THIS_IN_INITIALIZER_LIST(
           session_storage_(new Storage(this, Storage::kSessionStorage, NULL))),
       screen_(new Screen(width, height)),
+      preflight_cache_(new loader::CORSPreflightCache()),
       ran_animation_frame_callbacks_callback_(
           ran_animation_frame_callbacks_callback),
       window_close_callback_(window_close_callback),
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h
index 8da163c..b1fa459 100644
--- a/src/cobalt/dom/window.h
+++ b/src/cobalt/dom/window.h
@@ -40,6 +40,7 @@
 #include "cobalt/dom/url_registry.h"
 #include "cobalt/dom/window_timers.h"
 #include "cobalt/input/camera_3d.h"
+#include "cobalt/loader/cors_preflight_cache.h"
 #include "cobalt/loader/decoder.h"
 #include "cobalt/loader/fetcher_factory.h"
 #include "cobalt/loader/font/remote_typeface_cache.h"
@@ -340,6 +341,10 @@
   // Cache the passed in splash screen content for the window.location URL.
   void CacheSplashScreen(const std::string& content);
 
+  const scoped_refptr<loader::CORSPreflightCache> get_preflight_cache() {
+    return preflight_cache_;
+  }
+
   DEFINE_WRAPPABLE_TYPE(Window);
 
  private:
@@ -395,6 +400,9 @@
 
   scoped_refptr<Screen> screen_;
 
+  // Global preflight cache.
+  scoped_refptr<loader::CORSPreflightCache> preflight_cache_;
+
   const base::Closure ran_animation_frame_callbacks_callback_;
   const CloseCallback window_close_callback_;
   const base::Closure window_minimize_callback_;
diff --git a/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt b/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
index f07c751..ad81d43 100644
--- a/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
+++ b/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
@@ -128,13 +128,13 @@
 send-after-setting-document-domain.htm,FAIL
 send-authentication-basic-cors.htm,PASS
 # Synchronous
-send-authentication-basic-cors-not-enabled.htm,FAIL
+send-authentication-basic-cors-not-enabled.htm,DISABLE
 send-authentication-basic.htm,FAIL
 send-authentication-basic-repeat-no-args.htm,FAIL
 send-authentication-basic-setrequestheader-existing-session.htm,FAIL
 send-authentication-basic-setrequestheader.htm,FAIL
 send-authentication-competing-names-passwords.htm,FAIL
-send-authentication-cors-basic-setrequestheader.htm,FAIL
+send-authentication-cors-basic-setrequestheader.htm,DISABLE
 # js_error: send-authentication-existing-session-manual.htm,FAIL
 # Synchronous
 send-authentication-prompt-2-manual.htm,FAIL
@@ -170,7 +170,7 @@
 send-redirect-infinite.htm,PASS
 send-redirect-infinite-sync.htm,FAIL
 send-redirect-no-location.htm,PASS
-send-redirect-to-cors.htm,FAIL
+send-redirect-to-cors.htm,DISABLE
 send-redirect-to-non-cors.htm,PASS
 send-response-event-order.htm,FAIL
 send-response-upload-event-loadend.htm,PASS
@@ -183,7 +183,7 @@
 send-sync-no-response-event-order.htm,FAIL
 send-sync-response-event-order.htm,FAIL
 send-sync-timeout.htm,FAIL
-send-timeout-events.htm,PASS
+send-timeout-events.htm,DISABLE
 # Infinite loop?
 send-usp.html,DISABLE
 setrequestheader-after-send.htm,PASS
diff --git a/src/cobalt/layout_tests/web_platform_test_parser.cc b/src/cobalt/layout_tests/web_platform_test_parser.cc
index 04f894e..83dc8bb 100644
--- a/src/cobalt/layout_tests/web_platform_test_parser.cc
+++ b/src/cobalt/layout_tests/web_platform_test_parser.cc
@@ -108,9 +108,9 @@
 
     std::string result;
     bool success = global_environment->EvaluateScript(
-        script::SourceCode::CreateSourceCode(precondition,
-            base::SourceLocation(__FILE__, __LINE__, 1)),
-        &result);
+        script::SourceCode::CreateSourceCode(
+            precondition, base::SourceLocation(__FILE__, __LINE__, 1)),
+        &result, false /*mute_errors*/);
 
     if (!success) {
       DLOG(ERROR) << "Failed to evaluate precondition: "
diff --git a/src/cobalt/layout_tests/web_platform_tests.cc b/src/cobalt/layout_tests/web_platform_tests.cc
index ddbb94d..2b0a60a 100644
--- a/src/cobalt/layout_tests/web_platform_tests.cc
+++ b/src/cobalt/layout_tests/web_platform_tests.cc
@@ -335,6 +335,11 @@
     streams, WebPlatformTest,
     ::testing::ValuesIn(EnumerateWebPlatformTests("streams",
         "'ReadableStream' in this")));
+
+INSTANTIATE_TEST_CASE_P(
+    cobalt_special, WebPlatformTest,
+    ::testing::ValuesIn(EnumerateWebPlatformTests("cobalt_special")));
+
 #endif  // !defined(COBALT_WIN)
 
 }  // namespace layout_tests
diff --git a/src/cobalt/loader/cors_preflight.cc b/src/cobalt/loader/cors_preflight.cc
index 81065e6..fe20e54 100644
--- a/src/cobalt/loader/cors_preflight.cc
+++ b/src/cobalt/loader/cors_preflight.cc
@@ -39,6 +39,7 @@
 const char* kAccessControlAllowMethod = "Access-Control-Allow-Methods";
 const char* kAccessControlAllowHeaders = "Access-Control-Allow-Headers";
 const char* kAccessControlAllowCredentials = "Access-Control-Allow-Credentials";
+const char* kAccessControlMaxAge = "Access-Control-Max-Age";
 // https://fetch.spec.whatwg.org/#http-access-control-expose-headers
 const char* kAccessControlExposeHeaders = "Access-Control-Expose-Headers";
 
@@ -96,6 +97,10 @@
     return "";
   }
 }
+// This constant is an imposed limit on the time an entry can be alive in
+// the preflight cache if the provided max-age value is even greater.
+// The number is the same as the limit in WebKit.
+const int kPreflightCacheMaxAgeLimit = 600;
 
 // This helper function checks if 'input_str' is in 'array' up to 'size'.
 bool IsInArray(const char* input_str, const char* array[], size_t size) {
@@ -130,7 +135,8 @@
 CORSPreflight::CORSPreflight(GURL url, net::URLFetcher::RequestType method,
                              const network::NetworkModule* network_module,
                              base::Closure success_callback, std::string origin,
-                             base::Closure error_callback)
+                             base::Closure error_callback,
+                             scoped_refptr<CORSPreflightCache> preflight_cache)
     : credentials_mode_is_include_(false),
       force_preflight_(false),
       url_(url),
@@ -138,8 +144,10 @@
       network_module_(network_module),
       origin_(origin),
       error_callback_(error_callback),
-      success_callback_(success_callback) {
+      success_callback_(success_callback),
+      preflight_cache_(preflight_cache) {
   DCHECK(!url_.is_empty());
+  DCHECK(preflight_cache);
 }
 
 // https://fetch.spec.whatwg.org/#cors-safelisted-request-header
@@ -180,7 +188,7 @@
 // https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name
 bool CORSPreflight::IsSafeResponseHeader(
     const std::string& name,
-    std::vector<std::string>& CORS_exposed_header_name_list,
+    const std::vector<std::string>& CORS_exposed_header_name_list,
     bool credentials_mode_is_include) {
   // Every check in this function is case-insensitive comparison.
   // Header is safe if it's CORS-safelisted repsonse-header name.
@@ -229,20 +237,23 @@
   }
   // Preflight is not needed if the request method is CORS-safelisted request
   // method and all headers are CORS-safelisted request-header.
+  std::vector<std::string> unsafe_headers;
   if (method_ == net::URLFetcher::GET || method_ == net::URLFetcher::HEAD ||
       method_ == net::URLFetcher::POST) {
     net::HttpRequestHeaders::Iterator it(headers_);
     while (it.GetNext()) {
-      if (IsSafeRequestHeader(it.name(), it.value())) {
-        continue;
-      } else {
-        return true;
+      if (!IsSafeRequestHeader(it.name(), it.value())) {
+        unsafe_headers.push_back(it.name());
       }
     }
-  } else {
-    return true;
+    if (unsafe_headers.empty()) {
+      return false;
+    }
   }
-  return false;
+  // Check preflight cache for match.
+  return !preflight_cache_->HaveEntry(url_.spec(), origin_,
+                                      credentials_mode_is_include_, method_,
+                                      unsafe_headers);
 }
 
 bool CORSPreflight::Send() {
@@ -365,11 +376,22 @@
         return;
       }
     }
+    // step 10-18 for adding entry to preflight cache.
+    std::string max_age_str;
+    int max_age = 0;
+    if (response_headers->GetNormalizedHeader(kAccessControlMaxAge,
+                                              &max_age_str)) {
+      max_age = std::min(SbStringAToI(max_age_str.c_str()),
+                         kPreflightCacheMaxAgeLimit);
+    }
+    preflight_cache_->AppendEntry(source->GetURL().spec(), origin_, max_age,
+                                  credentials_mode_is_include_, methods_vec,
+                                  headernames_vec);
   } else {
     DLOG(ERROR) << "CORS preflight did not get response headers";
     error_callback_.Run();
   }
-  // step 10-18 are omitted as we haven't implemented preflight cache.
+
   success_callback_.Run();
 }
 
diff --git a/src/cobalt/loader/cors_preflight.h b/src/cobalt/loader/cors_preflight.h
index 7899575..f0012af 100644
--- a/src/cobalt/loader/cors_preflight.h
+++ b/src/cobalt/loader/cors_preflight.h
@@ -17,7 +17,6 @@
 #ifndef COBALT_LOADER_CORS_PREFLIGHT_H_
 #define COBALT_LOADER_CORS_PREFLIGHT_H_
 
-#include <map>
 #include <string>
 #include <vector>
 
@@ -27,6 +26,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/message_loop_proxy.h"
 #include "base/threading/thread_checker.h"
+#include "cobalt/loader/cors_preflight_cache.h"
 #include "cobalt/network/network_module.h"
 #include "googleurl/src/gurl.h"
 #include "net/http/http_request_headers.h"
@@ -45,7 +45,8 @@
   CORSPreflight(GURL url, net::URLFetcher::RequestType method,
                 const network::NetworkModule* network_module,
                 base::Closure success_callback, std::string origin,
-                base::Closure error_callback);
+                base::Closure error_callback,
+                scoped_refptr<CORSPreflightCache> preflight_cache);
   void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
   void set_force_preflight(bool forcepreflight) {
     force_preflight_ = forcepreflight;
@@ -74,7 +75,7 @@
   // Call GetHeadersVector before to put server-allowed headers in vector.
   static bool IsSafeResponseHeader(
       const std::string& name,
-      std::vector<std::string>& CORS_exposed_header_name_list,
+      const std::vector<std::string>& CORS_exposed_header_name_list,
       bool credentials_mode_is_include);
   // This function populates input vector with headers extracted from
   // Access-Control-Expose-Headers header.
@@ -96,6 +97,7 @@
   std::string origin_;
   base::Closure error_callback_;
   base::Closure success_callback_;
+  scoped_refptr<CORSPreflightCache> preflight_cache_;
 };
 
 }  // namespace loader
diff --git a/src/cobalt/loader/cors_preflight_cache.cc b/src/cobalt/loader/cors_preflight_cache.cc
new file mode 100644
index 0000000..860ba27
--- /dev/null
+++ b/src/cobalt/loader/cors_preflight_cache.cc
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+
+#include <algorithm>
+
+#include "base/message_loop.h"
+#include "base/string_util.h"
+#include "cobalt/loader/cors_preflight_cache.h"
+
+namespace {
+bool MethodNameToRequestType(const std::string& method,
+                             net::URLFetcher::RequestType* request_type) {
+  if (LowerCaseEqualsASCII(method, "get")) {
+    *request_type = net::URLFetcher::GET;
+  } else if (LowerCaseEqualsASCII(method, "post")) {
+    *request_type = net::URLFetcher::POST;
+  } else if (LowerCaseEqualsASCII(method, "head")) {
+    *request_type = net::URLFetcher::HEAD;
+  } else if (LowerCaseEqualsASCII(method, "delete")) {
+    *request_type = net::URLFetcher::DELETE_REQUEST;
+  } else if (LowerCaseEqualsASCII(method, "put")) {
+    *request_type = net::URLFetcher::PUT;
+  } else {
+    return false;
+  }
+  return true;
+}
+const char* kAuthorization = "authorization";
+}  // namespace
+
+namespace cobalt {
+namespace loader {
+
+void CORSPreflightCache::AppendEntry(
+    const std::string& url_str, const std::string& origin, int max_age,
+    bool has_credentials, const std::vector<std::string>& methods_vec,
+    const std::vector<std::string>& headernames_vec) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (max_age <= 0) {
+    return;
+  }
+  base::TimeDelta valid_duration = base::TimeDelta::FromSeconds(max_age);
+  scoped_refptr<CORSPreflightCacheEntry> new_entry =
+      new CORSPreflightCacheEntry();
+  new_entry->credentials = has_credentials;
+  new_entry->expiration_time = base::Time::Now() + valid_duration;
+
+  if (methods_vec.size() == 1 && methods_vec.at(0) == "*") {
+    new_entry->allow_all_methods = true;
+  } else {
+    for (auto method : methods_vec) {
+      net::URLFetcher::RequestType request_type;
+      if (MethodNameToRequestType(method, &request_type)) {
+        new_entry->methods.insert(request_type);
+      }
+    }
+  }
+
+  if (headernames_vec.size() == 1 && headernames_vec.at(0) == "*") {
+    new_entry->allow_all_headers_except_non_wildcard = true;
+  }
+  // TODO: Consider change this function to use std::copy with std::inserter.
+  // Currently compilers on some machines do not support it.
+  for (auto headername : headernames_vec) {
+    new_entry->headernames.insert(headername);
+  }
+
+  auto insert_result =
+      content_[url_str].insert(std::make_pair(origin, new_entry));
+  if (!insert_result.second) {
+    insert_result.first->second = new_entry;
+  }
+
+  expiration_time_heap_.push(
+      ExpirationHeapEntry{new_entry->expiration_time, url_str, origin});
+}
+
+// https://fetch.spec.whatwg.org/#concept-cache-match
+bool CORSPreflightCache::HaveEntry(
+    const std::string& url_str, const std::string& origin,
+    bool credentials_mode_is_include,
+    const net::URLFetcher::RequestType& new_request_method,
+    const std::vector<std::string>& unsafe_headernames) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (url_str.empty() || origin.empty()) {
+    return false;
+  }
+  ClearObsoleteEntries();
+  // There is a cache match for request if origin is request's origin,
+  // url is request's current url, either credentials is true or request's
+  // credentials_mode is not "include"
+  auto url_iter = content_.find(url_str);
+  if (url_iter == content_.end()) {
+    return false;
+  }
+  auto origin_iter = url_iter->second.find(origin);
+  if (origin_iter == url_iter->second.end()) {
+    return false;
+  }
+  auto entry_ptr = origin_iter->second;
+  if (!entry_ptr->credentials && credentials_mode_is_include) {
+    return false;
+  }
+  // Either last preflight's Access-Control-Allow-Methods header has * or
+  // new request's method, otherwise return false.
+  if (!entry_ptr->allow_all_methods &&
+      entry_ptr->methods.find(new_request_method) == entry_ptr->methods.end()) {
+    return false;
+  }
+  // Header name is safe if it's not CORS non-wildcard request-header
+  // name("Authentication") and last preflight allowed * headers.
+  if (entry_ptr->allow_all_headers_except_non_wildcard) {
+    bool has_auth_header = false;
+    for (auto header : unsafe_headernames) {
+      if (SbStringCompareNoCase(header.c_str(), kAuthorization)) {
+        has_auth_header = true;
+        break;
+      }
+    }
+    // wildcard header is allowed if entry's allowed headers include it.
+    return !has_auth_header ||
+           (entry_ptr->headernames.find(std::string(kAuthorization)) !=
+            entry_ptr->headernames.end());
+  }
+  // If last preflight does not allow arbitrary header, then match each header
+  // with allowed headers.
+  for (auto unsafe_headername : unsafe_headernames) {
+    if (entry_ptr->headernames.find(unsafe_headername) ==
+        entry_ptr->headernames.end()) {
+      return false;
+    }
+  }
+  return true;
+}
+
+void CORSPreflightCache::ClearObsoleteEntries() {
+  while (expiration_time_heap_.size() > 0 &&
+         expiration_time_heap_.top().expiration_time < base::Time::Now()) {
+    DCHECK(content_.find(expiration_time_heap_.top().url_str) !=
+           content_.end());
+    auto url_iter = content_.find(expiration_time_heap_.top().url_str);
+    DCHECK(url_iter->second.find(expiration_time_heap_.top().origin) !=
+           url_iter->second.end());
+    auto entry_iter = url_iter->second.find(expiration_time_heap_.top().origin);
+    // The entry could have been updated and should only delete obselete ones.
+    if (entry_iter->second->expiration_time < base::Time::Now()) {
+      url_iter->second.erase(entry_iter);
+    }
+    expiration_time_heap_.pop();
+  }
+}
+
+}  // namespace loader
+}  // namespace cobalt
diff --git a/src/cobalt/loader/cors_preflight_cache.h b/src/cobalt/loader/cors_preflight_cache.h
new file mode 100644
index 0000000..d14a393
--- /dev/null
+++ b/src/cobalt/loader/cors_preflight_cache.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+
+#ifndef COBALT_LOADER_CORS_PREFLIGHT_CACHE_H_
+#define COBALT_LOADER_CORS_PREFLIGHT_CACHE_H_
+
+#include <queue>
+#include <set>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include "base/hash_tables.h"
+#include "base/time.h"
+#include "googleurl/src/gurl.h"
+#include "net/http/http_request_headers.h"
+#include "net/url_request/url_fetcher.h"
+#include "starboard/string.h"
+
+namespace cobalt {
+namespace loader {
+
+// https://fetch.spec.whatwg.org/#concept-cache
+class CORSPreflightCache : public base::RefCounted<CORSPreflightCache> {
+ public:
+  // An entry is appended at the end of every preflight to avoid same
+  // preflight request in the near future.
+  void AppendEntry(const std::string& url_str, const std::string& origin,
+                   int max_age, bool has_credentials,
+                   const std::vector<std::string>& methods_vec,
+                   const std::vector<std::string>& headernames_vec);
+  // Check if there is a preflight cache match. This method does not include
+  // checking for CORS-safelisted method and request-header.
+  bool HaveEntry(const std::string& url_str, const std::string& origin,
+                 bool credentials_mode_is_include,
+                 const net::URLFetcher::RequestType& new_request_method,
+                 const std::vector<std::string>& unsafe_headernames);
+
+ private:
+  // Case-insensitive comparator.
+  struct CaseInsensitiveCompare {
+    bool operator()(const std::string& lhs, const std::string& rhs) const {
+      return SbStringCompareNoCase(lhs.c_str(), rhs.c_str()) != 0;
+    }
+  };
+
+  // The spec wants a cache entry for every method and for every header which is
+  // a little unnesessarily expensive. We create an entry for each request and
+  // If there is an old entry in the new entry's pleace we simply push the old
+  // one out which potentially increases cache misses slightly but reduces
+  // memory cost. Chromium also takes this approach.
+  // The map's first key is entry's request url and second is entry's origin.
+  struct CORSPreflightCacheEntry
+      : public base::RefCounted<CORSPreflightCacheEntry> {
+    bool credentials;
+    // True if response has "Access-Control-Allow-Methods: *".
+    bool allow_all_methods;
+    // True if response has "Access-Control-Allow-Headers: *".
+    // Non-wildcard request-header name is "Authentication".
+    bool allow_all_headers_except_non_wildcard;
+    base::Time expiration_time;
+    std::set<net::URLFetcher::RequestType> methods;
+    std::set<std::string, CaseInsensitiveCompare> headernames;
+
+    CORSPreflightCacheEntry()
+        : credentials(false),
+          allow_all_methods(false),
+          allow_all_headers_except_non_wildcard(false) {}
+  };
+
+  struct ExpirationHeapEntry {
+    base::Time expiration_time;
+    std::string url_str;
+    std::string origin;
+    bool operator>(const ExpirationHeapEntry& rhs) const {
+      return expiration_time > rhs.expiration_time;
+    }
+    bool operator<(const ExpirationHeapEntry& rhs) const {
+      return expiration_time < rhs.expiration_time;
+    }
+  };
+
+  // This operator constructs a min-heap.
+  class ExpirationMinHeapComparator {
+   public:
+    bool operator()(const ExpirationHeapEntry& lhs,
+                    const ExpirationHeapEntry& rhs) {
+      return lhs > rhs;
+    }
+  };
+
+  void ClearObsoleteEntries();
+
+  // TODO: Replace scoped_refptr with scoped_ptr when possible or replace the
+  // map as a 'scoped_map'.
+  base::hash_map<
+      std::string,
+      base::hash_map<std::string, scoped_refptr<CORSPreflightCacheEntry> > >
+      content_;
+
+  std::priority_queue<ExpirationHeapEntry, std::vector<ExpirationHeapEntry>,
+                      ExpirationMinHeapComparator>
+      expiration_time_heap_;
+  base::ThreadChecker thread_checker_;
+};
+
+}  // namespace loader
+}  // namespace cobalt
+#endif  // COBALT_LOADER_CORS_PREFLIGHT_CACHE_H_
diff --git a/src/cobalt/loader/decoder.h b/src/cobalt/loader/decoder.h
index 43d3217..1f51912 100644
--- a/src/cobalt/loader/decoder.h
+++ b/src/cobalt/loader/decoder.h
@@ -18,8 +18,10 @@
 #include <string>
 
 #include "base/memory/scoped_ptr.h"
+#include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/loader_types.h"
 #include "cobalt/render_tree/resource_provider.h"
+#include "googleurl/src/gurl.h"
 #include "net/http/http_response_headers.h"
 
 namespace cobalt {
@@ -64,6 +66,10 @@
 
   // Resumes the decode of this resource, starting over from the zero state.
   virtual void Resume(render_tree::ResourceProvider* resource_provider) = 0;
+
+  // Provides textdecoder with last url to prevent security leak if resource is
+  // cross-origin.
+  virtual void SetLastURLOrigin(const loader::Origin&) {}
 };
 
 }  // namespace loader
diff --git a/src/cobalt/loader/fetcher.h b/src/cobalt/loader/fetcher.h
index 3e00461..6ce28cf 100644
--- a/src/cobalt/loader/fetcher.h
+++ b/src/cobalt/loader/fetcher.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "base/callback.h"
+#include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/loader_types.h"
 #include "googleurl/src/gurl.h"
 #include "net/http/http_response_headers.h"
@@ -63,12 +64,17 @@
   // Concrete Fetcher subclass should start fetching immediately in constructor.
   explicit Fetcher(Handler* handler) : handler_(handler) {}
 
+  const loader::Origin& last_url_origin() { return last_url_origin_; }
+
   // Concrete Fetcher subclass should cancel fetching in destructor.
   virtual ~Fetcher() = 0;
 
  protected:
   Handler* handler() const { return handler_; }
 
+  // used by html elements to check if resource is cross-origin.
+  loader::Origin last_url_origin_;
+
  private:
   Handler* handler_;
 };
diff --git a/src/cobalt/loader/loader.cc b/src/cobalt/loader/loader.cc
index d5e453d..58c1ca9 100644
--- a/src/cobalt/loader/loader.cc
+++ b/src/cobalt/loader/loader.cc
@@ -13,6 +13,8 @@
 // limitations under the License.
 
 #include "cobalt/loader/loader.h"
+#include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/loader/text_decoder.h"
 
 #include "base/bind.h"
 #include "base/compiler_specific.h"
@@ -56,6 +58,8 @@
   }
   void OnDone(Fetcher* fetcher) OVERRIDE {
     UNREFERENCED_PARAMETER(fetcher);
+    DCHECK(fetcher);
+    decoder_->SetLastURLOrigin(fetcher->last_url_origin());
     decoder_->Finish();
   }
   void OnError(Fetcher* fetcher, const std::string& error) OVERRIDE {
diff --git a/src/cobalt/loader/loader.gyp b/src/cobalt/loader/loader.gyp
index 1ab0435..a4a6542 100644
--- a/src/cobalt/loader/loader.gyp
+++ b/src/cobalt/loader/loader.gyp
@@ -27,6 +27,8 @@
         'cache_fetcher.h',
         'cors_preflight.cc',
         'cors_preflight.h',
+        'cors_preflight_cache.cc',
+        'cors_preflight_cache.h',
         'decoder.h',
         'embedded_fetcher.cc',
         'embedded_fetcher.h',
@@ -80,6 +82,8 @@
         'mesh/projection_codec/projection_decoder.h',
         'net_fetcher.cc',
         'net_fetcher.h',
+        'origin.cc',
+        'origin.h',
         'resource_cache.h',
         'sync_loader.cc',
         'sync_loader.h',
diff --git a/src/cobalt/loader/loader_test.cc b/src/cobalt/loader/loader_test.cc
index 1e7872a..0c8d736 100644
--- a/src/cobalt/loader/loader_test.cc
+++ b/src/cobalt/loader/loader_test.cc
@@ -19,6 +19,7 @@
 #include "base/message_loop.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
+#include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/file_fetcher.h"
 #include "cobalt/loader/text_decoder.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -40,7 +41,7 @@
  public:
   explicit TextDecoderCallback(base::RunLoop* run_loop) : run_loop_(run_loop) {}
 
-  void OnDone(const std::string& text) {
+  void OnDone(const std::string& text, const loader::Origin&) {
     text_ = text;
     MessageLoop::current()->PostTask(FROM_HERE, run_loop_->QuitClosure());
   }
diff --git a/src/cobalt/loader/net_fetcher.cc b/src/cobalt/loader/net_fetcher.cc
index 08fd0a3..5c904ed 100644
--- a/src/cobalt/loader/net_fetcher.cc
+++ b/src/cobalt/loader/net_fetcher.cc
@@ -124,6 +124,7 @@
       return HandleError(msg).InvalidateThis();
     }
   }
+  last_url_origin_ = Origin(source->GetURL());
 }
 
 void NetFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
diff --git a/src/cobalt/loader/origin.cc b/src/cobalt/loader/origin.cc
new file mode 100644
index 0000000..b1aca32
--- /dev/null
+++ b/src/cobalt/loader/origin.cc
@@ -0,0 +1,88 @@
+// Copyright 2016 Google Inc. All Rights Reserved.
+//
+// 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.
+
+#include "cobalt/loader/origin.h"
+
+namespace {
+// Returns true if the url can have non-opaque origin.
+// Blob URLs needs to be pre-processed.
+bool NonBlobURLCanHaveTupleOrigin(const GURL& url) {
+  if (url.SchemeIs("https")) {
+    return true;
+  } else if (url.SchemeIs("http")) {
+    return true;
+  } else if (url.SchemeIs("ftp")) {
+    return true;
+  } else if (url.SchemeIs("ws")) {
+    return true;
+  } else if (url.SchemeIs("wss")) {
+    return true;
+  }
+  return false;
+}
+// Returns false if url should be opaque.
+// Otherwise, extract origin tuple from the url and assemble them as a string
+// for easier access and comparison.
+bool NonBlobURLGetOriginStr(const GURL& url, std::string* output) {
+  if (!NonBlobURLCanHaveTupleOrigin(url)) {
+    return false;
+  }
+  *output = url.scheme() + "://" + url.host() +
+            (url.has_port() ? ":" + url.port() : "");
+  return true;
+}
+}  // namespace
+
+namespace cobalt {
+namespace loader {
+
+Origin::Origin() : is_opaque_(true) {}
+
+Origin::Origin(const GURL& url) : is_opaque_(false) {
+  if (url.is_valid() && url.has_scheme() && url.has_host()) {
+    if (url.SchemeIs("blob")) {
+      // Let path_url be the result of parsing URL's path.
+      // Return a new opaque origin, if url is failure, and url's origin
+      // otherwise.
+      GURL path_url(url.path());
+      if (path_url.is_valid() && path_url.has_host() && path_url.has_scheme() &&
+          NonBlobURLGetOriginStr(path_url, &origin_str_)) {
+        return;
+      }
+    } else if (NonBlobURLGetOriginStr(url, &origin_str_)) {
+      // Assign a tuple origin if given url is allowed to have one.
+      return;
+    }
+  }
+  // Othwise, return a new opaque origin.
+  is_opaque_ = true;
+}
+
+std::string Origin::SerializedOrigin() const {
+  if (is_opaque_) {
+    return "null";
+  }
+  return origin_str_;
+}
+
+bool Origin::operator==(const Origin& rhs) const {
+  if (is_opaque_ || rhs.is_opaque_) {
+    return false;
+  } else {
+    return origin_str_ == rhs.origin_str_;
+  }
+}
+
+}  // namespace loader
+}  // namespace cobalt
diff --git a/src/cobalt/loader/origin.h b/src/cobalt/loader/origin.h
new file mode 100644
index 0000000..9c11e94
--- /dev/null
+++ b/src/cobalt/loader/origin.h
@@ -0,0 +1,49 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// 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.
+
+#ifndef COBALT_LOADER_ORIGIN_H_
+#define COBALT_LOADER_ORIGIN_H_
+
+#include <string>
+
+#include "googleurl/src/gurl.h"
+
+namespace cobalt {
+namespace loader {
+// https://html.spec.whatwg.org/multipage/origin.html#concept-origin
+class Origin {
+ public:
+  // To create an opaque origin, use Origin().
+  Origin();
+  // Initialize an origin to the url's origin.
+  // https://url.spec.whatwg.org/#concept-url-origin
+  explicit Origin(const GURL& url);
+  // https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin
+  std::string SerializedOrigin() const;
+  bool is_opaque() const { return is_opaque_; }
+  // Only document has an origin and no elements inherit document's origin, so
+  // opaque origin comparison can always return false.
+  // https://html.spec.whatwg.org/multipage/origin.html#same-origin
+  bool operator==(const Origin& rhs) const;
+  // Returns true if two origins are different(cross-origin).
+  bool operator!=(const Origin& rhs) const { return !(*this == rhs); }
+
+ private:
+  bool is_opaque_;
+  std::string origin_str_;
+};
+}  // namespace loader
+}  // namespace cobalt
+
+#endif  // COBALT_LOADER_ORIGIN_H_
diff --git a/src/cobalt/loader/text_decoder.h b/src/cobalt/loader/text_decoder.h
index 11b78d4..702a2bf 100644
--- a/src/cobalt/loader/text_decoder.h
+++ b/src/cobalt/loader/text_decoder.h
@@ -23,6 +23,7 @@
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/threading/thread_checker.h"
+#include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/decoder.h"
 
 namespace cobalt {
@@ -32,13 +33,16 @@
 // results.
 class TextDecoder : public Decoder {
  public:
-  explicit TextDecoder(base::Callback<void(const std::string&)> done_callback)
+  explicit TextDecoder(
+      base::Callback<void(const std::string&, const loader::Origin&)>
+          done_callback)
       : done_callback_(done_callback), suspended_(false) {}
   ~TextDecoder() OVERRIDE {}
 
   // This function is used for binding callback for creating TextDecoder.
   static scoped_ptr<Decoder> Create(
-      base::Callback<void(const std::string&)> done_callback) {
+      base::Callback<void(const std::string&, const loader::Origin&)>
+          done_callback) {
     return scoped_ptr<Decoder>(new TextDecoder(done_callback));
   }
 
@@ -70,7 +74,7 @@
     if (suspended_) {
       return;
     }
-    done_callback_.Run(text_);
+    done_callback_.Run(text_, last_url_origin_);
   }
   bool Suspend() OVERRIDE {
     suspended_ = true;
@@ -80,12 +84,17 @@
   void Resume(render_tree::ResourceProvider* /*resource_provider*/) OVERRIDE {
     suspended_ = false;
   }
+  void SetLastURLOrigin(const loader::Origin& last_url_origin) OVERRIDE {
+    last_url_origin_ = last_url_origin;
+  }
 
  private:
   base::ThreadChecker thread_checker_;
   std::string text_;
-  base::Callback<void(const std::string&)> done_callback_;
+  base::Callback<void(const std::string&, const loader::Origin&)>
+      done_callback_;
   bool suspended_;
+  loader::Origin last_url_origin_;
 };
 
 }  // namespace loader
diff --git a/src/cobalt/loader/text_decoder_test.cc b/src/cobalt/loader/text_decoder_test.cc
index 7c62696..90e8824 100644
--- a/src/cobalt/loader/text_decoder_test.cc
+++ b/src/cobalt/loader/text_decoder_test.cc
@@ -23,8 +23,13 @@
 namespace {
 
 struct TextDecoderCallback {
-  void Callback(const std::string& value) { text = value; }
+  void Callback(const std::string& value,
+                const loader::Origin& last_url_origin) {
+    text = value;
+    last_url_origin_ = last_url_origin;
+  }
   std::string text;
+  loader::Origin last_url_origin_;
 };
 
 }  // namespace
diff --git a/src/cobalt/media/filters/audio_clock.cc b/src/cobalt/media/filters/audio_clock.cc
deleted file mode 100644
index 50503cd..0000000
--- a/src/cobalt/media/filters/audio_clock.cc
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_clock.h"
-
-#include <algorithm>
-#include <cmath>
-
-#include "base/logging.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-AudioClock::AudioClock(base::TimeDelta start_timestamp, int sample_rate)
-    : start_timestamp_(start_timestamp),
-      microseconds_per_frame_(
-          static_cast<double>(base::Time::kMicrosecondsPerSecond) /
-          sample_rate),
-      total_buffered_frames_(0),
-      front_timestamp_micros_(start_timestamp.InMicroseconds()),
-      back_timestamp_micros_(start_timestamp.InMicroseconds()) {}
-
-AudioClock::~AudioClock() {}
-
-void AudioClock::WroteAudio(int frames_written, int frames_requested,
-                            int delay_frames, double playback_rate) {
-  DCHECK_GE(frames_written, 0);
-  DCHECK_LE(frames_written, frames_requested);
-  DCHECK_GE(delay_frames, 0);
-  DCHECK_GE(playback_rate, 0);
-
-  // First write: initialize buffer with silence.
-  if (start_timestamp_.InMicroseconds() == front_timestamp_micros_ &&
-      buffered_.empty()) {
-    PushBufferedAudioData(delay_frames, 0.0);
-  }
-
-  // Move frames from |buffered_| into the computed timestamp based on
-  // |delay_frames|.
-  //
-  // The ordering of compute -> push -> pop eliminates unnecessary memory
-  // reallocations in cases where |buffered_| gets emptied.
-  int64_t frames_played =
-      std::max(INT64_C(0), total_buffered_frames_ - delay_frames);
-  PushBufferedAudioData(frames_written, playback_rate);
-  PushBufferedAudioData(frames_requested - frames_written, 0.0);
-  PopBufferedAudioData(frames_played);
-
-  // Update our front and back timestamps.  The back timestamp is considered the
-  // authoritative source of truth, so base the front timestamp on range of data
-  // buffered.  Doing so avoids accumulation errors on the front timestamp.
-  back_timestamp_micros_ +=
-      frames_written * playback_rate * microseconds_per_frame_;
-
-  // Don't let front timestamp move earlier in time, as could occur due to delay
-  // frames pushed in the first write, above.
-  front_timestamp_micros_ =
-      std::max(front_timestamp_micros_,
-               back_timestamp_micros_ - ComputeBufferedMediaDurationMicros());
-  DCHECK_GE(front_timestamp_micros_, start_timestamp_.InMicroseconds());
-  DCHECK_LE(front_timestamp_micros_, back_timestamp_micros_);
-}
-
-void AudioClock::CompensateForSuspendedWrites(base::TimeDelta elapsed,
-                                              int delay_frames) {
-  const int64_t frames_elapsed =
-      elapsed.InMicroseconds() / microseconds_per_frame_ + 0.5;
-
-  // No need to do anything if we're within the limits of our played out audio
-  // or there are no delay frames, the next WroteAudio() call will expire
-  // everything correctly.
-  if (frames_elapsed < total_buffered_frames_ || !delay_frames) return;
-
-  // Otherwise, flush everything and prime with the delay frames.
-  WroteAudio(0, 0, 0, 0);
-  DCHECK(buffered_.empty());
-  PushBufferedAudioData(delay_frames, 0.0);
-}
-
-base::TimeDelta AudioClock::TimeUntilPlayback(base::TimeDelta timestamp) const {
-  // Use front/back_timestamp() methods rather than internal members. The public
-  // methods round to the nearest microsecond for conversion to TimeDelta and
-  // the rounded value will likely be used by the caller.
-  DCHECK_GE(timestamp, front_timestamp());
-  DCHECK_LE(timestamp, back_timestamp());
-
-  int64_t frames_until_timestamp = 0;
-  double timestamp_us = timestamp.InMicroseconds();
-  double media_time_us = front_timestamp().InMicroseconds();
-
-  for (size_t i = 0; i < buffered_.size(); ++i) {
-    // Leading silence is always accounted prior to anything else.
-    if (buffered_[i].playback_rate == 0) {
-      frames_until_timestamp += buffered_[i].frames;
-      continue;
-    }
-
-    // Calculate upper bound on media time for current block of buffered frames.
-    double delta_us = buffered_[i].frames * buffered_[i].playback_rate *
-                      microseconds_per_frame_;
-    double max_media_time_us = media_time_us + delta_us;
-
-    // Determine amount of media time to convert to frames for current block. If
-    // target timestamp falls within current block, scale the amount of frames
-    // based on remaining amount of media time.
-    if (timestamp_us <= max_media_time_us) {
-      frames_until_timestamp +=
-          buffered_[i].frames * (timestamp_us - media_time_us) / delta_us;
-      break;
-    }
-
-    media_time_us = max_media_time_us;
-    frames_until_timestamp += buffered_[i].frames;
-  }
-
-  return base::TimeDelta::FromMicroseconds(
-      std::round(frames_until_timestamp * microseconds_per_frame_));
-}
-
-void AudioClock::ContiguousAudioDataBufferedForTesting(
-    base::TimeDelta* total, base::TimeDelta* same_rate_total) const {
-  double scaled_frames = 0;
-  double scaled_frames_at_same_rate = 0;
-  bool found_silence = false;
-  for (size_t i = 0; i < buffered_.size(); ++i) {
-    if (buffered_[i].playback_rate == 0) {
-      found_silence = true;
-      continue;
-    }
-
-    // Any buffered silence breaks our contiguous stretch of audio data.
-    if (found_silence) break;
-
-    scaled_frames += (buffered_[i].frames * buffered_[i].playback_rate);
-
-    if (i == 0) scaled_frames_at_same_rate = scaled_frames;
-  }
-
-  *total = base::TimeDelta::FromMicroseconds(scaled_frames *
-                                             microseconds_per_frame_);
-  *same_rate_total = base::TimeDelta::FromMicroseconds(
-      scaled_frames_at_same_rate * microseconds_per_frame_);
-}
-
-AudioClock::AudioData::AudioData(int64_t frames, double playback_rate)
-    : frames(frames), playback_rate(playback_rate) {}
-
-void AudioClock::PushBufferedAudioData(int64_t frames, double playback_rate) {
-  if (frames == 0) return;
-
-  total_buffered_frames_ += frames;
-
-  // Avoid creating extra elements where possible.
-  if (!buffered_.empty() && buffered_.back().playback_rate == playback_rate) {
-    buffered_.back().frames += frames;
-    return;
-  }
-
-  buffered_.push_back(AudioData(frames, playback_rate));
-}
-
-void AudioClock::PopBufferedAudioData(int64_t frames) {
-  DCHECK_LE(frames, total_buffered_frames_);
-
-  total_buffered_frames_ -= frames;
-
-  while (frames > 0) {
-    int64_t frames_to_pop = std::min(buffered_.front().frames, frames);
-    buffered_.front().frames -= frames_to_pop;
-    if (buffered_.front().frames == 0) buffered_.pop_front();
-
-    frames -= frames_to_pop;
-  }
-}
-
-double AudioClock::ComputeBufferedMediaDurationMicros() const {
-  double scaled_frames = 0;
-  for (const auto& buffer : buffered_)
-    scaled_frames += buffer.frames * buffer.playback_rate;
-  return scaled_frames * microseconds_per_frame_;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_clock.h b/src/cobalt/media/filters/audio_clock.h
deleted file mode 100644
index 23a832d..0000000
--- a/src/cobalt/media/filters/audio_clock.h
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_AUDIO_CLOCK_H_
-#define COBALT_MEDIA_FILTERS_AUDIO_CLOCK_H_
-
-#include <cmath>
-#include <deque>
-
-#include "base/basictypes.h"
-#include "base/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Models a queue of buffered audio in a playback pipeline for use with
-// estimating the amount of delay in wall clock time. Takes changes in playback
-// rate into account to handle scenarios where multiple rates may be present in
-// a playback pipeline with large delay.
-//
-//
-// USAGE
-//
-// Prior to starting audio playback, construct an AudioClock with an initial
-// media timestamp and a sample rate matching the sample rate the audio device
-// was opened at.
-//
-// Each time the audio rendering callback is executed, call WroteAudio() once
-// (and only once!) containing information on what was written:
-//   1) How many frames of audio data requested
-//   2) How many frames of audio data provided
-//   3) The playback rate of the audio data provided
-//   4) The current amount of delay
-//
-// After a call to WroteAudio(), clients can inspect the resulting media
-// timestamp. This can be used for UI purposes, synchronizing video, etc...
-//
-//
-// DETAILS
-//
-// Silence (whether caused by the initial audio delay or failing to write the
-// amount of requested frames due to underflow) is also modeled and will cause
-// the media timestamp to stop increasing until all known silence has been
-// played. AudioClock's model is initialized with silence during the first call
-// to WroteAudio() using the delay value.
-//
-// Playback rates are tracked for translating frame durations into media
-// durations. Since silence doesn't affect media timestamps, it also isn't
-// affected by playback rates.
-class MEDIA_EXPORT AudioClock {
- public:
-  AudioClock(base::TimeDelta start_timestamp, int sample_rate);
-  ~AudioClock();
-
-  // |frames_written| amount of audio data scaled to |playback_rate| written.
-  // |frames_requested| amount of audio data requested by hardware.
-  // |delay_frames| is the current amount of hardware delay.
-  void WroteAudio(int frames_written, int frames_requested, int delay_frames,
-                  double playback_rate);
-
-  // If WroteAudio() calls are suspended (i.e. due to playback being paused) the
-  // AudioClock will not properly advance time (even though all data up until
-  // back_timestamp() will playout on the physical device).
-  //
-  // To compensate for this, when calls resume, before the next WroteAudio(),
-  // callers should call CompensateForSuspendedWrites() to advance the clock for
-  // audio which continued playing out while WroteAudio() calls were suspended.
-  //
-  // |delay_frames| must be provided to properly prime the clock to compensate
-  // for a new initial delay.
-  void CompensateForSuspendedWrites(base::TimeDelta elapsed, int delay_frames);
-
-  // Returns the bounds of media data currently buffered by the audio hardware,
-  // taking silence and changes in playback rate into account. Buffered audio
-  // structure and timestamps are updated with every call to WroteAudio().
-  //
-  //  start_timestamp = 1000 ms                           sample_rate = 40 Hz
-  // +-----------------------+-----------------------+-----------------------+
-  // |   10 frames silence   |   20 frames @ 1.0x    |   20 frames @ 0.5x    |
-  // |      = 250 ms (wall)  |      = 500 ms (wall)  |      = 500 ms (wall)  |
-  // |      =   0 ms (media) |      = 500 ms (media) |      = 250 ms (media) |
-  // +-----------------------+-----------------------+-----------------------+
-  // ^                                                                       ^
-  // front_timestamp() is equal to               back_timestamp() is equal to
-  // |start_timestamp| since no                  amount of media frames tracked
-  // media data has been played yet.             by AudioClock, which would be
-  //                                             1000 + 500 + 250 = 1750 ms.
-  base::TimeDelta front_timestamp() const {
-    return base::TimeDelta::FromMicroseconds(
-        std::round(front_timestamp_micros_));
-  }
-  base::TimeDelta back_timestamp() const {
-    return base::TimeDelta::FromMicroseconds(
-        std::round(back_timestamp_micros_));
-  }
-
-  // Returns the amount of wall time until |timestamp| will be played by the
-  // audio hardware.
-  //
-  // |timestamp| must be within front_timestamp() and back_timestamp().
-  base::TimeDelta TimeUntilPlayback(base::TimeDelta timestamp) const;
-
-  void ContiguousAudioDataBufferedForTesting(
-      base::TimeDelta* total, base::TimeDelta* same_rate_total) const;
-
- private:
-  // Even with a ridiculously high sample rate of 256kHz, using 64 bits will
-  // permit tracking up to 416999965 days worth of time (that's 1141 millenia).
-  //
-  // 32 bits on the other hand would top out at measly 2 hours and 20 minutes.
-  struct AudioData {
-    AudioData(int64_t frames, double playback_rate);
-
-    int64_t frames;
-    double playback_rate;
-  };
-
-  // Helpers for operating on |buffered_|.
-  void PushBufferedAudioData(int64_t frames, double playback_rate);
-  void PopBufferedAudioData(int64_t frames);
-  double ComputeBufferedMediaDurationMicros() const;
-
-  const base::TimeDelta start_timestamp_;
-  const double microseconds_per_frame_;
-
-  std::deque<AudioData> buffered_;
-  int64_t total_buffered_frames_;
-
-  // Use double rather than TimeDelta to avoid loss of partial microseconds when
-  // converting between frames-written/delayed and time-passed (see conversion
-  // in WroteAudio()). Particularly for |back_timestamp|, which accumulates more
-  // time with each call to WroteAudio(), the loss of precision can accumulate
-  // to create noticeable audio/video sync drift for longer (2-3 hr) videos.
-  // See http://crbug.com/564604.
-  double front_timestamp_micros_;
-  double back_timestamp_micros_;
-
-  DISALLOW_COPY_AND_ASSIGN(AudioClock);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_AUDIO_CLOCK_H_
diff --git a/src/cobalt/media/filters/audio_clock_unittest.cc b/src/cobalt/media/filters/audio_clock_unittest.cc
deleted file mode 100644
index e6713b4..0000000
--- a/src/cobalt/media/filters/audio_clock_unittest.cc
+++ /dev/null
@@ -1,381 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_clock.h"
-
-#include <limits>
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioClockTest : public testing::Test {
- public:
-  AudioClockTest() { SetupClock(base::TimeDelta(), 10); }
-
-  ~AudioClockTest() override {}
-
-  void WroteAudio(int frames_written, int frames_requested, int delay_frames,
-                  double playback_rate) {
-    clock_->WroteAudio(frames_written, frames_requested, delay_frames,
-                       playback_rate);
-  }
-
-  void SetupClock(base::TimeDelta start_time, int sample_rate) {
-    sample_rate_ = sample_rate;
-    clock_.reset(new AudioClock(start_time, sample_rate_));
-  }
-
-  int FrontTimestampInDays() { return clock_->front_timestamp().InDays(); }
-
-  int FrontTimestampInMilliseconds() {
-    return clock_->front_timestamp().InMilliseconds();
-  }
-
-  int BackTimestampInMilliseconds() {
-    return clock_->back_timestamp().InMilliseconds();
-  }
-
-  int TimeUntilPlaybackInMilliseconds(int timestamp_ms) {
-    return clock_->TimeUntilPlayback(
-                     base::TimeDelta::FromMilliseconds(timestamp_ms))
-        .InMilliseconds();
-  }
-
-  int ContiguousAudioDataBufferedInDays() {
-    base::TimeDelta total, same_rate_total;
-    clock_->ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
-    return total.InDays();
-  }
-
-  int ContiguousAudioDataBufferedInMilliseconds() {
-    base::TimeDelta total, same_rate_total;
-    clock_->ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
-    return total.InMilliseconds();
-  }
-
-  int ContiguousAudioDataBufferedAtSameRateInMilliseconds() {
-    base::TimeDelta total, same_rate_total;
-    clock_->ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
-    return same_rate_total.InMilliseconds();
-  }
-
-  int sample_rate_;
-  std::unique_ptr<AudioClock> clock_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AudioClockTest);
-};
-
-TEST_F(AudioClockTest, FrontTimestampStartsAtStartTimestamp) {
-  base::TimeDelta expected = base::TimeDelta::FromSeconds(123);
-  AudioClock clock(expected, sample_rate_);
-
-  EXPECT_EQ(expected, clock.front_timestamp());
-}
-
-TEST_F(AudioClockTest, BackTimestampStartsAtStartTimestamp) {
-  base::TimeDelta expected = base::TimeDelta::FromSeconds(123);
-  AudioClock clock(expected, sample_rate_);
-
-  EXPECT_EQ(expected, clock.back_timestamp());
-}
-
-TEST_F(AudioClockTest, Playback) {
-  // The first time we write data we should still expect our start timestamp
-  // due to delay.
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(1000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  // The media time should remain at start timestamp as we write data.
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(2000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(3000, BackTimestampInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  // The media time should now start advanced now that delay has been covered.
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(1000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(4000, BackTimestampInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(2000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(5000, BackTimestampInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  // Introduce a rate change to slow down time:
-  //   - Current time will advance by one second until it hits rate change
-  //   - Contiguous audio data will start shrinking immediately
-  WroteAudio(10, 10, 20, 0.5);
-  EXPECT_EQ(3000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(5500, BackTimestampInMilliseconds());
-  EXPECT_EQ(2500, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(2000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 0.5);
-  EXPECT_EQ(4000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(6000, BackTimestampInMilliseconds());
-  EXPECT_EQ(2000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 0.5);
-  EXPECT_EQ(5000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(6500, BackTimestampInMilliseconds());
-  EXPECT_EQ(1500, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(1500, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 0.5);
-  EXPECT_EQ(5500, FrontTimestampInMilliseconds());
-  EXPECT_EQ(7000, BackTimestampInMilliseconds());
-  EXPECT_EQ(1500, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(1500, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  // Introduce a rate change to speed up time:
-  //   - Current time will advance by half a second until it hits rate change
-  //   - Contiguous audio data will start growing immediately
-  WroteAudio(10, 10, 20, 2);
-  EXPECT_EQ(6000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(9000, BackTimestampInMilliseconds());
-  EXPECT_EQ(3000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 2);
-  EXPECT_EQ(6500, FrontTimestampInMilliseconds());
-  EXPECT_EQ(11000, BackTimestampInMilliseconds());
-  EXPECT_EQ(4500, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(500, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 2);
-  EXPECT_EQ(7000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(13000, BackTimestampInMilliseconds());
-  EXPECT_EQ(6000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(6000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(10, 10, 20, 2);
-  EXPECT_EQ(9000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(15000, BackTimestampInMilliseconds());
-  EXPECT_EQ(6000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(6000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  // Write silence to simulate reaching end of stream:
-  //   - Current time will advance by half a second until it hits silence
-  //   - Contiguous audio data will start shrinking towards zero
-  WroteAudio(0, 10, 20, 2);
-  EXPECT_EQ(11000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(15000, BackTimestampInMilliseconds());
-  EXPECT_EQ(4000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(4000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(0, 10, 20, 2);
-  EXPECT_EQ(13000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(15000, BackTimestampInMilliseconds());
-  EXPECT_EQ(2000, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(2000, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  WroteAudio(0, 10, 20, 2);
-  EXPECT_EQ(15000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(15000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-
-  // At this point media time should stop increasing.
-  WroteAudio(0, 10, 20, 2);
-  EXPECT_EQ(15000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(15000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedAtSameRateInMilliseconds());
-}
-
-TEST_F(AudioClockTest, AlternatingAudioAndSilence) {
-  // Buffer #1: [0, 1000)
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(1000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Buffer #2: 1000ms of silence
-  WroteAudio(0, 10, 20, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(1000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Buffer #3: [1000, 2000):
-  //   - Buffer #1 is at front with 1000ms of contiguous audio data
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(2000, BackTimestampInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Buffer #4: 1000ms of silence
-  //   - Buffer #1 has been played out
-  //   - Buffer #2 of silence leaves us with 0ms of contiguous audio data
-  WroteAudio(0, 10, 20, 1.0);
-  EXPECT_EQ(1000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(2000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Buffer #5: [2000, 3000):
-  //   - Buffer #3 is at front with 1000ms of contiguous audio data
-  WroteAudio(10, 10, 20, 1.0);
-  EXPECT_EQ(1000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(3000, BackTimestampInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds());
-}
-
-TEST_F(AudioClockTest, ZeroDelay) {
-  // The first time we write data we should expect the first timestamp
-  // immediately.
-  WroteAudio(10, 10, 0, 1.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(1000, BackTimestampInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Ditto for all subsequent buffers.
-  WroteAudio(10, 10, 0, 1.0);
-  EXPECT_EQ(1000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(2000, BackTimestampInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds());
-
-  WroteAudio(10, 10, 0, 1.0);
-  EXPECT_EQ(2000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(3000, BackTimestampInMilliseconds());
-  EXPECT_EQ(1000, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Ditto for silence.
-  WroteAudio(0, 10, 0, 1.0);
-  EXPECT_EQ(3000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(3000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-
-  WroteAudio(0, 10, 0, 1.0);
-  EXPECT_EQ(3000, FrontTimestampInMilliseconds());
-  EXPECT_EQ(3000, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-}
-
-TEST_F(AudioClockTest, TimeUntilPlayback) {
-  // Construct an audio clock with the following representation:
-  //
-  //    existing
-  // |-  delay   -|------------------ calls to WroteAudio() ------------------|
-  // +------------+---------+------------+-----------+------------+-----------+
-  // | 20 silence | 10 @ 1x | 10 silence | 10 @ 0.5x | 10 silence | 10 @ 2.0x |
-  // +------------+---------+------------+-----------+------------+-----------+
-  // Media:       0       1000         1000        1500         1500        3500
-  // Wall:      2000      3000         4000        5000         6000        7000
-  WroteAudio(10, 10, 60, 1.0);
-  WroteAudio(0, 10, 60, 1.0);
-  WroteAudio(10, 10, 60, 0.5);
-  WroteAudio(0, 10, 60, 0.5);
-  WroteAudio(10, 10, 60, 2.0);
-  EXPECT_EQ(0, FrontTimestampInMilliseconds());
-  EXPECT_EQ(3500, BackTimestampInMilliseconds());
-  EXPECT_EQ(0, ContiguousAudioDataBufferedInMilliseconds());
-
-  // Media timestamp zero has to wait for silence to pass.
-  EXPECT_EQ(2000, TimeUntilPlaybackInMilliseconds(0));
-
-  // From then on out it's simply adding up the number of frames and taking
-  // silence into account.
-  EXPECT_EQ(2500, TimeUntilPlaybackInMilliseconds(500));
-  EXPECT_EQ(3000, TimeUntilPlaybackInMilliseconds(1000));
-  EXPECT_EQ(4500, TimeUntilPlaybackInMilliseconds(1250));
-  EXPECT_EQ(5000, TimeUntilPlaybackInMilliseconds(1500));
-  EXPECT_EQ(6500, TimeUntilPlaybackInMilliseconds(2500));
-  EXPECT_EQ(7000, TimeUntilPlaybackInMilliseconds(3500));
-}
-
-TEST_F(AudioClockTest, SupportsYearsWorthOfAudioData) {
-  // Use number of frames that would be likely to overflow 32-bit integer math.
-  const int huge_amount_of_frames = std::numeric_limits<int>::max();
-  const base::TimeDelta huge =
-      base::TimeDelta::FromSeconds(huge_amount_of_frames / sample_rate_);
-  EXPECT_EQ(2485, huge.InDays());  // Just to give some context on how big...
-
-  // Use zero delay to test calculation of current timestamp.
-  WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0);
-  EXPECT_EQ(0, FrontTimestampInDays());
-  EXPECT_EQ(2485, ContiguousAudioDataBufferedInDays());
-
-  WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0);
-  EXPECT_EQ(huge.InDays(), FrontTimestampInDays());
-  EXPECT_EQ(huge.InDays(), ContiguousAudioDataBufferedInDays());
-
-  WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0);
-  EXPECT_EQ((huge * 2).InDays(), FrontTimestampInDays());
-  EXPECT_EQ(huge.InDays(), ContiguousAudioDataBufferedInDays());
-
-  WroteAudio(huge_amount_of_frames, huge_amount_of_frames, 0, 1.0);
-  EXPECT_EQ((huge * 3).InDays(), FrontTimestampInDays());
-  EXPECT_EQ(huge.InDays(), ContiguousAudioDataBufferedInDays());
-
-  // Use huge delay to test calculation of buffered data.
-  WroteAudio(huge_amount_of_frames, huge_amount_of_frames,
-             huge_amount_of_frames, 1.0);
-  EXPECT_EQ((huge * 3).InDays(), FrontTimestampInDays());
-  EXPECT_EQ((huge * 2).InDays(), ContiguousAudioDataBufferedInDays());
-}
-
-TEST_F(AudioClockTest, CompensateForSuspendedWrites) {
-  // Buffer 6 seconds of delay and 1 second of audio data.
-  WroteAudio(10, 10, 60, 1.0);
-
-  // Media timestamp zero has to wait for silence to pass.
-  const int kBaseTimeMs = 6000;
-  EXPECT_EQ(kBaseTimeMs, TimeUntilPlaybackInMilliseconds(0));
-
-  // Elapsing frames less than we have buffered should do nothing.
-  const int kDelayFrames = 2;
-  for (int i = 1000; i <= kBaseTimeMs; i += 1000) {
-    clock_->CompensateForSuspendedWrites(base::TimeDelta::FromMilliseconds(i),
-                                         kDelayFrames);
-    EXPECT_EQ(kBaseTimeMs - (i - 1000), TimeUntilPlaybackInMilliseconds(0));
-
-    // Write silence to simulate maintaining a 7s output buffer.
-    WroteAudio(0, 10, 60, 1.0);
-  }
-
-  // Exhausting all frames should advance timestamps and prime the buffer with
-  // our delay frames value.
-  clock_->CompensateForSuspendedWrites(base::TimeDelta::FromMilliseconds(7000),
-                                       kDelayFrames);
-  EXPECT_EQ(kDelayFrames * 100, TimeUntilPlaybackInMilliseconds(1000));
-}
-
-TEST_F(AudioClockTest, FramesToTimePrecision) {
-  SetupClock(base::TimeDelta(), 48000);
-  double micros_per_frame = base::Time::kMicrosecondsPerSecond / 48000.0;
-  int frames_written = 0;
-
-  // Write ~2 hours of data to clock to give any error a significant chance to
-  // accumulate.
-  while (clock_->back_timestamp() <= base::TimeDelta::FromHours(2)) {
-    frames_written += 1024;
-    WroteAudio(1024, 1024, 0, 1);
-  }
-
-  // Verify no error accumulated.
-  EXPECT_EQ(std::round(frames_written * micros_per_frame),
-            clock_->back_timestamp().InMicroseconds());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_decoder_selector_unittest.cc b/src/cobalt/media/filters/audio_decoder_selector_unittest.cc
deleted file mode 100644
index 6e07827..0000000
--- a/src/cobalt/media/filters/audio_decoder_selector_unittest.cc
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/filters/decoder_selector.h"
-#include "cobalt/media/filters/decrypting_demuxer_stream.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::InvokeWithoutArgs;
-using ::testing::IsNull;
-using ::testing::NiceMock;
-using ::testing::NotNull;
-using ::testing::Return;
-using ::testing::StrictMock;
-
-// Use anonymous namespace here to prevent the actions to be defined multiple
-// times across multiple test files. Sadly we can't use static for them.
-namespace {
-
-MATCHER(EncryptedConfig, "") { return arg.is_encrypted(); }
-MATCHER(ClearConfig, "") { return !arg.is_encrypted(); }
-
-}  // namespace
-
-namespace cobalt {
-namespace media {
-
-class AudioDecoderSelectorTest : public ::testing::Test {
- public:
-  enum DecryptorCapability {
-    kNoCdm,        // No CDM. Only possible for clear stream.
-    kNoDecryptor,  // CDM is available but Decryptor is not supported.
-    kDecryptOnly,
-    kDecryptAndDecode
-  };
-
-  AudioDecoderSelectorTest()
-      : media_log_(new MediaLog()),
-        traits_(media_log_),
-        demuxer_stream_(
-            new StrictMock<MockDemuxerStream>(DemuxerStream::AUDIO)),
-        decoder_1_(new StrictMock<MockAudioDecoder>()),
-        decoder_2_(new StrictMock<MockAudioDecoder>()) {
-    all_decoders_.push_back(decoder_1_);
-    all_decoders_.push_back(decoder_2_);
-    // |cdm_context_| and |decryptor_| are conditionally created in
-    // InitializeDecoderSelector().
-  }
-
-  ~AudioDecoderSelectorTest() { base::RunLoop().RunUntilIdle(); }
-
-  MOCK_METHOD2(OnDecoderSelected,
-               void(AudioDecoder*, DecryptingDemuxerStream*));
-
-  void MockOnDecoderSelected(std::unique_ptr<AudioDecoder> decoder,
-                             std::unique_ptr<DecryptingDemuxerStream> stream) {
-    OnDecoderSelected(decoder.get(), stream.get());
-    selected_decoder_ = std::move(decoder);
-  }
-
-  void UseClearStream() {
-    AudioDecoderConfig clear_audio_config(kCodecVorbis, kSampleFormatPlanarF32,
-                                          CHANNEL_LAYOUT_STEREO, 44100,
-                                          EmptyExtraData(), Unencrypted());
-    demuxer_stream_->set_audio_decoder_config(clear_audio_config);
-  }
-
-  void UseEncryptedStream() {
-    AudioDecoderConfig encrypted_audio_config(
-        kCodecVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, 44100,
-        EmptyExtraData(), AesCtrEncryptionScheme());
-    demuxer_stream_->set_audio_decoder_config(encrypted_audio_config);
-  }
-
-  void InitializeDecoderSelector(DecryptorCapability decryptor_capability,
-                                 int num_decoders) {
-    if (decryptor_capability != kNoCdm) {
-      cdm_context_.reset(new StrictMock<MockCdmContext>());
-
-      if (decryptor_capability == kNoDecryptor) {
-        EXPECT_CALL(*cdm_context_, GetDecryptor()).WillRepeatedly(Return(NULL));
-      } else {
-        decryptor_.reset(new NiceMock<MockDecryptor>());
-        EXPECT_CALL(*cdm_context_, GetDecryptor())
-            .WillRepeatedly(Return(decryptor_.get()));
-        EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-            .WillRepeatedly(
-                RunCallback<1>(decryptor_capability == kDecryptAndDecode));
-      }
-    }
-
-    DCHECK_GE(all_decoders_.size(), static_cast<size_t>(num_decoders));
-    all_decoders_.erase(all_decoders_.begin() + num_decoders,
-                        all_decoders_.end());
-
-    decoder_selector_.reset(new AudioDecoderSelector(
-        message_loop_.task_runner(), std::move(all_decoders_), media_log_));
-  }
-
-  void SelectDecoder() {
-    decoder_selector_->SelectDecoder(
-        &traits_, demuxer_stream_.get(), cdm_context_.get(),
-        base::Bind(&AudioDecoderSelectorTest::MockOnDecoderSelected,
-                   base::Unretained(this)),
-        base::Bind(&AudioDecoderSelectorTest::OnDecoderOutput),
-        base::Bind(&AudioDecoderSelectorTest::OnWaitingForDecryptionKey));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void SelectDecoderAndDestroy() {
-    SelectDecoder();
-
-    EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-    decoder_selector_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  static void OnDecoderOutput(const scoped_refptr<AudioBuffer>& output) {
-    NOTREACHED();
-  }
-
-  static void OnWaitingForDecryptionKey() { NOTREACHED(); }
-
-  scoped_refptr<MediaLog> media_log_;
-
-  // Stream traits specific to audio decoding.
-  DecoderStreamTraits<DemuxerStream::AUDIO> traits_;
-
-  // Declare |decoder_selector_| after |demuxer_stream_| and |decryptor_| since
-  // |demuxer_stream_| and |decryptor_| should outlive |decoder_selector_|.
-  std::unique_ptr<StrictMock<MockDemuxerStream>> demuxer_stream_;
-
-  std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
-
-  // Use NiceMock since we don't care about most of calls on the decryptor, e.g.
-  // RegisterNewKeyCB().
-  std::unique_ptr<NiceMock<MockDecryptor>> decryptor_;
-
-  std::unique_ptr<AudioDecoderSelector> decoder_selector_;
-
-  StrictMock<MockAudioDecoder>* decoder_1_;
-  StrictMock<MockAudioDecoder>* decoder_2_;
-  ScopedVector<AudioDecoder> all_decoders_;
-  std::unique_ptr<AudioDecoder> selected_decoder_;
-
-  base::MessageLoop message_loop_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AudioDecoderSelectorTest);
-};
-
-// TODO(xhwang): Add kNoCdm tests for clear stream.
-
-// The stream is not encrypted but we have no clear decoder. No decoder can be
-// selected.
-TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_NoClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 0);
-
-  EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-
-  SelectDecoder();
-}
-
-// The stream is not encrypted and we have one clear decoder. The decoder
-// will be selected.
-TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest,
-       Destroy_ClearStream_NoDecryptor_OneClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// The stream is not encrypted and we have multiple clear decoders. The first
-// decoder that can decode the input stream will be selected.
-TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest,
-       Destroy_ClearStream_NoDecryptor_MultipleClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// There is a decryptor but the stream is not encrypted. The decoder will be
-// selected.
-TEST_F(AudioDecoderSelectorTest, ClearStream_HasDecryptor) {
-  UseClearStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest, Destroy_ClearStream_HasDecryptor) {
-  UseClearStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// The stream is encrypted and there's no decryptor. The decoder only supports
-// clear streams so no decoder can be selected.
-TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest,
-       Destroy_EncryptedStream_NoDecryptor_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// The stream is encrypted and there's no decryptor. There are multiple decoders
-// and the first one that supports encrypted streams is selected.
-TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_MultipleDecoders) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest,
-       Destroy_EncryptedStream_NoDecryptor_MultipleDecoders) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// Decryptor can only do decryption and there's no decoder available. No decoder
-// can be selected.
-TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_NoClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 0);
-
-  EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-
-  SelectDecoder();
-}
-
-// Decryptor can do decryption-only and there's a decoder available. The decoder
-// will be selected and a DecryptingDemuxerStream will be created.
-TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest,
-       Destroy_EncryptedStream_DecryptOnly_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// Decryptor can only do decryption and there are multiple decoders available.
-// The first decoder that can decode the input stream will be selected and
-// a DecryptingDemuxerStream will be created.
-TEST_F(AudioDecoderSelectorTest,
-       EncryptedStream_DecryptOnly_MultipleClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(AudioDecoderSelectorTest,
-       Destroy_EncryptedStream_DecryptOnly_MultipleClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// Decryptor can do decryption and decoding.
-TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptAndDecode) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptAndDecode, 1);
-
-#if !defined(OS_ANDROID)
-  // A DecryptingVideoDecoder will be created and selected. The clear decoder
-  // should not be touched at all. No DecryptingDemuxerStream should to be
-  // created.
-  EXPECT_CALL(*this, OnDecoderSelected(NotNull(), IsNull()));
-#else
-  // A DecryptingDemuxerStream will be created. The clear decoder will be
-  // initialized and returned.
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
-      .WillOnce(RunCallback<2>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull()));
-#endif
-
-  SelectDecoder();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_decoder_unittest.cc b/src/cobalt/media/filters/audio_decoder_unittest.cc
deleted file mode 100644
index f344600..0000000
--- a/src/cobalt/media/filters/audio_decoder_unittest.cc
+++ /dev/null
@@ -1,633 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/format_macros.h"
-#include "base/md5.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "base/stringprintf.h"
-#include "base/sys_byteorder.h"
-#include "base/threading/platform_thread.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/base/audio_hash.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "cobalt/media/filters/audio_file_reader.h"
-#include "cobalt/media/filters/ffmpeg_audio_decoder.h"
-#include "cobalt/media/filters/in_memory_url_protocol.h"
-#include "cobalt/media/filters/opus_audio_decoder.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/build_info.h"
-#include "cobalt/media/base/android/media_codec_util.h"
-#include "cobalt/media/filters/android/media_codec_audio_decoder.h"
-
-#if defined(USE_PROPRIETARY_CODECS)
-#include "cobalt/media/formats/mpeg/adts_stream_parser.h"
-#endif
-
-// Helper macro to skip the test if MediaCodec is not available.
-#define SKIP_TEST_IF_NO_MEDIA_CODEC()                                \
-  do {                                                               \
-    if (GetParam().decoder_type == MEDIA_CODEC) {                    \
-      if (!MediaCodecUtil::IsMediaCodecAvailable()) {                \
-        VLOG(0) << "Could not run test - no MediaCodec on device.";  \
-        return;                                                      \
-      }                                                              \
-      if (GetParam().codec == kCodecOpus &&                          \
-          base::android::BuildInfo::GetInstance()->sdk_int() < 21) { \
-        VLOG(0) << "Could not run test - Opus is not supported";     \
-        return;                                                      \
-      }                                                              \
-    }                                                                \
-  } while (0)
-#else
-#define SKIP_TEST_IF_NO_MEDIA_CODEC() \
-  do {                                \
-  } while (0)
-#endif  // !defined(OS_ANDROID)
-
-namespace cobalt {
-namespace media {
-
-// The number of packets to read and then decode from each file.
-static const size_t kDecodeRuns = 3;
-static const uint8_t kOpusExtraData[] = {
-    0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, 0x01, 0x02,
-    // The next two bytes represent the codec delay.
-    0x00, 0x00, 0x80, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-enum AudioDecoderType {
-  FFMPEG,
-  OPUS,
-#if defined(OS_ANDROID)
-  MEDIA_CODEC,
-#endif
-};
-
-struct DecodedBufferExpectations {
-  const int64_t timestamp;
-  const int64_t duration;
-  const char* hash;
-};
-
-struct DecoderTestData {
-  const AudioDecoderType decoder_type;
-  const AudioCodec codec;
-  const char* filename;
-  const DecodedBufferExpectations* expectations;
-  const int first_packet_pts;
-  const int samples_per_second;
-  const ChannelLayout channel_layout;
-};
-
-// Tells gtest how to print our DecoderTestData structure.
-std::ostream& operator<<(std::ostream& os, const DecoderTestData& data) {
-  return os << data.filename;
-}
-
-// Marks negative timestamp buffers for discard or transfers FFmpeg's built in
-// discard metadata in favor of setting DiscardPadding on the DecoderBuffer.
-// Allows better testing of AudioDiscardHelper usage.
-static void SetDiscardPadding(AVPacket* packet,
-                              const scoped_refptr<DecoderBuffer> buffer,
-                              double samples_per_second) {
-  // Discard negative timestamps.
-  if (buffer->timestamp() + buffer->duration() < base::TimeDelta()) {
-    buffer->set_discard_padding(
-        std::make_pair(kInfiniteDuration, base::TimeDelta()));
-    return;
-  }
-  if (buffer->timestamp() < base::TimeDelta()) {
-    buffer->set_discard_padding(
-        std::make_pair(-buffer->timestamp(), base::TimeDelta()));
-    return;
-  }
-
-  // If the timestamp is positive, try to use FFmpeg's discard data.
-  int skip_samples_size = 0;
-  const uint32_t* skip_samples_ptr =
-      reinterpret_cast<const uint32_t*>(av_packet_get_side_data(
-          packet, AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size));
-  if (skip_samples_size < 4) return;
-  buffer->set_discard_padding(std::make_pair(
-      base::TimeDelta::FromSecondsD(base::ByteSwapToLE32(*skip_samples_ptr) /
-                                    samples_per_second),
-      base::TimeDelta()));
-}
-
-class AudioDecoderTest : public testing::TestWithParam<DecoderTestData> {
- public:
-  AudioDecoderTest()
-      : pending_decode_(false),
-        pending_reset_(false),
-        last_decode_status_(DecodeStatus::DECODE_ERROR) {
-    switch (GetParam().decoder_type) {
-      case FFMPEG:
-        decoder_.reset(new FFmpegAudioDecoder(message_loop_.task_runner(),
-                                              new MediaLog()));
-        break;
-      case OPUS:
-        decoder_.reset(new OpusAudioDecoder(message_loop_.task_runner()));
-        break;
-#if defined(OS_ANDROID)
-      case MEDIA_CODEC:
-        decoder_.reset(new MediaCodecAudioDecoder(message_loop_.task_runner()));
-        break;
-#endif
-    }
-  }
-
-  virtual ~AudioDecoderTest() {
-    EXPECT_FALSE(pending_decode_);
-    EXPECT_FALSE(pending_reset_);
-  }
-
- protected:
-  void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer) {
-    ASSERT_FALSE(pending_decode_);
-    pending_decode_ = true;
-    last_decode_status_ = DecodeStatus::DECODE_ERROR;
-
-    base::RunLoop run_loop;
-    decoder_->Decode(
-        buffer, base::Bind(&AudioDecoderTest::DecodeFinished,
-                           base::Unretained(this), run_loop.QuitClosure()));
-    run_loop.Run();
-    ASSERT_FALSE(pending_decode_);
-  }
-
-  void SendEndOfStream() { DecodeBuffer(DecoderBuffer::CreateEOSBuffer()); }
-
-  void Initialize() {
-    // Load the test data file.
-    data_ = ReadTestDataFile(GetParam().filename);
-    protocol_.reset(
-        new InMemoryUrlProtocol(data_->data(), data_->data_size(), false));
-    reader_.reset(new AudioFileReader(protocol_.get()));
-    ASSERT_TRUE(reader_->OpenDemuxerForTesting());
-
-    // Load the first packet and check its timestamp.
-    AVPacket packet;
-    ASSERT_TRUE(reader_->ReadPacketForTesting(&packet));
-    EXPECT_EQ(GetParam().first_packet_pts, packet.pts);
-    start_timestamp_ = ConvertFromTimeBase(
-        reader_->GetAVStreamForTesting()->time_base, packet.pts);
-
-    // Seek back to the beginning.
-    ASSERT_TRUE(reader_->SeekForTesting(start_timestamp_));
-
-    AudioDecoderConfig config;
-    ASSERT_TRUE(AVCodecContextToAudioDecoderConfig(
-        reader_->codec_context_for_testing(), Unencrypted(), &config));
-
-#if defined(OS_ANDROID) && defined(USE_PROPRIETARY_CODECS)
-    // MEDIA_CODEC type requires config->extra_data() for AAC codec. For ADTS
-    // streams we need to extract it with a separate procedure.
-    if (GetParam().decoder_type == MEDIA_CODEC &&
-        GetParam().codec == kCodecAAC && config.extra_data().empty()) {
-      int sample_rate;
-      ChannelLayout channel_layout;
-      std::vector<uint8_t> extra_data;
-      ASSERT_GT(ADTSStreamParser().ParseFrameHeader(
-                    packet.data, packet.size, NULL, &sample_rate,
-                    &channel_layout, NULL, NULL, &extra_data),
-                0);
-      config.Initialize(kCodecAAC, kSampleFormatS16, channel_layout,
-                        sample_rate, extra_data, Unencrypted(),
-                        base::TimeDelta(), 0);
-      ASSERT_FALSE(config.extra_data().empty());
-    }
-#endif
-
-    av_packet_unref(&packet);
-
-    EXPECT_EQ(GetParam().codec, config.codec());
-    EXPECT_EQ(GetParam().samples_per_second, config.samples_per_second());
-    EXPECT_EQ(GetParam().channel_layout, config.channel_layout());
-
-    InitializeDecoder(config);
-  }
-
-  void InitializeDecoder(const AudioDecoderConfig& config) {
-    InitializeDecoderWithResult(config, true);
-  }
-
-  void InitializeDecoderWithResult(const AudioDecoderConfig& config,
-                                   bool success) {
-    decoder_->Initialize(
-        config, NULL, NewExpectedBoolCB(success),
-        base::Bind(&AudioDecoderTest::OnDecoderOutput, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void Decode() {
-    AVPacket packet;
-    ASSERT_TRUE(reader_->ReadPacketForTesting(&packet));
-
-    // Split out packet metadata before making a copy.
-    av_packet_split_side_data(&packet);
-
-    scoped_refptr<DecoderBuffer> buffer =
-        DecoderBuffer::CopyFrom(packet.data, packet.size);
-    buffer->set_timestamp(ConvertFromTimeBase(
-        reader_->GetAVStreamForTesting()->time_base, packet.pts));
-    buffer->set_duration(ConvertFromTimeBase(
-        reader_->GetAVStreamForTesting()->time_base, packet.duration));
-    if (packet.flags & AV_PKT_FLAG_KEY) buffer->set_is_key_frame(true);
-
-    // Don't set discard padding for Opus, it already has discard behavior set
-    // based on the codec delay in the AudioDecoderConfig.
-    if (GetParam().decoder_type == FFMPEG)
-      SetDiscardPadding(&packet, buffer, GetParam().samples_per_second);
-
-    // DecodeBuffer() shouldn't need the original packet since it uses the copy.
-    av_packet_unref(&packet);
-    DecodeBuffer(buffer);
-  }
-
-  void Reset() {
-    ASSERT_FALSE(pending_reset_);
-    pending_reset_ = true;
-    decoder_->Reset(
-        base::Bind(&AudioDecoderTest::ResetFinished, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    ASSERT_FALSE(pending_reset_);
-  }
-
-  void Seek(base::TimeDelta seek_time) {
-    Reset();
-    decoded_audio_.clear();
-    ASSERT_TRUE(reader_->SeekForTesting(seek_time));
-  }
-
-  void OnDecoderOutput(const scoped_refptr<AudioBuffer>& buffer) {
-    EXPECT_FALSE(buffer->end_of_stream());
-    decoded_audio_.push_back(buffer);
-  }
-
-  void DecodeFinished(const base::Closure& quit_closure, DecodeStatus status) {
-    EXPECT_TRUE(pending_decode_);
-    EXPECT_FALSE(pending_reset_);
-    pending_decode_ = false;
-    last_decode_status_ = status;
-    quit_closure.Run();
-  }
-
-  void ResetFinished() {
-    EXPECT_TRUE(pending_reset_);
-    EXPECT_FALSE(pending_decode_);
-    pending_reset_ = false;
-  }
-
-  // Generates an MD5 hash of the audio signal.  Should not be used for checks
-  // across platforms as audio varies slightly across platforms.
-  std::string GetDecodedAudioMD5(size_t i) {
-    CHECK_LT(i, decoded_audio_.size());
-    const scoped_refptr<AudioBuffer>& buffer = decoded_audio_[i];
-
-    std::unique_ptr<AudioBus> output =
-        AudioBus::Create(buffer->channel_count(), buffer->frame_count());
-    buffer->ReadFrames(buffer->frame_count(), 0, 0, output.get());
-
-    base::MD5Context context;
-    base::MD5Init(&context);
-    for (int ch = 0; ch < output->channels(); ++ch) {
-      base::MD5Update(
-          &context,
-          base::StringPiece(reinterpret_cast<char*>(output->channel(ch)),
-                            output->frames() * sizeof(*output->channel(ch))));
-    }
-    base::MD5Digest digest;
-    base::MD5Final(&digest, &context);
-    return base::MD5DigestToBase16(digest);
-  }
-
-  // Android MediaCodec returns wrong timestamps (shifted one frame forward)
-  // for AAC before Android L. Skip the timestamp check in this situation.
-  bool SkipBufferTimestampCheck() const {
-#if defined(OS_ANDROID)
-    return (base::android::BuildInfo::GetInstance()->sdk_int() < 21) &&
-           GetParam().decoder_type == MEDIA_CODEC &&
-           GetParam().codec == kCodecAAC;
-#else
-    return false;
-#endif
-  }
-
-  void ExpectDecodedAudio(size_t i, const std::string& exact_hash) {
-    CHECK_LT(i, decoded_audio_.size());
-    const scoped_refptr<AudioBuffer>& buffer = decoded_audio_[i];
-
-    const DecodedBufferExpectations& sample_info = GetParam().expectations[i];
-
-    // Android MediaCodec returns wrong timestamps (shifted one frame forward)
-    // for AAC before Android L. Ignore sample_info.timestamp in this situation.
-    if (!SkipBufferTimestampCheck())
-      EXPECT_EQ(sample_info.timestamp, buffer->timestamp().InMicroseconds());
-    EXPECT_EQ(sample_info.duration, buffer->duration().InMicroseconds());
-    EXPECT_FALSE(buffer->end_of_stream());
-
-    std::unique_ptr<AudioBus> output =
-        AudioBus::Create(buffer->channel_count(), buffer->frame_count());
-    buffer->ReadFrames(buffer->frame_count(), 0, 0, output.get());
-
-    // Generate a lossy hash of the audio used for comparison across platforms.
-    AudioHash audio_hash;
-    audio_hash.Update(output.get(), output->frames());
-    EXPECT_TRUE(audio_hash.IsEquivalent(sample_info.hash, 0.02))
-        << "Audio hashes differ. Expected: " << sample_info.hash
-        << " Actual: " << audio_hash.ToString();
-
-    if (!exact_hash.empty()) {
-      EXPECT_EQ(exact_hash, GetDecodedAudioMD5(i));
-
-      // Verify different hashes are being generated.  None of our test data
-      // files have audio that hashes out exactly the same.
-      if (i > 0) EXPECT_NE(exact_hash, GetDecodedAudioMD5(i - 1));
-    }
-  }
-
-  size_t decoded_audio_size() const { return decoded_audio_.size(); }
-  base::TimeDelta start_timestamp() const { return start_timestamp_; }
-  const scoped_refptr<AudioBuffer>& decoded_audio(size_t i) {
-    return decoded_audio_[i];
-  }
-  DecodeStatus last_decode_status() const { return last_decode_status_; }
-
- private:
-  base::MessageLoop message_loop_;
-  scoped_refptr<DecoderBuffer> data_;
-  std::unique_ptr<InMemoryUrlProtocol> protocol_;
-  std::unique_ptr<AudioFileReader> reader_;
-
-  std::unique_ptr<AudioDecoder> decoder_;
-  bool pending_decode_;
-  bool pending_reset_;
-  DecodeStatus last_decode_status_;
-
-  std::deque<scoped_refptr<AudioBuffer> > decoded_audio_;
-  base::TimeDelta start_timestamp_;
-
-  DISALLOW_COPY_AND_ASSIGN(AudioDecoderTest);
-};
-
-class OpusAudioDecoderBehavioralTest : public AudioDecoderTest {};
-class FFmpegAudioDecoderBehavioralTest : public AudioDecoderTest {};
-
-TEST_P(AudioDecoderTest, Initialize) {
-  SKIP_TEST_IF_NO_MEDIA_CODEC();
-  ASSERT_NO_FATAL_FAILURE(Initialize());
-}
-
-// Verifies decode audio as well as the Decode() -> Reset() sequence.
-TEST_P(AudioDecoderTest, ProduceAudioSamples) {
-  SKIP_TEST_IF_NO_MEDIA_CODEC();
-  ASSERT_NO_FATAL_FAILURE(Initialize());
-
-  // Run the test multiple times with a seek back to the beginning in between.
-  std::vector<std::string> decoded_audio_md5_hashes;
-  for (int i = 0; i < 2; ++i) {
-    // Run decoder until we get at least |kDecodeRuns| output buffers.
-    // Keeping Decode() in a loop seems to be the simplest way to guarantee that
-    // the predefined number of output buffers are produced without draining
-    // (i.e. decoding EOS).
-    do {
-      Decode();
-      ASSERT_EQ(last_decode_status(), DecodeStatus::OK);
-    } while (decoded_audio_size() < kDecodeRuns);
-
-    // With MediaCodecAudioDecoder the output buffers might appear after
-    // some delay. Since we keep decoding in a loop, the number of output
-    // buffers when they eventually appear might exceed |kDecodeRuns|.
-    ASSERT_LE(kDecodeRuns, decoded_audio_size());
-
-    // On the first pass record the exact MD5 hash for each decoded buffer.
-    if (i == 0) {
-      for (size_t j = 0; j < kDecodeRuns; ++j)
-        decoded_audio_md5_hashes.push_back(GetDecodedAudioMD5(j));
-    }
-
-    // On the first pass verify the basic audio hash and sample info.  On the
-    // second, verify the exact MD5 sum for each packet.  It shouldn't change.
-    for (size_t j = 0; j < kDecodeRuns; ++j) {
-      SCOPED_TRACE(base::StringPrintf("i = %d, j = %" PRIuS, i, j));
-      ExpectDecodedAudio(j, i == 0 ? "" : decoded_audio_md5_hashes[j]);
-    }
-
-    SendEndOfStream();
-
-    // Seek back to the beginning.  Calls Reset() on the decoder.
-    Seek(start_timestamp());
-  }
-}
-
-TEST_P(AudioDecoderTest, Decode) {
-  SKIP_TEST_IF_NO_MEDIA_CODEC();
-  ASSERT_NO_FATAL_FAILURE(Initialize());
-  Decode();
-  EXPECT_EQ(DecodeStatus::OK, last_decode_status());
-}
-
-TEST_P(AudioDecoderTest, Reset) {
-  SKIP_TEST_IF_NO_MEDIA_CODEC();
-  ASSERT_NO_FATAL_FAILURE(Initialize());
-  Reset();
-}
-
-TEST_P(AudioDecoderTest, NoTimestamp) {
-  SKIP_TEST_IF_NO_MEDIA_CODEC();
-  ASSERT_NO_FATAL_FAILURE(Initialize());
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0));
-  buffer->set_timestamp(kNoTimestamp);
-  DecodeBuffer(buffer);
-  EXPECT_EQ(DecodeStatus::DECODE_ERROR, last_decode_status());
-}
-
-TEST_P(OpusAudioDecoderBehavioralTest, InitializeWithNoCodecDelay) {
-  ASSERT_EQ(GetParam().decoder_type, OPUS);
-  std::vector<uint8_t> extra_data(kOpusExtraData,
-                                  kOpusExtraData + arraysize(kOpusExtraData));
-  AudioDecoderConfig decoder_config;
-  decoder_config.Initialize(kCodecOpus, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
-                            48000, extra_data, Unencrypted(),
-                            base::TimeDelta::FromMilliseconds(80), 0);
-  InitializeDecoder(decoder_config);
-}
-
-TEST_P(OpusAudioDecoderBehavioralTest, InitializeWithBadCodecDelay) {
-  ASSERT_EQ(GetParam().decoder_type, OPUS);
-  std::vector<uint8_t> extra_data(kOpusExtraData,
-                                  kOpusExtraData + arraysize(kOpusExtraData));
-  AudioDecoderConfig decoder_config;
-  decoder_config.Initialize(
-      kCodecOpus, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, 48000, extra_data,
-      Unencrypted(), base::TimeDelta::FromMilliseconds(80),
-      // Use a different codec delay than in the extradata.
-      100);
-  InitializeDecoderWithResult(decoder_config, true);
-}
-
-#if defined(OPUS_FIXED_POINT)
-const DecodedBufferExpectations kSfxOpusExpectations[] = {
-    {0, 13500, "-2.70,-1.41,-0.78,-1.27,-2.56,-3.73,"},
-    {13500, 20000, "5.48,5.93,6.05,5.83,5.54,5.46,"},
-    {33500, 20000, "-3.44,-3.34,-3.57,-4.11,-4.74,-5.13,"},
-};
-#else
-const DecodedBufferExpectations kSfxOpusExpectations[] = {
-    {0, 13500, "-2.70,-1.41,-0.78,-1.27,-2.56,-3.73,"},
-    {13500, 20000, "5.48,5.93,6.04,5.83,5.54,5.45,"},
-    {33500, 20000, "-3.45,-3.35,-3.57,-4.12,-4.74,-5.14,"},
-};
-#endif
-
-const DecodedBufferExpectations kBearOpusExpectations[] = {
-    {500, 3500, "-0.26,0.87,1.36,0.84,-0.30,-1.22,"},
-    {4000, 10000, "0.09,0.23,0.21,0.03,-0.17,-0.24,"},
-    {14000, 10000, "0.10,0.24,0.23,0.04,-0.14,-0.23,"},
-};
-
-const DecoderTestData kOpusTests[] = {
-    {OPUS, kCodecOpus, "sfx-opus.ogg", kSfxOpusExpectations, -312, 48000,
-     CHANNEL_LAYOUT_MONO},
-    {OPUS, kCodecOpus, "bear-opus.ogg", kBearOpusExpectations, 24, 48000,
-     CHANNEL_LAYOUT_STEREO},
-};
-
-// Dummy data for behavioral tests.
-const DecoderTestData kOpusBehavioralTest[] = {
-    {OPUS, kUnknownAudioCodec, "", NULL, 0, 0, CHANNEL_LAYOUT_NONE},
-};
-
-INSTANTIATE_TEST_CASE_P(OpusAudioDecoderTest, AudioDecoderTest,
-                        testing::ValuesIn(kOpusTests));
-INSTANTIATE_TEST_CASE_P(OpusAudioDecoderBehavioralTest,
-                        OpusAudioDecoderBehavioralTest,
-                        testing::ValuesIn(kOpusBehavioralTest));
-
-#if defined(OS_ANDROID)
-#if defined(USE_PROPRIETARY_CODECS)
-const DecodedBufferExpectations kSfxAdtsMcExpectations[] = {
-    {0, 23219, "-1.80,-1.49,-0.23,1.11,1.54,-0.11,"},
-    {23219, 23219, "-1.90,-1.53,-0.15,1.28,1.23,-0.33,"},
-    {46439, 23219, "0.54,0.88,2.19,3.54,3.24,1.63,"},
-};
-
-const DecodedBufferExpectations kHeAacMcExpectations[] = {
-    {0, 42666, "-1.76,-0.12,1.72,1.45,0.10,-1.32,"},
-    {42666, 42666, "-1.78,-0.13,1.70,1.44,0.09,-1.32,"},
-    {85333, 42666, "-1.78,-0.13,1.70,1.44,0.08,-1.33,"},
-};
-#endif
-
-const DecoderTestData kMediaCodecTests[] = {
-    {MEDIA_CODEC, kCodecOpus, "bear-opus.ogg", kBearOpusExpectations, 24, 48000,
-     CHANNEL_LAYOUT_STEREO},
-#if defined(USE_PROPRIETARY_CODECS)
-    {MEDIA_CODEC, kCodecAAC, "sfx.adts", kSfxAdtsMcExpectations, 0, 44100,
-     CHANNEL_LAYOUT_MONO},
-    {MEDIA_CODEC, kCodecAAC, "bear-audio-implicit-he-aac-v2.aac",
-     kHeAacMcExpectations, 0, 24000, CHANNEL_LAYOUT_MONO},
-#endif
-};
-
-INSTANTIATE_TEST_CASE_P(MediaCodecAudioDecoderTest, AudioDecoderTest,
-                        testing::ValuesIn(kMediaCodecTests));
-#endif  // defined(OS_ANDROID)
-
-#if defined(USE_PROPRIETARY_CODECS)
-const DecodedBufferExpectations kSfxMp3Expectations[] = {
-    {0, 1065, "2.81,3.99,4.53,4.10,3.08,2.46,"},
-    {1065, 26122, "-3.81,-4.14,-3.90,-3.36,-3.03,-3.23,"},
-    {27188, 26122, "4.24,3.95,4.22,4.78,5.13,4.93,"},
-};
-
-const DecodedBufferExpectations kSfxAdtsExpectations[] = {
-    {0, 23219, "-1.90,-1.53,-0.15,1.28,1.23,-0.33,"},
-    {23219, 23219, "0.54,0.88,2.19,3.54,3.24,1.63,"},
-    {46439, 23219, "1.42,1.69,2.95,4.23,4.02,2.36,"},
-};
-#endif
-
-#if defined(OS_CHROMEOS)
-const DecodedBufferExpectations kSfxFlacExpectations[] = {
-    {0, 104489, "-2.42,-1.12,0.71,1.70,1.09,-0.68,"},
-    {104489, 104489, "-1.99,-0.67,1.18,2.19,1.60,-0.16,"},
-    {208979, 79433, "2.84,2.70,3.23,4.06,4.59,4.44,"},
-};
-#endif
-
-const DecodedBufferExpectations kSfxWaveExpectations[] = {
-    {0, 23219, "-1.23,-0.87,0.47,1.85,1.88,0.29,"},
-    {23219, 23219, "0.75,1.10,2.43,3.78,3.53,1.93,"},
-    {46439, 23219, "1.27,1.56,2.83,4.13,3.87,2.23,"},
-};
-
-const DecodedBufferExpectations kFourChannelWaveExpectations[] = {
-    {0, 11609, "-1.68,1.68,0.89,-3.45,1.52,1.15,"},
-    {11609, 11609, "43.26,9.06,18.27,35.98,19.45,7.46,"},
-    {23219, 11609, "36.37,9.45,16.04,27.67,18.81,10.15,"},
-};
-
-const DecodedBufferExpectations kSfxOggExpectations[] = {
-    {0, 13061, "-0.33,1.25,2.86,3.26,2.09,0.14,"},
-    {13061, 23219, "-2.79,-2.42,-1.06,0.33,0.93,-0.64,"},
-    {36281, 23219, "-1.19,-0.80,0.57,1.97,2.08,0.51,"},
-};
-
-const DecodedBufferExpectations kBearOgvExpectations[] = {
-    {0, 13061, "-1.25,0.10,2.11,2.29,1.50,-0.68,"},
-    {13061, 23219, "-1.80,-1.41,-0.13,1.30,1.65,0.01,"},
-    {36281, 23219, "-1.43,-1.25,0.11,1.29,1.86,0.14,"},
-};
-
-const DecoderTestData kFFmpegTests[] = {
-#if defined(USE_PROPRIETARY_CODECS)
-    {FFMPEG, kCodecMP3, "sfx.mp3", kSfxMp3Expectations, 0, 44100,
-     CHANNEL_LAYOUT_MONO},
-    {FFMPEG, kCodecAAC, "sfx.adts", kSfxAdtsExpectations, 0, 44100,
-     CHANNEL_LAYOUT_MONO},
-#endif
-#if defined(OS_CHROMEOS)
-    {FFMPEG, kCodecFLAC, "sfx.flac", kSfxFlacExpectations, 0, 44100,
-     CHANNEL_LAYOUT_MONO},
-#endif
-    {FFMPEG, kCodecPCM, "sfx_f32le.wav", kSfxWaveExpectations, 0, 44100,
-     CHANNEL_LAYOUT_MONO},
-    {FFMPEG, kCodecPCM, "4ch.wav", kFourChannelWaveExpectations, 0, 44100,
-     CHANNEL_LAYOUT_QUAD},
-    {FFMPEG, kCodecVorbis, "sfx.ogg", kSfxOggExpectations, 0, 44100,
-     CHANNEL_LAYOUT_MONO},
-    // Note: bear.ogv is incorrectly muxed such that valid samples are given
-    // negative timestamps, this marks them for discard per the ogg vorbis spec.
-    {FFMPEG, kCodecVorbis, "bear.ogv", kBearOgvExpectations, -704, 44100,
-     CHANNEL_LAYOUT_STEREO},
-};
-
-// Dummy data for behavioral tests.
-const DecoderTestData kFFmpegBehavioralTest[] = {
-    {FFMPEG, kUnknownAudioCodec, "", NULL, 0, 0, CHANNEL_LAYOUT_NONE},
-};
-
-INSTANTIATE_TEST_CASE_P(FFmpegAudioDecoderTest, AudioDecoderTest,
-                        testing::ValuesIn(kFFmpegTests));
-INSTANTIATE_TEST_CASE_P(FFmpegAudioDecoderBehavioralTest,
-                        FFmpegAudioDecoderBehavioralTest,
-                        testing::ValuesIn(kFFmpegBehavioralTest));
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_file_reader.cc b/src/cobalt/media/filters/audio_file_reader.cc
deleted file mode 100644
index 0aeb83b..0000000
--- a/src/cobalt/media/filters/audio_file_reader.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_file_reader.h"
-
-#include <cmath>
-
-#include "base/logging.h"
-#include "base/numerics/safe_math.h"
-#include "base/time.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// AAC(M4A) decoding specific constants.
-static const int kAACPrimingFrameCount = 2112;
-static const int kAACRemainderFrameCount = 519;
-
-AudioFileReader::AudioFileReader(FFmpegURLProtocol* protocol)
-    : codec_context_(NULL),
-      stream_index_(0),
-      protocol_(protocol),
-      audio_codec_(kUnknownAudioCodec),
-      channels_(0),
-      sample_rate_(0),
-      av_sample_format_(0) {}
-
-AudioFileReader::~AudioFileReader() { Close(); }
-
-bool AudioFileReader::Open() {
-  if (!OpenDemuxer()) return false;
-  return OpenDecoder();
-}
-
-bool AudioFileReader::OpenDemuxer() {
-  glue_.reset(new FFmpegGlue(protocol_));
-  AVFormatContext* format_context = glue_->format_context();
-
-  // Open FFmpeg AVFormatContext.
-  if (!glue_->OpenContext()) {
-    DLOG(WARNING) << "AudioFileReader::Open() : error in avformat_open_input()";
-    return false;
-  }
-
-  // Get the codec context.
-  codec_context_ = NULL;
-  for (size_t i = 0; i < format_context->nb_streams; ++i) {
-    AVCodecContext* c = format_context->streams[i]->codec;
-    if (c->codec_type == AVMEDIA_TYPE_AUDIO) {
-      codec_context_ = c;
-      stream_index_ = i;
-      break;
-    }
-  }
-
-  // Get the codec.
-  if (!codec_context_) return false;
-
-  const int result = avformat_find_stream_info(format_context, NULL);
-  if (result < 0) {
-    DLOG(WARNING)
-        << "AudioFileReader::Open() : error in avformat_find_stream_info()";
-    return false;
-  }
-
-  return true;
-}
-
-bool AudioFileReader::OpenDecoder() {
-  AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id);
-  if (codec) {
-    // MP3 decodes to S16P which we don't support, tell it to use S16 instead.
-    if (codec_context_->sample_fmt == AV_SAMPLE_FMT_S16P)
-      codec_context_->request_sample_fmt = AV_SAMPLE_FMT_S16;
-
-    const int result = avcodec_open2(codec_context_, codec, NULL);
-    if (result < 0) {
-      DLOG(WARNING) << "AudioFileReader::Open() : could not open codec -"
-                    << " result: " << result;
-      return false;
-    }
-
-    // Ensure avcodec_open2() respected our format request.
-    if (codec_context_->sample_fmt == AV_SAMPLE_FMT_S16P) {
-      DLOG(ERROR) << "AudioFileReader::Open() : unable to configure a"
-                  << " supported sample format - "
-                  << codec_context_->sample_fmt;
-      return false;
-    }
-  } else {
-    DLOG(WARNING) << "AudioFileReader::Open() : could not find codec.";
-    return false;
-  }
-
-  // Verify the channel layout is supported by Chrome.  Acts as a sanity check
-  // against invalid files.  See http://crbug.com/171962
-  if (ChannelLayoutToChromeChannelLayout(codec_context_->channel_layout,
-                                         codec_context_->channels) ==
-      CHANNEL_LAYOUT_UNSUPPORTED) {
-    return false;
-  }
-
-  // Store initial values to guard against midstream configuration changes.
-  channels_ = codec_context_->channels;
-  audio_codec_ = CodecIDToAudioCodec(codec_context_->codec_id);
-  sample_rate_ = codec_context_->sample_rate;
-  av_sample_format_ = codec_context_->sample_fmt;
-  return true;
-}
-
-void AudioFileReader::Close() {
-  // |codec_context_| is a stream inside glue_->format_context(), so it is
-  // closed when |glue_| is disposed.
-  glue_.reset();
-  codec_context_ = NULL;
-}
-
-int AudioFileReader::Read(AudioBus* audio_bus) {
-  DCHECK(glue_.get() && codec_context_)
-      << "AudioFileReader::Read() : reader is not opened!";
-
-  DCHECK_EQ(audio_bus->channels(), channels());
-  if (audio_bus->channels() != channels()) return 0;
-
-  size_t bytes_per_sample = av_get_bytes_per_sample(codec_context_->sample_fmt);
-
-  // Holds decoded audio.
-  std::unique_ptr<AVFrame, ScopedPtrAVFreeFrame> av_frame(av_frame_alloc());
-
-  // Read until we hit EOF or we've read the requested number of frames.
-  AVPacket packet;
-  int current_frame = 0;
-  bool continue_decoding = true;
-
-  while (current_frame < audio_bus->frames() && continue_decoding &&
-         ReadPacket(&packet)) {
-    // Make a shallow copy of packet so we can slide packet.data as frames are
-    // decoded from the packet; otherwise av_packet_unref() will corrupt memory.
-    AVPacket packet_temp = packet;
-    do {
-      // Reset frame to default values.
-      av_frame_unref(av_frame.get());
-
-      int frame_decoded = 0;
-      int result = avcodec_decode_audio4(codec_context_, av_frame.get(),
-                                         &frame_decoded, &packet_temp);
-
-      if (result < 0) {
-        DLOG(WARNING)
-            << "AudioFileReader::Read() : error in avcodec_decode_audio4() -"
-            << result;
-        break;
-      }
-
-      // Update packet size and data pointer in case we need to call the decoder
-      // with the remaining bytes from this packet.
-      packet_temp.size -= result;
-      packet_temp.data += result;
-
-      if (!frame_decoded) continue;
-
-      // Determine the number of sample-frames we just decoded.  Check overflow.
-      int frames_read = av_frame->nb_samples;
-      if (frames_read < 0) {
-        continue_decoding = false;
-        break;
-      }
-
-#ifdef CHROMIUM_NO_AVFRAME_CHANNELS
-      int channels =
-          av_get_channel_layout_nb_channels(av_frame->channel_layout);
-#else
-      int channels = av_frame->channels;
-#endif
-      if (av_frame->sample_rate != sample_rate_ || channels != channels_ ||
-          av_frame->format != av_sample_format_) {
-        DLOG(ERROR) << "Unsupported midstream configuration change!"
-                    << " Sample Rate: " << av_frame->sample_rate << " vs "
-                    << sample_rate_ << ", Channels: " << channels << " vs "
-                    << channels_ << ", Sample Format: " << av_frame->format
-                    << " vs " << av_sample_format_;
-
-        // This is an unrecoverable error, so bail out.
-        continue_decoding = false;
-        break;
-      }
-
-      // Truncate, if necessary, if the destination isn't big enough.
-      if (current_frame + frames_read > audio_bus->frames()) {
-        DLOG(ERROR) << "Truncating decoded data due to output size.";
-        frames_read = audio_bus->frames() - current_frame;
-      }
-
-      // Deinterleave each channel and convert to 32bit floating-point with
-      // nominal range -1.0 -> +1.0.  If the output is already in float planar
-      // format, just copy it into the AudioBus.
-      if (codec_context_->sample_fmt == AV_SAMPLE_FMT_FLT) {
-        float* decoded_audio_data = reinterpret_cast<float*>(av_frame->data[0]);
-        int channels = audio_bus->channels();
-        for (int ch = 0; ch < channels; ++ch) {
-          float* bus_data = audio_bus->channel(ch) + current_frame;
-          for (int i = 0, offset = ch; i < frames_read;
-               ++i, offset += channels) {
-            bus_data[i] = decoded_audio_data[offset];
-          }
-        }
-      } else if (codec_context_->sample_fmt == AV_SAMPLE_FMT_FLTP) {
-        for (int ch = 0; ch < audio_bus->channels(); ++ch) {
-          SbMemoryCopy(audio_bus->channel(ch) + current_frame,
-                       av_frame->extended_data[ch],
-                       sizeof(float) * frames_read);
-        }
-      } else {
-        audio_bus->FromInterleavedPartial(av_frame->data[0], current_frame,
-                                          frames_read, bytes_per_sample);
-      }
-
-      current_frame += frames_read;
-    } while (packet_temp.size > 0);
-    av_packet_unref(&packet);
-  }
-
-  // Zero any remaining frames.
-  audio_bus->ZeroFramesPartial(current_frame,
-                               audio_bus->frames() - current_frame);
-
-  // Returns the actual number of sample-frames decoded.
-  // Ideally this represents the "true" exact length of the file.
-  return current_frame;
-}
-
-base::TimeDelta AudioFileReader::GetDuration() const {
-  const AVRational av_time_base = {1, AV_TIME_BASE};
-
-  // Estimated duration in micro seconds.
-  base::CheckedNumeric<int64_t> estimated_duration_us =
-      glue_->format_context()->duration;
-
-  if (audio_codec_ == kCodecAAC) {
-    // For certain AAC-encoded files, FFMPEG's estimated frame count might not
-    // be sufficient to capture the entire audio content that we want. This is
-    // especially noticeable for short files (< 10ms) resulting in silence
-    // throughout the decoded buffer. Thus we add the priming frames and the
-    // remainder frames to the estimation.
-    // (See: crbug.com/513178)
-    estimated_duration_us +=
-        ceil(1000000.0 * static_cast<double>(kAACPrimingFrameCount +
-                                             kAACRemainderFrameCount) /
-             sample_rate());
-  } else {
-    // Add one microsecond to avoid rounding-down errors which can occur when
-    // |duration| has been calculated from an exact number of sample-frames.
-    // One microsecond is much less than the time of a single sample-frame
-    // at any real-world sample-rate.
-    estimated_duration_us += 1;
-  }
-
-  return ConvertFromTimeBase(av_time_base, estimated_duration_us.ValueOrDie());
-}
-
-int AudioFileReader::GetNumberOfFrames() const {
-  return static_cast<int>(ceil(GetDuration().InSecondsF() * sample_rate()));
-}
-
-bool AudioFileReader::OpenDemuxerForTesting() { return OpenDemuxer(); }
-
-bool AudioFileReader::ReadPacketForTesting(AVPacket* output_packet) {
-  return ReadPacket(output_packet);
-}
-
-bool AudioFileReader::ReadPacket(AVPacket* output_packet) {
-  while (av_read_frame(glue_->format_context(), output_packet) >= 0) {
-    // Skip packets from other streams.
-    if (output_packet->stream_index != stream_index_) {
-      av_packet_unref(output_packet);
-      continue;
-    }
-    return true;
-  }
-  return false;
-}
-
-bool AudioFileReader::SeekForTesting(base::TimeDelta seek_time) {
-  return av_seek_frame(glue_->format_context(), stream_index_,
-                       ConvertToTimeBase(codec_context_->time_base, seek_time),
-                       AVSEEK_FLAG_BACKWARD) >= 0;
-}
-
-const AVStream* AudioFileReader::GetAVStreamForTesting() const {
-  return glue_->format_context()->streams[stream_index_];
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_file_reader.h b/src/cobalt/media/filters/audio_file_reader.h
deleted file mode 100644
index 5ac77af..0000000
--- a/src/cobalt/media/filters/audio_file_reader.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_AUDIO_FILE_READER_H_
-#define COBALT_MEDIA_FILTERS_AUDIO_FILE_READER_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/audio_codecs.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/filters/ffmpeg_glue.h"
-
-struct AVCodecContext;
-struct AVPacket;
-struct AVStream;
-
-namespace base {
-class TimeDelta;
-}
-
-namespace cobalt {
-namespace media {
-
-class AudioBus;
-class FFmpegURLProtocol;
-
-class MEDIA_EXPORT AudioFileReader {
- public:
-  // Audio file data will be read using the given protocol.
-  // The AudioFileReader does not take ownership of |protocol| and
-  // simply maintains a weak reference to it.
-  explicit AudioFileReader(FFmpegURLProtocol* protocol);
-  virtual ~AudioFileReader();
-
-  // Open() reads the audio data format so that the sample_rate(),
-  // channels(), GetDuration(), and GetNumberOfFrames() methods can be called.
-  // It returns |true| on success.
-  bool Open();
-  void Close();
-
-  // After a call to Open(), attempts to fully fill |audio_bus| with decoded
-  // audio data.  Any unfilled frames will be zeroed out.
-  // |audio_data| must be of the same size as channels().
-  // The audio data will be decoded as floating-point linear PCM with
-  // a nominal range of -1.0 -> +1.0.
-  // Returns the number of sample-frames actually read which will always be
-  // <= audio_bus->frames()
-  int Read(AudioBus* audio_bus);
-
-  // These methods can be called once Open() has been called.
-  int channels() const { return channels_; }
-  int sample_rate() const { return sample_rate_; }
-
-  // Please note that GetDuration() and GetNumberOfFrames() attempt to be
-  // accurate, but are only estimates.  For some encoded formats, the actual
-  // duration of the file can only be determined once all the file data has been
-  // read. The Read() method returns the actual number of sample-frames it has
-  // read.
-  base::TimeDelta GetDuration() const;
-  int GetNumberOfFrames() const;
-
-  // The methods below are helper methods which allow AudioFileReader to double
-  // as a test utility for demuxing audio files.
-  // --------------------------------------------------------------------------
-
-  // Similar to Open() but does not initialize the decoder.
-  bool OpenDemuxerForTesting();
-
-  // Returns true if a packet could be demuxed from the first audio stream in
-  // the file, |output_packet| will contain the demuxed packet then.
-  bool ReadPacketForTesting(AVPacket* output_packet);
-
-  // Seeks to the given point and returns true if successful.  |seek_time| will
-  // be converted to the stream's time base automatically.
-  bool SeekForTesting(base::TimeDelta seek_time);
-
-  const AVStream* GetAVStreamForTesting() const;
-  const AVCodecContext* codec_context_for_testing() const {
-    return codec_context_;
-  }
-
- private:
-  bool OpenDemuxer();
-  bool OpenDecoder();
-  bool ReadPacket(AVPacket* output_packet);
-
-  std::unique_ptr<FFmpegGlue> glue_;
-  AVCodecContext* codec_context_;
-  int stream_index_;
-  FFmpegURLProtocol* protocol_;
-  AudioCodec audio_codec_;
-  int channels_;
-  int sample_rate_;
-
-  // AVSampleFormat initially requested; not Chrome's SampleFormat.
-  int av_sample_format_;
-
-  DISALLOW_COPY_AND_ASSIGN(AudioFileReader);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_AUDIO_FILE_READER_H_
diff --git a/src/cobalt/media/filters/audio_file_reader_unittest.cc b/src/cobalt/media/filters/audio_file_reader_unittest.cc
deleted file mode 100644
index db93e6f..0000000
--- a/src/cobalt/media/filters/audio_file_reader_unittest.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_file_reader.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/md5.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/base/audio_hash.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "cobalt/media/filters/in_memory_url_protocol.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioFileReaderTest : public testing::Test {
- public:
-  AudioFileReaderTest() : packet_verification_disabled_(false) {}
-  ~AudioFileReaderTest() override {}
-
-  void Initialize(const char* filename) {
-    data_ = ReadTestDataFile(filename);
-    protocol_.reset(
-        new InMemoryUrlProtocol(data_->data(), data_->data_size(), false));
-    reader_.reset(new AudioFileReader(protocol_.get()));
-  }
-
-  // Reads and the entire file provided to Initialize().
-  void ReadAndVerify(const char* expected_audio_hash, int expected_frames) {
-    std::unique_ptr<AudioBus> decoded_audio_data =
-        AudioBus::Create(reader_->channels(), reader_->GetNumberOfFrames());
-    int actual_frames = reader_->Read(decoded_audio_data.get());
-    ASSERT_LE(actual_frames, decoded_audio_data->frames());
-    ASSERT_EQ(expected_frames, actual_frames);
-
-    AudioHash audio_hash;
-    audio_hash.Update(decoded_audio_data.get(), actual_frames);
-    EXPECT_EQ(expected_audio_hash, audio_hash.ToString());
-  }
-
-  // Verify packets are consistent across demuxer runs.  Reads the first few
-  // packets and then seeks back to the start timestamp and verifies that the
-  // hashes match on the packets just read.
-  void VerifyPackets() {
-    const int kReads = 3;
-    const int kTestPasses = 2;
-
-    AVPacket packet;
-    base::TimeDelta start_timestamp;
-    std::vector<std::string> packet_md5_hashes_;
-    for (int i = 0; i < kTestPasses; ++i) {
-      for (int j = 0; j < kReads; ++j) {
-        ASSERT_TRUE(reader_->ReadPacketForTesting(&packet));
-
-        // Remove metadata from the packet data section before hashing.
-        av_packet_split_side_data(&packet);
-
-        // On the first pass save the MD5 hash of each packet, on subsequent
-        // passes ensure it matches.
-        const std::string md5_hash = base::MD5String(base::StringPiece(
-            reinterpret_cast<char*>(packet.data), packet.size));
-        if (i == 0) {
-          packet_md5_hashes_.push_back(md5_hash);
-          if (j == 0) {
-            start_timestamp = ConvertFromTimeBase(
-                reader_->codec_context_for_testing()->time_base, packet.pts);
-          }
-        } else {
-          EXPECT_EQ(packet_md5_hashes_[j], md5_hash) << "j = " << j;
-        }
-
-        av_packet_unref(&packet);
-      }
-      ASSERT_TRUE(reader_->SeekForTesting(start_timestamp));
-    }
-  }
-
-  void RunTest(const char* fn, const char* hash, int channels, int sample_rate,
-               base::TimeDelta duration, int frames, int trimmed_frames) {
-    Initialize(fn);
-    ASSERT_TRUE(reader_->Open());
-    EXPECT_EQ(channels, reader_->channels());
-    EXPECT_EQ(sample_rate, reader_->sample_rate());
-    EXPECT_EQ(duration.InMicroseconds(),
-              reader_->GetDuration().InMicroseconds());
-    EXPECT_EQ(frames, reader_->GetNumberOfFrames());
-    if (!packet_verification_disabled_)
-      ASSERT_NO_FATAL_FAILURE(VerifyPackets());
-    ReadAndVerify(hash, trimmed_frames);
-  }
-
-  void RunTestFailingDemux(const char* fn) {
-    Initialize(fn);
-    EXPECT_FALSE(reader_->Open());
-  }
-
-  void RunTestFailingDecode(const char* fn) {
-    Initialize(fn);
-    EXPECT_TRUE(reader_->Open());
-    std::unique_ptr<AudioBus> decoded_audio_data =
-        AudioBus::Create(reader_->channels(), reader_->GetNumberOfFrames());
-    EXPECT_EQ(reader_->Read(decoded_audio_data.get()), 0);
-  }
-
-  void disable_packet_verification() { packet_verification_disabled_ = true; }
-
- protected:
-  scoped_refptr<DecoderBuffer> data_;
-  std::unique_ptr<InMemoryUrlProtocol> protocol_;
-  std::unique_ptr<AudioFileReader> reader_;
-  bool packet_verification_disabled_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AudioFileReaderTest);
-};
-
-TEST_F(AudioFileReaderTest, WithoutOpen) { Initialize("bear.ogv"); }
-
-TEST_F(AudioFileReaderTest, InvalidFile) {
-  RunTestFailingDemux("ten_byte_file");
-}
-
-TEST_F(AudioFileReaderTest, WithVideo) {
-  RunTest("bear.ogv", "-2.49,-0.75,0.38,1.60,0.70,-1.22,", 2, 44100,
-          base::TimeDelta::FromMicroseconds(1011520), 44609, 44609);
-}
-
-TEST_F(AudioFileReaderTest, Vorbis) {
-  RunTest("sfx.ogg", "4.36,4.81,4.84,4.45,4.61,4.63,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(350001), 15436, 15436);
-}
-
-TEST_F(AudioFileReaderTest, WaveU8) {
-  RunTest("sfx_u8.wav", "-1.23,-1.57,-1.14,-0.91,-0.87,-0.07,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(288414), 12720, 12719);
-}
-
-TEST_F(AudioFileReaderTest, WaveS16LE) {
-  RunTest("sfx_s16le.wav", "3.05,2.87,3.00,3.32,3.58,4.08,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(288414), 12720, 12719);
-}
-
-TEST_F(AudioFileReaderTest, WaveS24LE) {
-  RunTest("sfx_s24le.wav", "3.03,2.86,2.99,3.31,3.57,4.06,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(288414), 12720, 12719);
-}
-
-TEST_F(AudioFileReaderTest, WaveF32LE) {
-  RunTest("sfx_f32le.wav", "3.03,2.86,2.99,3.31,3.57,4.06,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(288414), 12720, 12719);
-}
-
-#if defined(USE_PROPRIETARY_CODECS)
-TEST_F(AudioFileReaderTest, MP3) {
-  RunTest("sfx.mp3", "1.30,2.72,4.56,5.08,3.74,2.03,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(313470), 13825, 11025);
-}
-
-TEST_F(AudioFileReaderTest, CorruptMP3) {
-  // Disable packet verification since the file is corrupt and FFmpeg does not
-  // make any guarantees on packet consistency in this case.
-  disable_packet_verification();
-  RunTest("corrupt.mp3", "-4.95,-2.95,-0.44,1.16,0.31,-2.21,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(1018801), 44930, 44928);
-}
-
-TEST_F(AudioFileReaderTest, AAC) {
-  RunTest("sfx.m4a", "1.81,1.66,2.32,3.27,4.46,3.36,", 1, 44100,
-          base::TimeDelta::FromMicroseconds(371660), 16391, 13312);
-}
-
-TEST_F(AudioFileReaderTest, MidStreamConfigChangesFail) {
-  RunTestFailingDecode("midstream_config_change.mp3");
-}
-#endif
-
-TEST_F(AudioFileReaderTest, VorbisInvalidChannelLayout) {
-  RunTestFailingDemux("9ch.ogg");
-}
-
-TEST_F(AudioFileReaderTest, WaveValidFourChannelLayout) {
-  RunTest("4ch.wav", "131.71,38.02,130.31,44.89,135.98,42.52,", 4, 44100,
-          base::TimeDelta::FromMicroseconds(100001), 4411, 4410);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_renderer_algorithm.cc b/src/cobalt/media/filters/audio_renderer_algorithm.cc
deleted file mode 100644
index 5143d7b..0000000
--- a/src/cobalt/media/filters/audio_renderer_algorithm.cc
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_renderer_algorithm.h"
-
-#include <algorithm>
-#include <cmath>
-
-#include "base/logging.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/base/limits.h"
-#include "cobalt/media/filters/wsola_internals.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-// Waveform Similarity Overlap-and-add (WSOLA).
-//
-// One WSOLA iteration
-//
-// 1) Extract |target_block_| as input frames at indices
-//    [|target_block_index_|, |target_block_index_| + |ola_window_size_|).
-//    Note that |target_block_| is the "natural" continuation of the output.
-//
-// 2) Extract |search_block_| as input frames at indices
-//    [|search_block_index_|,
-//     |search_block_index_| + |num_candidate_blocks_| + |ola_window_size_|).
-//
-// 3) Find a block within the |search_block_| that is most similar
-//    to |target_block_|. Let |optimal_index| be the index of such block and
-//    write it to |optimal_block_|.
-//
-// 4) Update:
-//    |optimal_block_| = |transition_window_| * |target_block_| +
-//    (1 - |transition_window_|) * |optimal_block_|.
-//
-// 5) Overlap-and-add |optimal_block_| to the |wsola_output_|.
-//
-// 6) Update:
-//    |target_block_| = |optimal_index| + |ola_window_size_| / 2.
-//    |output_index_| = |output_index_| + |ola_window_size_| / 2,
-//    |search_block_center_offset_| = |output_index_| * |playback_rate|, and
-//    |search_block_index_| = |search_block_center_offset_| -
-//        |search_block_center_offset_|.
-
-// Max/min supported playback rates for fast/slow audio. Audio outside of these
-// ranges are muted.
-// Audio at these speeds would sound better under a frequency domain algorithm.
-static const double kMinPlaybackRate = 0.5;
-static const double kMaxPlaybackRate = 4.0;
-
-// Overlap-and-add window size in milliseconds.
-static const int kOlaWindowSizeMs = 20;
-
-// Size of search interval in milliseconds. The search interval is
-// [-delta delta] around |output_index_| * |playback_rate|. So the search
-// interval is 2 * delta.
-static const int kWsolaSearchIntervalMs = 30;
-
-// The maximum size in seconds for the |audio_buffer_|. Arbitrarily determined.
-static const int kMaxCapacityInSeconds = 3;
-
-// The minimum size in ms for the |audio_buffer_|. Arbitrarily determined.
-static const int kStartingCapacityInMs = 200;
-
-AudioRendererAlgorithm::AudioRendererAlgorithm()
-    : channels_(0),
-      samples_per_second_(0),
-      muted_partial_frame_(0),
-      capacity_(0),
-      output_time_(0.0),
-      search_block_center_offset_(0),
-      search_block_index_(0),
-      num_candidate_blocks_(0),
-      target_block_index_(0),
-      ola_window_size_(0),
-      ola_hop_size_(0),
-      num_complete_frames_(0),
-      initial_capacity_(0),
-      max_capacity_(0) {}
-
-AudioRendererAlgorithm::~AudioRendererAlgorithm() {}
-
-void AudioRendererAlgorithm::Initialize(const AudioParameters& params) {
-  CHECK(params.IsValid());
-
-  channels_ = params.channels();
-  samples_per_second_ = params.sample_rate();
-  initial_capacity_ = capacity_ =
-      std::max(params.frames_per_buffer() * 2,
-               ConvertMillisecondsToFrames(kStartingCapacityInMs));
-  max_capacity_ =
-      std::max(initial_capacity_, kMaxCapacityInSeconds * samples_per_second_);
-  num_candidate_blocks_ = ConvertMillisecondsToFrames(kWsolaSearchIntervalMs);
-  ola_window_size_ = ConvertMillisecondsToFrames(kOlaWindowSizeMs);
-
-  // Make sure window size in an even number.
-  ola_window_size_ += ola_window_size_ & 1;
-  ola_hop_size_ = ola_window_size_ / 2;
-
-  // |num_candidate_blocks_| / 2 is the offset of the center of the search
-  // block to the center of the first (left most) candidate block. The offset
-  // of the center of a candidate block to its left most point is
-  // |ola_window_size_| / 2 - 1. Note that |ola_window_size_| is even and in
-  // our convention the center belongs to the left half, so we need to subtract
-  // one frame to get the correct offset.
-  //
-  //                             Search Block
-  //              <------------------------------------------->
-  //
-  //   |ola_window_size_| / 2 - 1
-  //              <----
-  //
-  //             |num_candidate_blocks_| / 2
-  //                   <----------------
-  //                                 center
-  //              X----X----------------X---------------X-----X
-  //              <---------->                     <---------->
-  //                Candidate      ...               Candidate
-  //                   1,          ...         |num_candidate_blocks_|
-  search_block_center_offset_ =
-      num_candidate_blocks_ / 2 + (ola_window_size_ / 2 - 1);
-
-  ola_window_.reset(new float[ola_window_size_]);
-  internal::GetSymmetricHanningWindow(ola_window_size_, ola_window_.get());
-
-  transition_window_.reset(new float[ola_window_size_ * 2]);
-  internal::GetSymmetricHanningWindow(2 * ola_window_size_,
-                                      transition_window_.get());
-
-  wsola_output_ = AudioBus::Create(channels_, ola_window_size_ + ola_hop_size_);
-  wsola_output_->Zero();  // Initialize for overlap-and-add of the first block.
-
-  // Auxiliary containers.
-  optimal_block_ = AudioBus::Create(channels_, ola_window_size_);
-  search_block_ = AudioBus::Create(
-      channels_, num_candidate_blocks_ + (ola_window_size_ - 1));
-  target_block_ = AudioBus::Create(channels_, ola_window_size_);
-}
-
-int AudioRendererAlgorithm::FillBuffer(AudioBus* dest, int dest_offset,
-                                       int requested_frames,
-                                       double playback_rate) {
-  if (playback_rate == 0) return 0;
-
-  DCHECK_GT(playback_rate, 0);
-  DCHECK_EQ(channels_, dest->channels());
-
-  // Optimize the muted case to issue a single clear instead of performing
-  // the full crossfade and clearing each crossfaded frame.
-  if (playback_rate < kMinPlaybackRate || playback_rate > kMaxPlaybackRate) {
-    int frames_to_render =
-        std::min(static_cast<int>(audio_buffer_.frames() / playback_rate),
-                 requested_frames);
-
-    // Compute accurate number of frames to actually skip in the source data.
-    // Includes the leftover partial frame from last request. However, we can
-    // only skip over complete frames, so a partial frame may remain for next
-    // time.
-    muted_partial_frame_ += frames_to_render * playback_rate;
-    // Handle the case where muted_partial_frame_ rounds up to
-    // audio_buffer_.frames()+1.
-    int seek_frames = std::min(static_cast<int>(muted_partial_frame_),
-                               audio_buffer_.frames());
-    dest->ZeroFramesPartial(dest_offset, frames_to_render);
-    audio_buffer_.SeekFrames(seek_frames);
-
-    // Determine the partial frame that remains to be skipped for next call. If
-    // the user switches back to playing, it may be off time by this partial
-    // frame, which would be undetectable. If they subsequently switch to
-    // another playback rate that mutes, the code will attempt to line up the
-    // frames again.
-    muted_partial_frame_ -= seek_frames;
-    return frames_to_render;
-  }
-
-  int slower_step = ceil(ola_window_size_ * playback_rate);
-  int faster_step = ceil(ola_window_size_ / playback_rate);
-
-  // Optimize the most common |playback_rate| ~= 1 case to use a single copy
-  // instead of copying frame by frame.
-  if (ola_window_size_ <= faster_step && slower_step >= ola_window_size_) {
-    const int frames_to_copy =
-        std::min(audio_buffer_.frames(), requested_frames);
-    const int frames_read =
-        audio_buffer_.ReadFrames(frames_to_copy, dest_offset, dest);
-    DCHECK_EQ(frames_read, frames_to_copy);
-    return frames_read;
-  }
-
-  int rendered_frames = 0;
-  do {
-    rendered_frames +=
-        WriteCompletedFramesTo(requested_frames - rendered_frames,
-                               dest_offset + rendered_frames, dest);
-  } while (rendered_frames < requested_frames &&
-           RunOneWsolaIteration(playback_rate));
-  return rendered_frames;
-}
-
-void AudioRendererAlgorithm::FlushBuffers() {
-  // Clear the queue of decoded packets (releasing the buffers).
-  audio_buffer_.Clear();
-  output_time_ = 0.0;
-  search_block_index_ = 0;
-  target_block_index_ = 0;
-  wsola_output_->Zero();
-  num_complete_frames_ = 0;
-
-  // Reset |capacity_| so growth triggered by underflows doesn't penalize seek
-  // time.
-  capacity_ = initial_capacity_;
-}
-
-void AudioRendererAlgorithm::EnqueueBuffer(
-    const scoped_refptr<AudioBuffer>& buffer_in) {
-  DCHECK(!buffer_in->end_of_stream());
-  audio_buffer_.Append(buffer_in);
-}
-
-bool AudioRendererAlgorithm::IsQueueFull() {
-  return audio_buffer_.frames() >= capacity_;
-}
-
-void AudioRendererAlgorithm::IncreaseQueueCapacity() {
-  DCHECK_LE(capacity_, max_capacity_);
-  capacity_ = std::min(2 * capacity_, max_capacity_);
-}
-
-int64_t AudioRendererAlgorithm::GetMemoryUsage() const {
-  return audio_buffer_.frames() * channels_ * sizeof(float);
-}
-
-bool AudioRendererAlgorithm::CanPerformWsola() const {
-  const int search_block_size = num_candidate_blocks_ + (ola_window_size_ - 1);
-  const int frames = audio_buffer_.frames();
-  return target_block_index_ + ola_window_size_ <= frames &&
-         search_block_index_ + search_block_size <= frames;
-}
-
-int AudioRendererAlgorithm::ConvertMillisecondsToFrames(int ms) const {
-  return ms * (samples_per_second_ /
-               static_cast<double>(base::Time::kMillisecondsPerSecond));
-}
-
-bool AudioRendererAlgorithm::RunOneWsolaIteration(double playback_rate) {
-  if (!CanPerformWsola()) return false;
-
-  GetOptimalBlock();
-
-  // Overlap-and-add.
-  for (int k = 0; k < channels_; ++k) {
-    const float* const ch_opt_frame = optimal_block_->channel(k);
-    float* ch_output = wsola_output_->channel(k) + num_complete_frames_;
-    for (int n = 0; n < ola_hop_size_; ++n) {
-      ch_output[n] = ch_output[n] * ola_window_[ola_hop_size_ + n] +
-                     ch_opt_frame[n] * ola_window_[n];
-    }
-
-    // Copy the second half to the output.
-    SbMemoryCopy(&ch_output[ola_hop_size_], &ch_opt_frame[ola_hop_size_],
-                 sizeof(*ch_opt_frame) * ola_hop_size_);
-  }
-
-  num_complete_frames_ += ola_hop_size_;
-  UpdateOutputTime(playback_rate, ola_hop_size_);
-  RemoveOldInputFrames(playback_rate);
-  return true;
-}
-
-void AudioRendererAlgorithm::UpdateOutputTime(double playback_rate,
-                                              double time_change) {
-  output_time_ += time_change;
-  // Center of the search region, in frames.
-  const int search_block_center_index =
-      static_cast<int>(output_time_ * playback_rate + 0.5);
-  search_block_index_ = search_block_center_index - search_block_center_offset_;
-}
-
-void AudioRendererAlgorithm::RemoveOldInputFrames(double playback_rate) {
-  const int earliest_used_index =
-      std::min(target_block_index_, search_block_index_);
-  if (earliest_used_index <= 0) return;  // Nothing to remove.
-
-  // Remove frames from input and adjust indices accordingly.
-  audio_buffer_.SeekFrames(earliest_used_index);
-  target_block_index_ -= earliest_used_index;
-
-  // Adjust output index.
-  double output_time_change =
-      static_cast<double>(earliest_used_index) / playback_rate;
-  CHECK_GE(output_time_, output_time_change);
-  UpdateOutputTime(playback_rate, -output_time_change);
-}
-
-int AudioRendererAlgorithm::WriteCompletedFramesTo(int requested_frames,
-                                                   int dest_offset,
-                                                   AudioBus* dest) {
-  int rendered_frames = std::min(num_complete_frames_, requested_frames);
-
-  if (rendered_frames == 0)
-    return 0;  // There is nothing to read from |wsola_output_|, return.
-
-  wsola_output_->CopyPartialFramesTo(0, rendered_frames, dest_offset, dest);
-
-  // Remove the frames which are read.
-  int frames_to_move = wsola_output_->frames() - rendered_frames;
-  for (int k = 0; k < channels_; ++k) {
-    float* ch = wsola_output_->channel(k);
-    SbMemoryMove(ch, &ch[rendered_frames], sizeof(*ch) * frames_to_move);
-  }
-  num_complete_frames_ -= rendered_frames;
-  return rendered_frames;
-}
-
-bool AudioRendererAlgorithm::TargetIsWithinSearchRegion() const {
-  const int search_block_size = num_candidate_blocks_ + (ola_window_size_ - 1);
-
-  return target_block_index_ >= search_block_index_ &&
-         target_block_index_ + ola_window_size_ <=
-             search_block_index_ + search_block_size;
-}
-
-void AudioRendererAlgorithm::GetOptimalBlock() {
-  int optimal_index = 0;
-
-  // An interval around last optimal block which is excluded from the search.
-  // This is to reduce the buzzy sound. The number 160 is rather arbitrary and
-  // derived heuristically.
-  const int kExcludeIntervalLengthFrames = 160;
-  if (TargetIsWithinSearchRegion()) {
-    optimal_index = target_block_index_;
-    PeekAudioWithZeroPrepend(optimal_index, optimal_block_.get());
-  } else {
-    PeekAudioWithZeroPrepend(target_block_index_, target_block_.get());
-    PeekAudioWithZeroPrepend(search_block_index_, search_block_.get());
-    int last_optimal =
-        target_block_index_ - ola_hop_size_ - search_block_index_;
-    internal::Interval exclude_iterval =
-        std::make_pair(last_optimal - kExcludeIntervalLengthFrames / 2,
-                       last_optimal + kExcludeIntervalLengthFrames / 2);
-
-    // |optimal_index| is in frames and it is relative to the beginning of the
-    // |search_block_|.
-    optimal_index = internal::OptimalIndex(
-        search_block_.get(), target_block_.get(), exclude_iterval);
-
-    // Translate |index| w.r.t. the beginning of |audio_buffer_| and extract the
-    // optimal block.
-    optimal_index += search_block_index_;
-    PeekAudioWithZeroPrepend(optimal_index, optimal_block_.get());
-
-    // Make a transition from target block to the optimal block if different.
-    // Target block has the best continuation to the current output.
-    // Optimal block is the most similar block to the target, however, it might
-    // introduce some discontinuity when over-lap-added. Therefore, we combine
-    // them for a smoother transition. The length of transition window is twice
-    // as that of the optimal-block which makes it like a weighting function
-    // where target-block has higher weight close to zero (weight of 1 at index
-    // 0) and lower weight close the end.
-    for (int k = 0; k < channels_; ++k) {
-      float* ch_opt = optimal_block_->channel(k);
-      const float* const ch_target = target_block_->channel(k);
-      for (int n = 0; n < ola_window_size_; ++n) {
-        ch_opt[n] = ch_opt[n] * transition_window_[n] +
-                    ch_target[n] * transition_window_[ola_window_size_ + n];
-      }
-    }
-  }
-
-  // Next target is one hop ahead of the current optimal.
-  target_block_index_ = optimal_index + ola_hop_size_;
-}
-
-void AudioRendererAlgorithm::PeekAudioWithZeroPrepend(int read_offset_frames,
-                                                      AudioBus* dest) {
-  CHECK_LE(read_offset_frames + dest->frames(), audio_buffer_.frames());
-
-  int write_offset = 0;
-  int num_frames_to_read = dest->frames();
-  if (read_offset_frames < 0) {
-    int num_zero_frames_appended =
-        std::min(-read_offset_frames, num_frames_to_read);
-    read_offset_frames = 0;
-    num_frames_to_read -= num_zero_frames_appended;
-    write_offset = num_zero_frames_appended;
-    dest->ZeroFrames(num_zero_frames_appended);
-  }
-  audio_buffer_.PeekFrames(num_frames_to_read, read_offset_frames, write_offset,
-                           dest);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_renderer_algorithm.h b/src/cobalt/media/filters/audio_renderer_algorithm.h
deleted file mode 100644
index e2becc9..0000000
--- a/src/cobalt/media/filters/audio_renderer_algorithm.h
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AudioRendererAlgorithm buffers and transforms audio data. The owner of
-// this object provides audio data to the object through EnqueueBuffer() and
-// requests data from the buffer via FillBuffer().
-//
-// This class is *not* thread-safe. Calls to enqueue and retrieve data must be
-// locked if called from multiple threads.
-//
-// AudioRendererAlgorithm uses the Waveform Similarity Overlap and Add (WSOLA)
-// algorithm to stretch or compress audio data to meet playback speeds less than
-// or greater than the natural playback of the audio stream. The algorithm
-// preserves local properties of the audio, therefore, pitch and harmonics are
-// are preserved. See audio_renderer_algorith.cc for a more elaborate
-// description of the algorithm.
-//
-// Audio at very low or very high playback rates are muted to preserve quality.
-
-#ifndef COBALT_MEDIA_FILTERS_AUDIO_RENDERER_ALGORITHM_H_
-#define COBALT_MEDIA_FILTERS_AUDIO_RENDERER_ALGORITHM_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/audio_buffer_queue.h"
-#include "cobalt/media/base/audio_parameters.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioBus;
-
-class MEDIA_EXPORT AudioRendererAlgorithm {
- public:
-  AudioRendererAlgorithm();
-  ~AudioRendererAlgorithm();
-
-  // Initializes this object with information about the audio stream.
-  void Initialize(const AudioParameters& params);
-
-  // Tries to fill |requested_frames| frames into |dest| with possibly scaled
-  // data from our |audio_buffer_|. Data is scaled based on |playback_rate|,
-  // using a variation of the Overlap-Add method to combine sample windows.
-  //
-  // Data from |audio_buffer_| is consumed in proportion to the playback rate.
-  //
-  // |dest_offset| is the offset in frames for writing into |dest|.
-  //
-  // Returns the number of frames copied into |dest|.
-  int FillBuffer(AudioBus* dest, int dest_offset, int requested_frames,
-                 double playback_rate);
-
-  // Clears |audio_buffer_|.
-  void FlushBuffers();
-
-  // Enqueues a buffer. It is called from the owner of the algorithm after a
-  // read completes.
-  void EnqueueBuffer(const scoped_refptr<AudioBuffer>& buffer_in);
-
-  // Returns true if |audio_buffer_| is at or exceeds capacity.
-  bool IsQueueFull();
-
-  // Returns the capacity of |audio_buffer_| in frames.
-  int QueueCapacity() const { return capacity_; }
-
-  // Increase the capacity of |audio_buffer_| if possible.
-  void IncreaseQueueCapacity();
-
-  // Returns an estimate of the amount of memory (in bytes) used for frames.
-  int64_t GetMemoryUsage() const;
-
-  // Returns the number of frames left in |audio_buffer_|, which may be larger
-  // than QueueCapacity() in the event that EnqueueBuffer() delivered more data
-  // than |audio_buffer_| was intending to hold.
-  int frames_buffered() { return audio_buffer_.frames(); }
-
-  // Returns the samples per second for this audio stream.
-  int samples_per_second() { return samples_per_second_; }
-
- private:
-  // Within |search_block_|, find the block of data that is most similar to
-  // |target_block_|, and write it in |optimal_block_|. This method assumes that
-  // there is enough data to perform a search, i.e. |search_block_| and
-  // |target_block_| can be extracted from the available frames.
-  void GetOptimalBlock();
-
-  // Read a maximum of |requested_frames| frames from |wsola_output_|. Returns
-  // number of frames actually read.
-  int WriteCompletedFramesTo(int requested_frames, int output_offset,
-                             AudioBus* dest);
-
-  // Fill |dest| with frames from |audio_buffer_| starting from frame
-  // |read_offset_frames|. |dest| is expected to have the same number of
-  // channels as |audio_buffer_|. A negative offset, i.e.
-  // |read_offset_frames| < 0, is accepted assuming that |audio_buffer| is zero
-  // for negative indices. This might happen for few first frames. This method
-  // assumes there is enough frames to fill |dest|, i.e. |read_offset_frames| +
-  // |dest->frames()| does not extend to future.
-  void PeekAudioWithZeroPrepend(int read_offset_frames, AudioBus* dest);
-
-  // Run one iteration of WSOLA, if there are sufficient frames. This will
-  // overlap-and-add one block to |wsola_output_|, hence, |num_complete_frames_|
-  // is incremented by |ola_hop_size_|.
-  bool RunOneWsolaIteration(double playback_rate);
-
-  // Seek |audio_buffer_| forward to remove frames from input that are not used
-  // any more. State of the WSOLA will be updated accordingly.
-  void RemoveOldInputFrames(double playback_rate);
-
-  // Update |output_time_| by |time_change|. In turn |search_block_index_| is
-  // updated.
-  void UpdateOutputTime(double playback_rate, double time_change);
-
-  // Is |target_block_| fully within |search_block_|? If so, we don't need to
-  // perform the search.
-  bool TargetIsWithinSearchRegion() const;
-
-  // Do we have enough data to perform one round of WSOLA?
-  bool CanPerformWsola() const;
-
-  // Converts a time in milliseconds to frames using |samples_per_second_|.
-  int ConvertMillisecondsToFrames(int ms) const;
-
-  // Number of channels in audio stream.
-  int channels_;
-
-  // Sample rate of audio stream.
-  int samples_per_second_;
-
-  // Buffered audio data.
-  AudioBufferQueue audio_buffer_;
-
-  // If muted, keep track of partial frames that should have been skipped over.
-  double muted_partial_frame_;
-
-  // How many frames to have in the queue before we report the queue is full.
-  int capacity_;
-
-  // Book keeping of the current time of generated audio, in frames. This
-  // should be appropriately updated when out samples are generated, regardless
-  // of whether we push samples out when FillBuffer() is called or we store
-  // audio in |wsola_output_| for the subsequent calls to FillBuffer().
-  // Furthermore, if samples from |audio_buffer_| are evicted then this
-  // member variable should be updated based on |playback_rate_|.
-  // Note that this member should be updated ONLY by calling UpdateOutputTime(),
-  // so that |search_block_index_| is update accordingly.
-  double output_time_;
-
-  // The offset of the center frame of |search_block_| w.r.t. its first frame.
-  int search_block_center_offset_;
-
-  // Index of the beginning of the |search_block_|, in frames.
-  int search_block_index_;
-
-  // Number of Blocks to search to find the most similar one to the target
-  // frame.
-  int num_candidate_blocks_;
-
-  // Index of the beginning of the target block, counted in frames.
-  int target_block_index_;
-
-  // Overlap-and-add window size in frames.
-  int ola_window_size_;
-
-  // The hop size of overlap-and-add in frames. This implementation assumes 50%
-  // overlap-and-add.
-  int ola_hop_size_;
-
-  // Number of frames in |wsola_output_| that overlap-and-add is completed for
-  // them and can be copied to output if FillBuffer() is called. It also
-  // specifies the index where the next WSOLA window has to overlap-and-add.
-  int num_complete_frames_;
-
-  // This stores a part of the output that is created but couldn't be rendered.
-  // Output is generated frame-by-frame which at some point might exceed the
-  // number of requested samples. Furthermore, due to overlap-and-add,
-  // the last half-window of the output is incomplete, which is stored in this
-  // buffer.
-  std::unique_ptr<AudioBus> wsola_output_;
-
-  // Overlap-and-add window.
-  std::unique_ptr<float[]> ola_window_;
-
-  // Transition window, used to update |optimal_block_| by a weighted sum of
-  // |optimal_block_| and |target_block_|.
-  std::unique_ptr<float[]> transition_window_;
-
-  // Auxiliary variables to avoid allocation in every iteration.
-
-  // Stores the optimal block in every iteration. This is the most
-  // similar block to |target_block_| within |search_block_| and it is
-  // overlap-and-added to |wsola_output_|.
-  std::unique_ptr<AudioBus> optimal_block_;
-
-  // A block of data that search is performed over to find the |optimal_block_|.
-  std::unique_ptr<AudioBus> search_block_;
-
-  // Stores the target block, denoted as |target| above. |search_block_| is
-  // searched for a block (|optimal_block_|) that is most similar to
-  // |target_block_|.
-  std::unique_ptr<AudioBus> target_block_;
-
-  // The initial and maximum capacity calculated by Initialize().
-  int initial_capacity_;
-  int max_capacity_;
-
-  DISALLOW_COPY_AND_ASSIGN(AudioRendererAlgorithm);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_AUDIO_RENDERER_ALGORITHM_H_
diff --git a/src/cobalt/media/filters/audio_renderer_algorithm_unittest.cc b/src/cobalt/media/filters/audio_renderer_algorithm_unittest.cc
deleted file mode 100644
index 9fce6c7..0000000
--- a/src/cobalt/media/filters/audio_renderer_algorithm_unittest.cc
+++ /dev/null
@@ -1,681 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// The format of these tests are to enqueue a known amount of data and then
-// request the exact amount we expect in order to dequeue the known amount of
-// data.  This ensures that for any rate we are consuming input data at the
-// correct rate.  We always pass in a very large destination buffer with the
-// expectation that FillBuffer() will fill as much as it can but no more.
-
-#include "cobalt/media/filters/audio_renderer_algorithm.h"
-
-#include <algorithm>  // For std::min().
-#include <cmath>
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/wsola_internals.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-const int kFrameSize = 250;
-const int kSamplesPerSecond = 3000;
-const int kOutputDurationInSec = 10;
-
-static void FillWithSquarePulseTrain(int half_pulse_width, int offset,
-                                     int num_samples, float* data) {
-  ASSERT_GE(offset, 0);
-  ASSERT_LE(offset, num_samples);
-
-  // Fill backward from |offset| - 1 toward zero, starting with -1, alternating
-  // between -1 and 1 every |pulse_width| samples.
-  float pulse = -1.0f;
-  for (int n = offset - 1, k = 0; n >= 0; --n, ++k) {
-    if (k >= half_pulse_width) {
-      pulse = -pulse;
-      k = 0;
-    }
-    data[n] = pulse;
-  }
-
-  // Fill forward from |offset| towards the end, starting with 1, alternating
-  // between 1 and -1 every |pulse_width| samples.
-  pulse = 1.0f;
-  for (int n = offset, k = 0; n < num_samples; ++n, ++k) {
-    if (k >= half_pulse_width) {
-      pulse = -pulse;
-      k = 0;
-    }
-    data[n] = pulse;
-  }
-}
-
-static void FillWithSquarePulseTrain(int half_pulse_width, int offset,
-                                     int channel, AudioBus* audio_bus) {
-  FillWithSquarePulseTrain(half_pulse_width, offset, audio_bus->frames(),
-                           audio_bus->channel(channel));
-}
-
-class AudioRendererAlgorithmTest : public testing::Test {
- public:
-  AudioRendererAlgorithmTest()
-      : frames_enqueued_(0),
-        channels_(0),
-        channel_layout_(CHANNEL_LAYOUT_NONE),
-        sample_format_(kUnknownSampleFormat),
-        samples_per_second_(0),
-        bytes_per_sample_(0) {}
-
-  ~AudioRendererAlgorithmTest() override {}
-
-  void Initialize() {
-    Initialize(CHANNEL_LAYOUT_STEREO, kSampleFormatS16, 3000, 300);
-  }
-
-  void Initialize(ChannelLayout channel_layout, SampleFormat sample_format,
-                  int samples_per_second, int frames_per_buffer) {
-    channels_ = ChannelLayoutToChannelCount(channel_layout);
-    samples_per_second_ = samples_per_second;
-    channel_layout_ = channel_layout;
-    sample_format_ = sample_format;
-    bytes_per_sample_ = SampleFormatToBytesPerChannel(sample_format);
-    AudioParameters params(media::AudioParameters::AUDIO_PCM_LINEAR,
-                           channel_layout, samples_per_second,
-                           bytes_per_sample_ * 8, frames_per_buffer);
-    algorithm_.Initialize(params);
-    FillAlgorithmQueue();
-  }
-
-  void FillAlgorithmQueue() {
-    // The value of the data is meaningless; we just want non-zero data to
-    // differentiate it from muted data.
-    scoped_refptr<AudioBuffer> buffer;
-    while (!algorithm_.IsQueueFull()) {
-      switch (sample_format_) {
-        case kSampleFormatU8:
-          buffer = MakeAudioBuffer<uint8_t>(
-              sample_format_, channel_layout_,
-              ChannelLayoutToChannelCount(channel_layout_), samples_per_second_,
-              1, 1, kFrameSize, kNoTimestamp);
-          break;
-        case kSampleFormatS16:
-          buffer = MakeAudioBuffer<int16_t>(
-              sample_format_, channel_layout_,
-              ChannelLayoutToChannelCount(channel_layout_), samples_per_second_,
-              1, 1, kFrameSize, kNoTimestamp);
-          break;
-        case kSampleFormatS32:
-          buffer = MakeAudioBuffer<int32_t>(
-              sample_format_, channel_layout_,
-              ChannelLayoutToChannelCount(channel_layout_), samples_per_second_,
-              1, 1, kFrameSize, kNoTimestamp);
-          break;
-        default:
-          NOTREACHED() << "Unrecognized format " << sample_format_;
-      }
-      algorithm_.EnqueueBuffer(buffer);
-      frames_enqueued_ += kFrameSize;
-    }
-  }
-
-  bool VerifyAudioData(AudioBus* bus, int offset, int frames, float value) {
-    for (int ch = 0; ch < bus->channels(); ++ch) {
-      for (int i = offset; i < offset + frames; ++i) {
-        if (bus->channel(ch)[i] != value) return false;
-      }
-    }
-    return true;
-  }
-
-  bool AudioDataIsMuted(AudioBus* audio_data, int frames_written) {
-    return VerifyAudioData(audio_data, 0, frames_written, 0);
-  }
-
-  int ComputeConsumedFrames(int initial_frames_enqueued,
-                            int initial_frames_buffered) {
-    int frame_delta = frames_enqueued_ - initial_frames_enqueued;
-    int buffered_delta = algorithm_.frames_buffered() - initial_frames_buffered;
-    int consumed = frame_delta - buffered_delta;
-    CHECK_GE(consumed, 0);
-    return consumed;
-  }
-
-  void TestPlaybackRate(double playback_rate) {
-    const int kDefaultBufferSize = algorithm_.samples_per_second() / 100;
-    const int kDefaultFramesRequested =
-        kOutputDurationInSec * algorithm_.samples_per_second();
-
-    TestPlaybackRate(playback_rate, kDefaultBufferSize,
-                     kDefaultFramesRequested);
-  }
-
-  void TestPlaybackRate(double playback_rate, int buffer_size_in_frames,
-                        int total_frames_requested) {
-    int initial_frames_enqueued = frames_enqueued_;
-    int initial_frames_buffered = algorithm_.frames_buffered();
-
-    std::unique_ptr<AudioBus> bus =
-        AudioBus::Create(channels_, buffer_size_in_frames);
-    if (playback_rate == 0.0) {
-      int frames_written = algorithm_.FillBuffer(
-          bus.get(), 0, buffer_size_in_frames, playback_rate);
-      EXPECT_EQ(0, frames_written);
-      return;
-    }
-
-    bool expect_muted = (playback_rate < 0.5 || playback_rate > 4);
-
-    int frames_remaining = total_frames_requested;
-    bool first_fill_buffer = true;
-    while (frames_remaining > 0) {
-      int frames_requested = std::min(buffer_size_in_frames, frames_remaining);
-      int frames_written =
-          algorithm_.FillBuffer(bus.get(), 0, frames_requested, playback_rate);
-      ASSERT_GT(frames_written, 0) << "Requested: " << frames_requested
-                                   << ", playing at " << playback_rate;
-
-      // Do not check data if it is first pull out and only one frame written.
-      // The very first frame out of WSOLA is always zero because of
-      // overlap-and-add window, which is zero for the first sample. Therefore,
-      // if at very first buffer-fill only one frame is written, that is zero
-      // which might cause exception in CheckFakeData().
-      if (!first_fill_buffer || frames_written > 1)
-        ASSERT_EQ(expect_muted, AudioDataIsMuted(bus.get(), frames_written));
-      first_fill_buffer = false;
-      frames_remaining -= frames_written;
-
-      FillAlgorithmQueue();
-    }
-
-    EXPECT_EQ(algorithm_.frames_buffered() * channels_ * sizeof(float),
-              static_cast<size_t>(algorithm_.GetMemoryUsage()));
-
-    int frames_consumed =
-        ComputeConsumedFrames(initial_frames_enqueued, initial_frames_buffered);
-
-    // If playing back at normal speed, we should always get back the same
-    // number of bytes requested.
-    if (playback_rate == 1.0) {
-      EXPECT_EQ(total_frames_requested, frames_consumed);
-      return;
-    }
-
-    // Otherwise, allow |kMaxAcceptableDelta| difference between the target and
-    // actual playback rate.
-    // When |kSamplesPerSecond| and |total_frames_requested| are reasonably
-    // large, one can expect less than a 1% difference in most cases. In our
-    // current implementation, sped up playback is less accurate than slowed
-    // down playback, and for playback_rate > 1, playback rate generally gets
-    // less and less accurate the farther it drifts from 1 (though this is
-    // nonlinear).
-    double actual_playback_rate =
-        1.0 * frames_consumed / total_frames_requested;
-    EXPECT_NEAR(playback_rate, actual_playback_rate, playback_rate / 100.0);
-  }
-
-  void WsolaTest(double playback_rate) {
-    const int kSampleRateHz = 48000;
-    const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO;
-    const int kBytesPerSample = 2;
-    const int kNumFrames = kSampleRateHz / 100;  // 10 milliseconds.
-
-    channels_ = ChannelLayoutToChannelCount(kChannelLayout);
-    AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout,
-                           kSampleRateHz, kBytesPerSample * 8, kNumFrames);
-    algorithm_.Initialize(params);
-
-    // A pulse is 6 milliseconds (even number of samples).
-    const int kPulseWidthSamples = 6 * kSampleRateHz / 1000;
-    const int kHalfPulseWidthSamples = kPulseWidthSamples / 2;
-
-    // For the ease of implementation get 1 frame every call to FillBuffer().
-    std::unique_ptr<AudioBus> output = AudioBus::Create(channels_, 1);
-
-    // Input buffer to inject pulses.
-    scoped_refptr<AudioBuffer> input =
-        AudioBuffer::CreateBuffer(kSampleFormatPlanarF32, kChannelLayout,
-                                  channels_, kSampleRateHz, kPulseWidthSamples);
-
-    const std::vector<uint8_t*>& channel_data = input->channel_data();
-
-    // Fill |input| channels.
-    FillWithSquarePulseTrain(kHalfPulseWidthSamples, 0, kPulseWidthSamples,
-                             reinterpret_cast<float*>(channel_data[0]));
-    FillWithSquarePulseTrain(kHalfPulseWidthSamples, kHalfPulseWidthSamples,
-                             kPulseWidthSamples,
-                             reinterpret_cast<float*>(channel_data[1]));
-
-    // A buffer for the output until a complete pulse is created. Then
-    // reference pulse is compared with this buffer.
-    std::unique_ptr<AudioBus> pulse_buffer =
-        AudioBus::Create(channels_, kPulseWidthSamples);
-
-    const float kTolerance = 0.000001f;
-    // Equivalent of 4 seconds.
-    const int kNumRequestedPulses = kSampleRateHz * 4 / kPulseWidthSamples;
-    for (int n = 0; n < kNumRequestedPulses; ++n) {
-      int num_buffered_frames = 0;
-      while (num_buffered_frames < kPulseWidthSamples) {
-        int num_samples =
-            algorithm_.FillBuffer(output.get(), 0, 1, playback_rate);
-        ASSERT_LE(num_samples, 1);
-        if (num_samples > 0) {
-          output->CopyPartialFramesTo(0, num_samples, num_buffered_frames,
-                                      pulse_buffer.get());
-          num_buffered_frames++;
-        } else {
-          algorithm_.EnqueueBuffer(input);
-        }
-      }
-
-      // Pulses in the first half of WSOLA AOL frame are not constructed
-      // perfectly. Do not check them.
-      if (n > 3) {
-        for (int m = 0; m < channels_; ++m) {
-          const float* pulse_ch = pulse_buffer->channel(m);
-
-          // Because of overlap-and-add we might have round off error.
-          for (int k = 0; k < kPulseWidthSamples; ++k) {
-            ASSERT_NEAR(reinterpret_cast<float*>(channel_data[m])[k],
-                        pulse_ch[k], kTolerance)
-                << " loop " << n << " channel/sample " << m << "/" << k;
-          }
-        }
-      }
-
-      // Zero out the buffer to be sure the next comparison is relevant.
-      pulse_buffer->Zero();
-    }
-  }
-
- protected:
-  AudioRendererAlgorithm algorithm_;
-  int frames_enqueued_;
-  int channels_;
-  ChannelLayout channel_layout_;
-  SampleFormat sample_format_;
-  int samples_per_second_;
-  int bytes_per_sample_;
-};
-
-TEST_F(AudioRendererAlgorithmTest, InitializeWithLargeParameters) {
-  const int kBufferSize = 0.5 * kSamplesPerSecond;
-  Initialize(CHANNEL_LAYOUT_MONO, kSampleFormatU8, kSamplesPerSecond,
-             kBufferSize);
-  EXPECT_LT(kBufferSize, algorithm_.QueueCapacity());
-  algorithm_.FlushBuffers();
-  EXPECT_LT(kBufferSize, algorithm_.QueueCapacity());
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_NormalRate) {
-  Initialize();
-  TestPlaybackRate(1.0);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_NearlyNormalFasterRate) {
-  Initialize();
-  TestPlaybackRate(1.0001);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_NearlyNormalSlowerRate) {
-  Initialize();
-  TestPlaybackRate(0.9999);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_OneAndAQuarterRate) {
-  Initialize();
-  TestPlaybackRate(1.25);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_OneAndAHalfRate) {
-  Initialize();
-  TestPlaybackRate(1.5);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_DoubleRate) {
-  Initialize();
-  TestPlaybackRate(2.0);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_EightTimesRate) {
-  Initialize();
-  TestPlaybackRate(8.0);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_ThreeQuartersRate) {
-  Initialize();
-  TestPlaybackRate(0.75);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_HalfRate) {
-  Initialize();
-  TestPlaybackRate(0.5);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_QuarterRate) {
-  Initialize();
-  TestPlaybackRate(0.25);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_Pause) {
-  Initialize();
-  TestPlaybackRate(0.0);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_SlowDown) {
-  Initialize();
-  TestPlaybackRate(4.5);
-  TestPlaybackRate(3.0);
-  TestPlaybackRate(2.0);
-  TestPlaybackRate(1.0);
-  TestPlaybackRate(0.5);
-  TestPlaybackRate(0.25);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_SpeedUp) {
-  Initialize();
-  TestPlaybackRate(0.25);
-  TestPlaybackRate(0.5);
-  TestPlaybackRate(1.0);
-  TestPlaybackRate(2.0);
-  TestPlaybackRate(3.0);
-  TestPlaybackRate(4.5);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_JumpAroundSpeeds) {
-  Initialize();
-  TestPlaybackRate(2.1);
-  TestPlaybackRate(0.9);
-  TestPlaybackRate(0.6);
-  TestPlaybackRate(1.4);
-  TestPlaybackRate(0.3);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_SmallBufferSize) {
-  Initialize();
-  static const int kBufferSizeInFrames = 1;
-  static const int kFramesRequested = kOutputDurationInSec * kSamplesPerSecond;
-  TestPlaybackRate(1.0, kBufferSizeInFrames, kFramesRequested);
-  TestPlaybackRate(0.5, kBufferSizeInFrames, kFramesRequested);
-  TestPlaybackRate(1.5, kBufferSizeInFrames, kFramesRequested);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_LargeBufferSize) {
-  Initialize(CHANNEL_LAYOUT_STEREO, kSampleFormatS16, 44100, 441);
-  TestPlaybackRate(1.0);
-  TestPlaybackRate(0.5);
-  TestPlaybackRate(1.5);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_LowerQualityAudio) {
-  Initialize(CHANNEL_LAYOUT_MONO, kSampleFormatU8, kSamplesPerSecond,
-             kSamplesPerSecond / 100);
-  TestPlaybackRate(1.0);
-  TestPlaybackRate(0.5);
-  TestPlaybackRate(1.5);
-}
-
-TEST_F(AudioRendererAlgorithmTest, FillBuffer_HigherQualityAudio) {
-  Initialize(CHANNEL_LAYOUT_STEREO, kSampleFormatS32, kSamplesPerSecond,
-             kSamplesPerSecond / 100);
-  TestPlaybackRate(1.0);
-  TestPlaybackRate(0.5);
-  TestPlaybackRate(1.5);
-}
-
-TEST_F(AudioRendererAlgorithmTest, DotProduct) {
-  const int kChannels = 3;
-  const int kFrames = 20;
-  const int kHalfPulseWidth = 2;
-
-  std::unique_ptr<AudioBus> a = AudioBus::Create(kChannels, kFrames);
-  std::unique_ptr<AudioBus> b = AudioBus::Create(kChannels, kFrames);
-
-  std::unique_ptr<float[]> dot_prod(new float[kChannels]);
-
-  FillWithSquarePulseTrain(kHalfPulseWidth, 0, 0, a.get());
-  FillWithSquarePulseTrain(kHalfPulseWidth, 1, 1, a.get());
-  FillWithSquarePulseTrain(kHalfPulseWidth, 2, 2, a.get());
-
-  FillWithSquarePulseTrain(kHalfPulseWidth, 0, 0, b.get());
-  FillWithSquarePulseTrain(kHalfPulseWidth, 0, 1, b.get());
-  FillWithSquarePulseTrain(kHalfPulseWidth, 0, 2, b.get());
-
-  internal::MultiChannelDotProduct(a.get(), 0, b.get(), 0, kFrames,
-                                   dot_prod.get());
-
-  EXPECT_FLOAT_EQ(kFrames, dot_prod[0]);
-  EXPECT_FLOAT_EQ(0, dot_prod[1]);
-  EXPECT_FLOAT_EQ(-kFrames, dot_prod[2]);
-
-  internal::MultiChannelDotProduct(a.get(), 4, b.get(), 8, kFrames / 2,
-                                   dot_prod.get());
-
-  EXPECT_FLOAT_EQ(kFrames / 2, dot_prod[0]);
-  EXPECT_FLOAT_EQ(0, dot_prod[1]);
-  EXPECT_FLOAT_EQ(-kFrames / 2, dot_prod[2]);
-}
-
-TEST_F(AudioRendererAlgorithmTest, MovingBlockEnergy) {
-  const int kChannels = 2;
-  const int kFrames = 20;
-  const int kFramesPerBlock = 3;
-  const int kNumBlocks = kFrames - (kFramesPerBlock - 1);
-  std::unique_ptr<AudioBus> a = AudioBus::Create(kChannels, kFrames);
-  std::unique_ptr<float[]> energies(new float[kChannels * kNumBlocks]);
-  float* ch_left = a->channel(0);
-  float* ch_right = a->channel(1);
-
-  // Fill up both channels.
-  for (int n = 0; n < kFrames; ++n) {
-    ch_left[n] = n;
-    ch_right[n] = kFrames - 1 - n;
-  }
-
-  internal::MultiChannelMovingBlockEnergies(a.get(), kFramesPerBlock,
-                                            energies.get());
-
-  // Check if the energy of candidate blocks of each channel computed correctly.
-  for (int n = 0; n < kNumBlocks; ++n) {
-    float expected_energy = 0;
-    for (int k = 0; k < kFramesPerBlock; ++k)
-      expected_energy += ch_left[n + k] * ch_left[n + k];
-
-    // Left (first) channel.
-    EXPECT_FLOAT_EQ(expected_energy, energies[2 * n]);
-
-    expected_energy = 0;
-    for (int k = 0; k < kFramesPerBlock; ++k)
-      expected_energy += ch_right[n + k] * ch_right[n + k];
-
-    // Second (right) channel.
-    EXPECT_FLOAT_EQ(expected_energy, energies[2 * n + 1]);
-  }
-}
-
-TEST_F(AudioRendererAlgorithmTest, FullAndDecimatedSearch) {
-  const int kFramesInSearchRegion = 12;
-  const int kChannels = 2;
-  float ch_0[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-                  1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f};
-  float ch_1[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-                  0.0f, 0.1f, 1.0f, 0.1f, 0.0f, 0.0f};
-  ASSERT_EQ(sizeof(ch_0), sizeof(ch_1));
-  ASSERT_EQ(static_cast<size_t>(kFramesInSearchRegion),
-            sizeof(ch_0) / sizeof(*ch_0));
-  std::unique_ptr<AudioBus> search_region =
-      AudioBus::Create(kChannels, kFramesInSearchRegion);
-  float* ch = search_region->channel(0);
-  SbMemoryCopy(ch, ch_0, sizeof(float) * kFramesInSearchRegion);
-  ch = search_region->channel(1);
-  SbMemoryCopy(ch, ch_1, sizeof(float) * kFramesInSearchRegion);
-
-  const int kFramePerBlock = 4;
-  float target_0[] = {1.0f, 1.0f, 1.0f, 0.0f};
-  float target_1[] = {0.0f, 1.0f, 0.1f, 1.0f};
-  ASSERT_EQ(sizeof(target_0), sizeof(target_1));
-  ASSERT_EQ(static_cast<size_t>(kFramePerBlock),
-            sizeof(target_0) / sizeof(*target_0));
-
-  std::unique_ptr<AudioBus> target =
-      AudioBus::Create(kChannels, kFramePerBlock);
-  ch = target->channel(0);
-  SbMemoryCopy(ch, target_0, sizeof(float) * kFramePerBlock);
-  ch = target->channel(1);
-  SbMemoryCopy(ch, target_1, sizeof(float) * kFramePerBlock);
-
-  std::unique_ptr<float[]> energy_target(new float[kChannels]);
-
-  internal::MultiChannelDotProduct(target.get(), 0, target.get(), 0,
-                                   kFramePerBlock, energy_target.get());
-
-  ASSERT_EQ(3.f, energy_target[0]);
-  ASSERT_EQ(2.01f, energy_target[1]);
-
-  const int kNumCandidBlocks = kFramesInSearchRegion - (kFramePerBlock - 1);
-  std::unique_ptr<float[]> energy_candid_blocks(
-      new float[kNumCandidBlocks * kChannels]);
-
-  internal::MultiChannelMovingBlockEnergies(search_region.get(), kFramePerBlock,
-                                            energy_candid_blocks.get());
-
-  // Check the energy of the candidate blocks of the first channel.
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[0]);
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[2]);
-  ASSERT_FLOAT_EQ(1, energy_candid_blocks[4]);
-  ASSERT_FLOAT_EQ(2, energy_candid_blocks[6]);
-  ASSERT_FLOAT_EQ(3, energy_candid_blocks[8]);
-  ASSERT_FLOAT_EQ(3, energy_candid_blocks[10]);
-  ASSERT_FLOAT_EQ(2, energy_candid_blocks[12]);
-  ASSERT_FLOAT_EQ(1, energy_candid_blocks[14]);
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[16]);
-
-  // Check the energy of the candidate blocks of the second channel.
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[1]);
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[3]);
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[5]);
-  ASSERT_FLOAT_EQ(0, energy_candid_blocks[7]);
-  ASSERT_FLOAT_EQ(0.01f, energy_candid_blocks[9]);
-  ASSERT_FLOAT_EQ(1.01f, energy_candid_blocks[11]);
-  ASSERT_FLOAT_EQ(1.02f, energy_candid_blocks[13]);
-  ASSERT_FLOAT_EQ(1.02f, energy_candid_blocks[15]);
-  ASSERT_FLOAT_EQ(1.01f, energy_candid_blocks[17]);
-
-  // An interval which is of no effect.
-  internal::Interval exclude_interval = std::make_pair(-100, -10);
-  EXPECT_EQ(
-      5, internal::FullSearch(0, kNumCandidBlocks - 1, exclude_interval,
-                              target.get(), search_region.get(),
-                              energy_target.get(), energy_candid_blocks.get()));
-
-  // Exclude the the best match.
-  exclude_interval = std::make_pair(2, 5);
-  EXPECT_EQ(
-      7, internal::FullSearch(0, kNumCandidBlocks - 1, exclude_interval,
-                              target.get(), search_region.get(),
-                              energy_target.get(), energy_candid_blocks.get()));
-
-  // An interval which is of no effect.
-  exclude_interval = std::make_pair(-100, -10);
-  EXPECT_EQ(4, internal::DecimatedSearch(
-                   4, exclude_interval, target.get(), search_region.get(),
-                   energy_target.get(), energy_candid_blocks.get()));
-
-  EXPECT_EQ(5, internal::OptimalIndex(search_region.get(), target.get(),
-                                      exclude_interval));
-}
-
-TEST_F(AudioRendererAlgorithmTest, QuadraticInterpolation) {
-  // Arbitrary coefficients.
-  const float kA = 0.7f;
-  const float kB = 1.2f;
-  const float kC = 0.8f;
-
-  float y_values[3];
-  y_values[0] = kA - kB + kC;
-  y_values[1] = kC;
-  y_values[2] = kA + kB + kC;
-
-  float extremum;
-  float extremum_value;
-
-  internal::QuadraticInterpolation(y_values, &extremum, &extremum_value);
-
-  float x_star = -kB / (2.f * kA);
-  float y_star = kA * x_star * x_star + kB * x_star + kC;
-
-  EXPECT_FLOAT_EQ(x_star, extremum);
-  EXPECT_FLOAT_EQ(y_star, extremum_value);
-}
-
-TEST_F(AudioRendererAlgorithmTest, QuadraticInterpolation_Colinear) {
-  float y_values[3];
-  y_values[0] = 1.0;
-  y_values[1] = 1.0;
-  y_values[2] = 1.0;
-
-  float extremum;
-  float extremum_value;
-
-  internal::QuadraticInterpolation(y_values, &extremum, &extremum_value);
-
-  EXPECT_FLOAT_EQ(extremum, 0.0);
-  EXPECT_FLOAT_EQ(extremum_value, 1.0);
-}
-
-TEST_F(AudioRendererAlgorithmTest, WsolaSlowdown) { WsolaTest(0.6); }
-
-TEST_F(AudioRendererAlgorithmTest, WsolaSpeedup) { WsolaTest(1.6); }
-
-TEST_F(AudioRendererAlgorithmTest, FillBufferOffset) {
-  Initialize();
-
-  std::unique_ptr<AudioBus> bus = AudioBus::Create(channels_, kFrameSize);
-
-  // Verify that the first half of |bus| remains zero and the last half is
-  // filled appropriately at normal, above normal, below normal, and muted
-  // rates.
-  const int kHalfSize = kFrameSize / 2;
-  const float kAudibleRates[] = {1.0f, 2.0f, 0.5f};
-  for (size_t i = 0; i < arraysize(kAudibleRates); ++i) {
-    SCOPED_TRACE(kAudibleRates[i]);
-    bus->Zero();
-
-    const int frames_filled = algorithm_.FillBuffer(
-        bus.get(), kHalfSize, kHalfSize, kAudibleRates[i]);
-    ASSERT_EQ(kHalfSize, frames_filled);
-    ASSERT_TRUE(VerifyAudioData(bus.get(), 0, kHalfSize, 0));
-    ASSERT_FALSE(VerifyAudioData(bus.get(), kHalfSize, kHalfSize, 0));
-    FillAlgorithmQueue();
-  }
-
-  const float kMutedRates[] = {5.0f, 0.25f};
-  for (size_t i = 0; i < arraysize(kMutedRates); ++i) {
-    SCOPED_TRACE(kMutedRates[i]);
-    for (int ch = 0; ch < bus->channels(); ++ch)
-      std::fill(bus->channel(ch), bus->channel(ch) + bus->frames(), 1.0f);
-
-    const int frames_filled =
-        algorithm_.FillBuffer(bus.get(), kHalfSize, kHalfSize, kMutedRates[i]);
-    ASSERT_EQ(kHalfSize, frames_filled);
-    ASSERT_FALSE(VerifyAudioData(bus.get(), 0, kHalfSize, 0));
-    ASSERT_TRUE(VerifyAudioData(bus.get(), kHalfSize, kHalfSize, 0));
-    FillAlgorithmQueue();
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_timestamp_validator.cc b/src/cobalt/media/filters/audio_timestamp_validator.cc
deleted file mode 100644
index d8b4102..0000000
--- a/src/cobalt/media/filters/audio_timestamp_validator.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_timestamp_validator.h"
-
-namespace cobalt {
-namespace media {
-
-// Defines how many milliseconds of DecoderBuffer timestamp gap will be allowed
-// before warning the user. See CheckForTimestampGap(). Value of 50 chosen, as
-// this is low enough to catch issues early, but high enough to avoid noise for
-// containers like WebM that default to low granularity timestamp precision.
-const int kGapWarningThresholdMsec = 50;
-
-// Limits the number of adjustments to |audio_ts_offset_| in order to reach a
-// stable state where gaps between encoded timestamps match decoded output
-// intervals. See CheckForTimestampGap().
-const int kLimitTriesForStableTiming = 5;
-
-// Limits the milliseconds of difference between expected and actual timestamps
-// gaps to consider timestamp expectations "stable". 1 chosen because some
-// containers (WebM) default to millisecond timestamp precision. See
-// CheckForTimestampGap().
-const int kStableTimeGapThrsholdMsec = 1;
-
-AudioTimestampValidator::AudioTimestampValidator(
-    const AudioDecoderConfig& decoder_config,
-    const scoped_refptr<MediaLog>& media_log)
-    : has_codec_delay_(decoder_config.codec_delay() > 0),
-      media_log_(media_log),
-      audio_base_ts_(kNoTimestamp),
-      reached_stable_state_(false),
-      num_unstable_audio_tries_(0),
-      limit_unstable_audio_tries_(kLimitTriesForStableTiming),
-      drift_warning_threshold_msec_(kGapWarningThresholdMsec) {
-  DCHECK(decoder_config.IsValidConfig());
-}
-
-AudioTimestampValidator::~AudioTimestampValidator() {}
-
-void AudioTimestampValidator::CheckForTimestampGap(
-    const scoped_refptr<DecoderBuffer>& buffer) {
-  if (buffer->end_of_stream()) return;
-  DCHECK_NE(kNoTimestamp, buffer->timestamp());
-
-  // If audio_base_ts_ == kNoTimestamp, we are processing our first buffer.
-  // If stream has neither codec delay nor discard padding, we should expect
-  // timestamps and output durations to line up from the start (i.e. be stable).
-  if (audio_base_ts_ == kNoTimestamp && !has_codec_delay_ &&
-      buffer->discard_padding().first == base::TimeDelta() &&
-      buffer->discard_padding().second == base::TimeDelta()) {
-    DVLOG(3) << __func__ << " Expecting stable timestamps - stream has neither "
-             << "codec delay nor discard padding.";
-    limit_unstable_audio_tries_ = 0;
-  }
-
-  // Don't continue checking timestamps if we've exhausted tries to reach stable
-  // state. This suggests the media's encoded timestamps are way off.
-  if (num_unstable_audio_tries_ > limit_unstable_audio_tries_) return;
-
-  // Keep resetting encode base ts until we start getting decode output. Some
-  // codecs/containers (e.g. chained Ogg) will take several encoded buffers
-  // before producing the first decoded output.
-  if (!audio_output_ts_helper_) {
-    audio_base_ts_ = buffer->timestamp();
-    DVLOG(3) << __func__
-             << " setting audio_base:" << audio_base_ts_.InMicroseconds();
-    return;
-  }
-
-  base::TimeDelta expected_ts = audio_output_ts_helper_->GetTimestamp();
-  base::TimeDelta ts_delta = buffer->timestamp() - expected_ts;
-
-  // Reconciling encoded buffer timestamps with decoded output often requires
-  // adjusting expectations by some offset. This accounts for varied (and at
-  // this point unknown) handling of front trimming and codec delay. Codec delay
-  // and skip trimming may or may not be accounted for in the encoded timestamps
-  // depending on the codec (e.g. MP3 vs Opus) and  demuxers used (e.g. FFmpeg
-  // vs MSE stream parsers).
-  if (!reached_stable_state_) {
-    if (std::abs(ts_delta.InMilliseconds()) < kStableTimeGapThrsholdMsec) {
-      reached_stable_state_ = true;
-      DVLOG(3) << __func__ << " stabilized! tries:" << num_unstable_audio_tries_
-               << " offset:"
-               << audio_output_ts_helper_->base_timestamp().InMicroseconds();
-    } else {
-      base::TimeDelta orig_offset = audio_output_ts_helper_->base_timestamp();
-
-      // Save since this gets reset when we set new base time.
-      int64_t decoded_frame_count = audio_output_ts_helper_->frame_count();
-      audio_output_ts_helper_->SetBaseTimestamp(orig_offset + ts_delta);
-      audio_output_ts_helper_->AddFrames(decoded_frame_count);
-
-      DVLOG(3) << __func__
-               << " NOT stabilized. tries:" << num_unstable_audio_tries_
-               << " offset was:" << orig_offset.InMicroseconds() << " now:"
-               << audio_output_ts_helper_->base_timestamp().InMicroseconds();
-      num_unstable_audio_tries_++;
-
-      // Let developers know if their files timestamps are way off from
-      if (num_unstable_audio_tries_ > limit_unstable_audio_tries_) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Failed to reconcile encoded audio times with decoded output.";
-      }
-    }
-
-    // Don't bother with further checking until we reach stable state.
-    return;
-  }
-
-  if (std::abs(ts_delta.InMilliseconds()) > drift_warning_threshold_msec_) {
-    MEDIA_LOG(ERROR, media_log_)
-        << " Large timestamp gap detected; may cause AV sync to drift."
-        << " time:" << buffer->timestamp().InMicroseconds() << "us"
-        << " expected:" << expected_ts.InMicroseconds() << "us"
-        << " delta:" << ts_delta.InMicroseconds() << "us";
-    // Increase threshold to avoid log spam but, let us know if gap widens.
-    drift_warning_threshold_msec_ = std::abs(ts_delta.InMilliseconds());
-  }
-  DVLOG(3) << __func__ << " delta:" << ts_delta.InMicroseconds()
-           << " expected_ts:" << expected_ts.InMicroseconds()
-           << " actual_ts:" << buffer->timestamp().InMicroseconds()
-           << " audio_ts_offset:"
-           << audio_output_ts_helper_->base_timestamp().InMicroseconds();
-}
-
-void AudioTimestampValidator::RecordOutputDuration(
-    const scoped_refptr<AudioBuffer>& audio_buffer) {
-  if (!audio_output_ts_helper_) {
-    DCHECK_NE(audio_base_ts_, kNoTimestamp);
-    // SUBTLE: deliberately creating this with output buffer sample rate because
-    // demuxer stream config is potentially stale for implicit AAC.
-    audio_output_ts_helper_.reset(
-        new AudioTimestampHelper(audio_buffer->sample_rate()));
-    audio_output_ts_helper_->SetBaseTimestamp(audio_base_ts_);
-  }
-
-  DVLOG(3) << __func__ << " " << audio_buffer->frame_count() << " frames";
-  audio_output_ts_helper_->AddFrames(audio_buffer->frame_count());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/audio_timestamp_validator.h b/src/cobalt/media/filters/audio_timestamp_validator.h
deleted file mode 100644
index 33609d5..0000000
--- a/src/cobalt/media/filters/audio_timestamp_validator.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_AUDIO_TIMESTAMP_VALIDATOR_H_
-#define COBALT_MEDIA_FILTERS_AUDIO_TIMESTAMP_VALIDATOR_H_
-
-#include "base/memory/ref_counted.h"
-#include "base/time.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/timestamp_constants.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT AudioTimestampValidator {
- public:
-  AudioTimestampValidator(const AudioDecoderConfig& decoder_config,
-                          const scoped_refptr<MediaLog>& media_log);
-  ~AudioTimestampValidator();
-
-  // These methods monitor DecoderBuffer timestamps for gaps for the purpose of
-  // warning developers when gaps may cause AV sync drift. A DecoderBuffer's
-  // timestamp should roughly equal the timestamp of the previous buffer offset
-  // by the previous buffer's duration.
-  void CheckForTimestampGap(const scoped_refptr<DecoderBuffer>& buffer);
-  void RecordOutputDuration(const scoped_refptr<AudioBuffer>& buffer);
-
- private:
-  bool has_codec_delay_;
-  scoped_refptr<MediaLog> media_log_;
-
-  // Accumulates time from decoded audio frames. We adjust the base timestamp as
-  // needed for the first few buffers (stabilization period) of decoded output
-  // to account for pre-skip and codec delay. See CheckForTimestampGap().
-  std::unique_ptr<AudioTimestampHelper> audio_output_ts_helper_;
-
-  base::TimeDelta audio_base_ts_;
-
-  // Initially false, set to true when we observe gap between encoded timestamps
-  // match gap between output decoder buffers.
-  bool reached_stable_state_;
-
-  // Counts attempts to adjust |audio_output_ts_helper_| base offset in effort
-  // to form expectation for encoded timestamps based on decoded output. Give up
-  // making adjustments when count exceeds |limit_unstable_audio_tries_|.
-  int num_unstable_audio_tries_;
-
-  // Limits the number of attempts to stabilize audio timestamp expectations.
-  int limit_unstable_audio_tries_;
-
-  // How many milliseconds can DecoderBuffer timestamps differ from expectations
-  // before we MEDIA_LOG warn developers. Threshold initially set from
-  // kGapWarningThresholdMsec. Once hit, the threshold is increased by
-  // the detected gap amount. This avoids log spam while still emitting
-  // logs if things get worse. See CheckTimestampForGap().
-  uint32_t drift_warning_threshold_msec_;
-
-  DISALLOW_COPY_AND_ASSIGN(AudioTimestampValidator);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_AUDIO_TIMESTAMP_VALIDATOR_H_
diff --git a/src/cobalt/media/filters/audio_timestamp_validator_unittest.cc b/src/cobalt/media/filters/audio_timestamp_validator_unittest.cc
deleted file mode 100644
index 836187d..0000000
--- a/src/cobalt/media/filters/audio_timestamp_validator_unittest.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/audio_timestamp_validator.h"
-
-#include <tuple>
-
-#include "base/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::HasSubstr;
-
-namespace cobalt {
-namespace media {
-
-// Constants to specify the type of audio data used.
-static const AudioCodec kCodec = kCodecVorbis;
-static const SampleFormat kSampleFormat = kSampleFormatPlanarF32;
-static const base::TimeDelta kSeekPreroll;
-static const int kSamplesPerSecond = 10000;
-static const base::TimeDelta kBufferDuration =
-    base::TimeDelta::FromMilliseconds(20);
-static const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO;
-static const int kChannelCount = 2;
-static const int kChannels = ChannelLayoutToChannelCount(kChannelLayout);
-static const int kFramesPerBuffer = kBufferDuration.InMicroseconds() *
-                                    kSamplesPerSecond /
-                                    base::Time::kMicrosecondsPerSecond;
-
-// Params are:
-// 1. Output delay: number of encoded buffers before first decoded output
-// 2. Codec delay: number of frames of codec delay in decoder config
-// 3. Front discard: front discard for the first buffer
-using ValidatorTestParams = testing::tuple<int, int, base::TimeDelta>;
-
-class AudioTimestampValidatorTest
-    : public testing::Test,
-      public ::testing::WithParamInterface<ValidatorTestParams> {
- public:
-  AudioTimestampValidatorTest()
-      : media_log_(new testing::StrictMock<MockMediaLog>()) {}
-
- protected:
-  void SetUp() override {
-    output_delay_ = testing::get<0>(GetParam());
-    codec_delay_ = testing::get<1>(GetParam());
-    front_discard_ = testing::get<2>(GetParam());
-  }
-
-  int output_delay_;
-
-  int codec_delay_;
-
-  base::TimeDelta front_discard_;
-
-  scoped_refptr<testing::StrictMock<MockMediaLog>> media_log_;
-};
-
-TEST_P(AudioTimestampValidatorTest, WarnForEraticTimes) {
-  AudioDecoderConfig decoder_config;
-  decoder_config.Initialize(kCodec, kSampleFormat, kChannelLayout,
-                            kSamplesPerSecond, EmptyExtraData(), Unencrypted(),
-                            kSeekPreroll, codec_delay_);
-
-  // Validator should fail to stabilize pattern for timestamp expectations.
-  EXPECT_MEDIA_LOG(
-      HasSubstr("Failed to reconcile encoded audio times "
-                "with decoded output."));
-
-  // No gap warnings should be emitted because the timestamps expectations never
-  // stabilized.
-  EXPECT_MEDIA_LOG(HasSubstr("timestamp gap detected")).Times(0);
-
-  AudioTimestampValidator validator(decoder_config, media_log_);
-
-  const base::TimeDelta kRandomOffsets[] = {
-      base::TimeDelta::FromMilliseconds(100),
-      base::TimeDelta::FromMilliseconds(350)};
-
-  for (int i = 0; i < 100; ++i) {
-    // Each buffer's timestamp is kBufferDuration from the previous buffer.
-    scoped_refptr<DecoderBuffer> encoded_buffer = new DecoderBuffer(0);
-
-    // Ping-pong between two random offsets to prevent validator from
-    // stabilizing timestamp pattern.
-    base::TimeDelta randomOffset =
-        kRandomOffsets[i % arraysize(kRandomOffsets)];
-    encoded_buffer->set_timestamp(i * kBufferDuration + randomOffset);
-
-    if (i == 0) {
-      encoded_buffer->set_discard_padding(
-          std::make_pair(front_discard_, base::TimeDelta()));
-    }
-
-    validator.CheckForTimestampGap(encoded_buffer);
-
-    if (i >= output_delay_) {
-      // kFramesPerBuffer is derived to perfectly match kBufferDuration, so
-      // no gaps exists as long as timestamps are exactly kBufferDuration apart.
-      scoped_refptr<AudioBuffer> decoded_buffer = MakeAudioBuffer<float>(
-          kSampleFormat, kChannelLayout, kChannelCount, kSamplesPerSecond, 1.0f,
-          0.0f, kFramesPerBuffer, i * kBufferDuration);
-      validator.RecordOutputDuration(decoded_buffer.get());
-    }
-  }
-}
-
-TEST_P(AudioTimestampValidatorTest, NoWarningForValidTimes) {
-  AudioDecoderConfig decoder_config;
-  decoder_config.Initialize(kCodec, kSampleFormat, kChannelLayout,
-                            kSamplesPerSecond, EmptyExtraData(), Unencrypted(),
-                            kSeekPreroll, codec_delay_);
-
-  // Validator should quickly stabilize pattern for timestamp expectations.
-  EXPECT_MEDIA_LOG(HasSubstr("Failed to reconcile encoded audio times "
-                             "with decoded output."))
-      .Times(0);
-
-  // Expect no gap warnings for series of buffers with valid timestamps.
-  EXPECT_MEDIA_LOG(HasSubstr("timestamp gap detected")).Times(0);
-
-  AudioTimestampValidator validator(decoder_config, media_log_);
-
-  for (int i = 0; i < 100; ++i) {
-    // Each buffer's timestamp is kBufferDuration from the previous buffer.
-    scoped_refptr<DecoderBuffer> encoded_buffer = new DecoderBuffer(0);
-    encoded_buffer->set_timestamp(i * kBufferDuration);
-
-    if (i == 0) {
-      encoded_buffer->set_discard_padding(
-          std::make_pair(front_discard_, base::TimeDelta()));
-    }
-
-    validator.CheckForTimestampGap(encoded_buffer);
-
-    if (i >= output_delay_) {
-      // kFramesPerBuffer is derived to perfectly match kBufferDuration, so
-      // no gaps exists as long as timestamps are exactly kBufferDuration apart.
-      scoped_refptr<AudioBuffer> decoded_buffer = MakeAudioBuffer<float>(
-          kSampleFormat, kChannelLayout, kChannelCount, kSamplesPerSecond, 1.0f,
-          0.0f, kFramesPerBuffer, i * kBufferDuration);
-      validator.RecordOutputDuration(decoded_buffer.get());
-    }
-  }
-}
-
-TEST_P(AudioTimestampValidatorTest, SingleWarnForSingleLargeGap) {
-  AudioDecoderConfig decoder_config;
-  decoder_config.Initialize(kCodec, kSampleFormat, kChannelLayout,
-                            kSamplesPerSecond, EmptyExtraData(), Unencrypted(),
-                            kSeekPreroll, codec_delay_);
-
-  AudioTimestampValidator validator(decoder_config, media_log_);
-
-  // Validator should quickly stabilize pattern for timestamp expectations.
-  EXPECT_MEDIA_LOG(HasSubstr("Failed to reconcile encoded audio times "
-                             "with decoded output."))
-      .Times(0);
-
-  for (int i = 0; i < 100; ++i) {
-    // Halfway through the stream, introduce sudden gap of 50 milliseconds.
-    base::TimeDelta offset;
-    if (i >= 50) offset = base::TimeDelta::FromMilliseconds(100);
-
-    // This gap never widens, so expect only a single warning when its first
-    // introduced.
-    if (i == 50) EXPECT_MEDIA_LOG(HasSubstr("timestamp gap detected"));
-
-    scoped_refptr<DecoderBuffer> encoded_buffer = new DecoderBuffer(0);
-    encoded_buffer->set_timestamp(i * kBufferDuration + offset);
-
-    if (i == 0) {
-      encoded_buffer->set_discard_padding(
-          std::make_pair(front_discard_, base::TimeDelta()));
-    }
-
-    validator.CheckForTimestampGap(encoded_buffer);
-
-    if (i >= output_delay_) {
-      // kFramesPerBuffer is derived to perfectly match kBufferDuration, so
-      // no gaps exists as long as timestamps are exactly kBufferDuration apart.
-      scoped_refptr<AudioBuffer> decoded_buffer = MakeAudioBuffer<float>(
-          kSampleFormat, kChannelLayout, kChannelCount, kSamplesPerSecond, 1.0f,
-          0.0f, kFramesPerBuffer, i * kBufferDuration);
-      validator.RecordOutputDuration(decoded_buffer.get());
-    }
-  }
-}
-
-TEST_P(AudioTimestampValidatorTest, RepeatedWarnForSlowAccumulatingDrift) {
-  AudioDecoderConfig decoder_config;
-  decoder_config.Initialize(kCodec, kSampleFormat, kChannelLayout,
-                            kSamplesPerSecond, EmptyExtraData(), Unencrypted(),
-                            kSeekPreroll, codec_delay_);
-
-  AudioTimestampValidator validator(decoder_config, media_log_);
-
-  EXPECT_MEDIA_LOG(HasSubstr("Failed to reconcile encoded audio times "
-                             "with decoded output."))
-      .Times(0);
-
-  for (int i = 0; i < 100; ++i) {
-    // Wait for delayed output to begin plus an additional two iterations to
-    // start using drift offset. The the two iterations without offset will
-    // allow the validator to stabilize the pattern of timestamps and begin
-    // checking for gaps. Once stable, increase offset by 1 millisecond for each
-    // iteration.
-    base::TimeDelta offset;
-    if (i >= output_delay_ + 2)
-      offset = i * base::TimeDelta::FromMilliseconds(1);
-
-    scoped_refptr<DecoderBuffer> encoded_buffer = new DecoderBuffer(0);
-    encoded_buffer->set_timestamp((i * kBufferDuration) + offset);
-
-    // Expect gap warnings to start when drift hits 50 milliseconds. Warnings
-    // should continue as the gap widens.
-    if (offset > base::TimeDelta::FromMilliseconds(50)) {
-      EXPECT_MEDIA_LOG(HasSubstr("timestamp gap detected"));
-    }
-
-    validator.CheckForTimestampGap(encoded_buffer);
-
-    if (i >= output_delay_) {
-      // kFramesPerBuffer is derived to perfectly match kBufferDuration, so
-      // no gaps exists as long as timestamps are exactly kBufferDuration apart.
-      scoped_refptr<AudioBuffer> decoded_buffer = MakeAudioBuffer<float>(
-          kSampleFormat, kChannelLayout, kChannelCount, kSamplesPerSecond, 1.0f,
-          0.0f, kFramesPerBuffer, i * kBufferDuration);
-      validator.RecordOutputDuration(decoded_buffer.get());
-    }
-  }
-}
-
-// Test with cartesian product of various output delay, codec delay, and front
-// discard values. These simulate configurations for different containers/codecs
-// which present different challenges when building timestamp expectations.
-INSTANTIATE_TEST_CASE_P(
-    , AudioTimestampValidatorTest,
-    ::testing::Combine(
-        ::testing::Values(0, 10),             // output delay
-        ::testing::Values(0, 512),            // codec delay
-        ::testing::Values(base::TimeDelta(),  // front discard
-                          base::TimeDelta::FromMilliseconds(65))));
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/blocking_url_protocol.cc b/src/cobalt/media/filters/blocking_url_protocol.cc
deleted file mode 100644
index f17eeef..0000000
--- a/src/cobalt/media/filters/blocking_url_protocol.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/blocking_url_protocol.h"
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "cobalt/media/base/data_source.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-BlockingUrlProtocol::BlockingUrlProtocol(DataSource* data_source,
-                                         const base::Closure& error_cb)
-    : data_source_(data_source),
-      error_cb_(error_cb),
-      aborted_(base::WaitableEvent::ResetPolicy::MANUAL,
-               base::WaitableEvent::InitialState::NOT_SIGNALED),  // We never
-                                                                  // want to
-                                                                  // reset
-                                                                  // |aborted_|.
-      read_complete_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                     base::WaitableEvent::InitialState::NOT_SIGNALED),
-      last_read_bytes_(0),
-      read_position_(0) {}
-
-BlockingUrlProtocol::~BlockingUrlProtocol() {}
-
-void BlockingUrlProtocol::Abort() { aborted_.Signal(); }
-
-int BlockingUrlProtocol::Read(int size, uint8_t* data) {
-  // Read errors are unrecoverable.
-  if (aborted_.IsSignaled()) return AVERROR(EIO);
-
-  // Even though FFmpeg defines AVERROR_EOF, it's not to be used with I/O
-  // routines. Instead return 0 for any read at or past EOF.
-  int64_t file_size;
-  if (data_source_->GetSize(&file_size) && read_position_ >= file_size)
-    return 0;
-
-  // Blocking read from data source until either:
-  //   1) |last_read_bytes_| is set and |read_complete_| is signalled
-  //   2) |aborted_| is signalled
-  data_source_->Read(read_position_, size, data,
-                     base::Bind(&BlockingUrlProtocol::SignalReadCompleted,
-                                base::Unretained(this)));
-
-  base::WaitableEvent* events[] = {&aborted_, &read_complete_};
-  size_t index = base::WaitableEvent::WaitMany(events, arraysize(events));
-
-  if (events[index] == &aborted_) return AVERROR(EIO);
-
-  if (last_read_bytes_ == DataSource::kReadError) {
-    aborted_.Signal();
-    error_cb_.Run();
-    return AVERROR(EIO);
-  }
-
-  if (last_read_bytes_ == DataSource::kAborted) return AVERROR(EIO);
-
-  read_position_ += last_read_bytes_;
-  return last_read_bytes_;
-}
-
-bool BlockingUrlProtocol::GetPosition(int64_t* position_out) {
-  *position_out = read_position_;
-  return true;
-}
-
-bool BlockingUrlProtocol::SetPosition(int64_t position) {
-  int64_t file_size;
-  if ((data_source_->GetSize(&file_size) && position > file_size) ||
-      position < 0) {
-    return false;
-  }
-
-  read_position_ = position;
-  return true;
-}
-
-bool BlockingUrlProtocol::GetSize(int64_t* size_out) {
-  return data_source_->GetSize(size_out);
-}
-
-bool BlockingUrlProtocol::IsStreaming() { return data_source_->IsStreaming(); }
-
-void BlockingUrlProtocol::SignalReadCompleted(int size) {
-  last_read_bytes_ = size;
-  read_complete_.Signal();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/blocking_url_protocol.h b/src/cobalt/media/filters/blocking_url_protocol.h
deleted file mode 100644
index acb2bdb..0000000
--- a/src/cobalt/media/filters/blocking_url_protocol.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_BLOCKING_URL_PROTOCOL_H_
-#define COBALT_MEDIA_FILTERS_BLOCKING_URL_PROTOCOL_H_
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/synchronization/waitable_event.h"
-#include "cobalt/media/filters/ffmpeg_glue.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class DataSource;
-
-// An implementation of FFmpegURLProtocol that blocks until the underlying
-// asynchronous DataSource::Read() operation completes.
-class MEDIA_EXPORT BlockingUrlProtocol : public FFmpegURLProtocol {
- public:
-  // Implements FFmpegURLProtocol using the given |data_source|. |error_cb| is
-  // fired any time DataSource::Read() returns an error.
-  //
-  // TODO(scherkus): After all blocking operations are isolated on a separate
-  // thread we should be able to eliminate |error_cb|.
-  BlockingUrlProtocol(DataSource* data_source, const base::Closure& error_cb);
-  virtual ~BlockingUrlProtocol();
-
-  // Aborts any pending reads by returning a read error. After this method
-  // returns all subsequent calls to Read() will immediately fail.
-  void Abort();
-
-  // FFmpegURLProtocol implementation.
-  int Read(int size, uint8_t* data) OVERRIDE;
-  bool GetPosition(int64_t* position_out) OVERRIDE;
-  bool SetPosition(int64_t position) OVERRIDE;
-  bool GetSize(int64_t* size_out) OVERRIDE;
-  bool IsStreaming() OVERRIDE;
-
- private:
-  // Sets |last_read_bytes_| and signals the blocked thread that the read
-  // has completed.
-  void SignalReadCompleted(int size);
-
-  DataSource* data_source_;
-  base::Closure error_cb_;
-
-  // Used to unblock the thread during shutdown and when reads complete.
-  base::WaitableEvent aborted_;
-  base::WaitableEvent read_complete_;
-
-  // Cached number of bytes last read from the data source.
-  int last_read_bytes_;
-
-  // Cached position within the data source.
-  int64_t read_position_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(BlockingUrlProtocol);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_BLOCKING_URL_PROTOCOL_H_
diff --git a/src/cobalt/media/filters/blocking_url_protocol_unittest.cc b/src/cobalt/media/filters/blocking_url_protocol_unittest.cc
deleted file mode 100644
index 884a877..0000000
--- a/src/cobalt/media/filters/blocking_url_protocol_unittest.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/synchronization/waitable_event.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "cobalt/media/filters/blocking_url_protocol.h"
-#include "cobalt/media/filters/file_data_source.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class BlockingUrlProtocolTest : public testing::Test {
- public:
-  BlockingUrlProtocolTest()
-      : url_protocol_(&data_source_,
-                      base::Bind(&BlockingUrlProtocolTest::OnDataSourceError,
-                                 base::Unretained(this))) {
-    CHECK(data_source_.Initialize(GetTestDataFilePath("bear-320x240.webm")));
-  }
-
-  virtual ~BlockingUrlProtocolTest() { data_source_.Stop(); }
-
-  MOCK_METHOD0(OnDataSourceError, void());
-
-  FileDataSource data_source_;
-  BlockingUrlProtocol url_protocol_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BlockingUrlProtocolTest);
-};
-
-TEST_F(BlockingUrlProtocolTest, Read) {
-  // Set read head to zero as Initialize() will have parsed a bit of the file.
-  int64_t position = 0;
-  EXPECT_TRUE(url_protocol_.SetPosition(0));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(0, position);
-
-  // Read 32 bytes from offset zero and verify position.
-  uint8_t buffer[32];
-  EXPECT_EQ(32, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(32, position);
-
-  // Read an additional 32 bytes and verify position.
-  EXPECT_EQ(32, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(64, position);
-
-  // Seek to end and read until EOF.
-  int64_t size = 0;
-  EXPECT_TRUE(url_protocol_.GetSize(&size));
-  EXPECT_TRUE(url_protocol_.SetPosition(size - 48));
-  EXPECT_EQ(32, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(size - 16, position);
-
-  EXPECT_EQ(16, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(size, position);
-
-  EXPECT_EQ(0, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(size, position);
-}
-
-TEST_F(BlockingUrlProtocolTest, ReadError) {
-  data_source_.force_read_errors_for_testing();
-
-  uint8_t buffer[32];
-  EXPECT_CALL(*this, OnDataSourceError());
-  EXPECT_EQ(AVERROR(EIO), url_protocol_.Read(32, buffer));
-}
-
-TEST_F(BlockingUrlProtocolTest, GetSetPosition) {
-  int64_t size;
-  int64_t position;
-  EXPECT_TRUE(url_protocol_.GetSize(&size));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-
-  EXPECT_TRUE(url_protocol_.SetPosition(512));
-  EXPECT_FALSE(url_protocol_.SetPosition(size + 1));
-  EXPECT_FALSE(url_protocol_.SetPosition(-1));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(512, position);
-
-  EXPECT_TRUE(url_protocol_.SetPosition(size));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
-  EXPECT_EQ(size, position);
-}
-
-TEST_F(BlockingUrlProtocolTest, GetSize) {
-  int64_t data_source_size = 0;
-  int64_t url_protocol_size = 0;
-  EXPECT_TRUE(data_source_.GetSize(&data_source_size));
-  EXPECT_TRUE(url_protocol_.GetSize(&url_protocol_size));
-  EXPECT_NE(0, data_source_size);
-  EXPECT_EQ(data_source_size, url_protocol_size);
-}
-
-TEST_F(BlockingUrlProtocolTest, IsStreaming) {
-  EXPECT_FALSE(data_source_.IsStreaming());
-  EXPECT_FALSE(url_protocol_.IsStreaming());
-
-  data_source_.force_streaming_for_testing();
-  EXPECT_TRUE(data_source_.IsStreaming());
-  EXPECT_TRUE(url_protocol_.IsStreaming());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/context_3d.h b/src/cobalt/media/filters/context_3d.h
deleted file mode 100644
index a654b30..0000000
--- a/src/cobalt/media/filters/context_3d.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_CONTEXT_3D_H_
-#define COBALT_MEDIA_FILTERS_CONTEXT_3D_H_
-
-class GrContext;
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}
-}
-
-namespace cobalt {
-namespace media {
-
-// This struct can be used to make media use gpu::gles2::GLES2Interface and
-// GrContext.
-// Usage:
-// gpu::gles2::GLES2Interface* gl = ...;
-// GrContext* gr_context = ...;
-// Context3D context_3d(gl, gr_context);
-
-struct Context3D {
-  Context3D() : gl(NULL), gr_context(NULL) {}
-  Context3D(gpu::gles2::GLES2Interface* gl_, class GrContext* gr_context_)
-      : gl(gl_), gr_context(gr_context_) {}
-
-  gpu::gles2::GLES2Interface* gl;
-  class GrContext* gr_context;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_CONTEXT_3D_H_
diff --git a/src/cobalt/media/filters/decoder_selector.cc b/src/cobalt/media/filters/decoder_selector.cc
deleted file mode 100644
index 5750d47..0000000
--- a/src/cobalt/media/filters/decoder_selector.cc
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/decoder_selector.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/audio_decoder.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/video_decoder.h"
-#include "cobalt/media/filters/decoder_stream_traits.h"
-#include "cobalt/media/filters/decrypting_demuxer_stream.h"
-
-#if !defined(OS_ANDROID)
-#include "cobalt/media/filters/decrypting_audio_decoder.h"
-#include "cobalt/media/filters/decrypting_video_decoder.h"
-#endif
-
-namespace cobalt {
-namespace media {
-
-static bool HasValidStreamConfig(DemuxerStream* stream) {
-  switch (stream->type()) {
-    case DemuxerStream::AUDIO:
-      return stream->audio_decoder_config().IsValidConfig();
-    case DemuxerStream::VIDEO:
-      return stream->video_decoder_config().IsValidConfig();
-    case DemuxerStream::UNKNOWN:
-    case DemuxerStream::TEXT:
-    case DemuxerStream::NUM_TYPES:
-      NOTREACHED();
-  }
-  return false;
-}
-
-static bool IsStreamEncrypted(DemuxerStream* stream) {
-  switch (stream->type()) {
-    case DemuxerStream::AUDIO:
-      return stream->audio_decoder_config().is_encrypted();
-    case DemuxerStream::VIDEO:
-      return stream->video_decoder_config().is_encrypted();
-    case DemuxerStream::UNKNOWN:
-    case DemuxerStream::TEXT:
-    case DemuxerStream::NUM_TYPES:
-      NOTREACHED();
-  }
-  return false;
-}
-
-template <DemuxerStream::Type StreamType>
-DecoderSelector<StreamType>::DecoderSelector(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    ScopedVector<Decoder> decoders, const scoped_refptr<MediaLog>& media_log)
-    : task_runner_(task_runner),
-      decoders_(std::move(decoders)),
-      media_log_(media_log),
-      input_stream_(NULL),
-      weak_ptr_factory_(this) {}
-
-template <DemuxerStream::Type StreamType>
-DecoderSelector<StreamType>::~DecoderSelector() {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (!select_decoder_cb_.is_null()) ReturnNullDecoder();
-
-  decoder_.reset();
-  decrypted_stream_.reset();
-}
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::SelectDecoder(
-    StreamTraits* traits, DemuxerStream* stream, CdmContext* cdm_context,
-    const SelectDecoderCB& select_decoder_cb,
-    const typename Decoder::OutputCB& output_cb,
-    const base::Closure& waiting_for_decryption_key_cb) {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(traits);
-  DCHECK(stream);
-  DCHECK(select_decoder_cb_.is_null());
-
-  cdm_context_ = cdm_context;
-  waiting_for_decryption_key_cb_ = waiting_for_decryption_key_cb;
-
-  // Make sure |select_decoder_cb| runs on a different execution stack.
-  select_decoder_cb_ = BindToCurrentLoop(select_decoder_cb);
-
-  if (!HasValidStreamConfig(stream)) {
-    DLOG(ERROR) << "Invalid stream config.";
-    ReturnNullDecoder();
-    return;
-  }
-
-  traits_ = traits;
-  input_stream_ = stream;
-  output_cb_ = output_cb;
-
-  if (!IsStreamEncrypted(input_stream_)) {
-    InitializeDecoder();
-    return;
-  }
-
-  // This could be null during fallback after decoder reinitialization failure.
-  // See DecoderStream<StreamType>::OnDecoderReinitialized().
-  if (!cdm_context_) {
-    ReturnNullDecoder();
-    return;
-  }
-
-#if !defined(OS_ANDROID)
-  InitializeDecryptingDecoder();
-#else
-  InitializeDecryptingDemuxerStream();
-#endif
-}
-
-#if !defined(OS_ANDROID)
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::InitializeDecryptingDecoder() {
-  DVLOG(2) << __func__;
-  decoder_.reset(new typename StreamTraits::DecryptingDecoderType(
-      task_runner_, media_log_, waiting_for_decryption_key_cb_));
-
-  traits_->InitializeDecoder(
-      decoder_.get(), input_stream_, cdm_context_,
-      base::Bind(&DecoderSelector<StreamType>::DecryptingDecoderInitDone,
-                 weak_ptr_factory_.GetWeakPtr()),
-      output_cb_);
-}
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::DecryptingDecoderInitDone(bool success) {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (success) {
-    base::ResetAndReturn(&select_decoder_cb_)
-        .Run(std::move(decoder_), std::unique_ptr<DecryptingDemuxerStream>());
-    return;
-  }
-
-  decoder_.reset();
-
-  // When we get here decrypt-and-decode is not supported. Try to use
-  // DecryptingDemuxerStream to do decrypt-only.
-  InitializeDecryptingDemuxerStream();
-}
-#endif  // !defined(OS_ANDROID)
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::InitializeDecryptingDemuxerStream() {
-  decrypted_stream_.reset(new DecryptingDemuxerStream(
-      task_runner_, media_log_, waiting_for_decryption_key_cb_));
-
-  decrypted_stream_->Initialize(
-      input_stream_, cdm_context_,
-      base::Bind(&DecoderSelector<StreamType>::DecryptingDemuxerStreamInitDone,
-                 weak_ptr_factory_.GetWeakPtr()));
-}
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::DecryptingDemuxerStreamInitDone(
-    PipelineStatus status) {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  // If DecryptingDemuxerStream initialization succeeded, we'll use it to do
-  // decryption and use a decoder to decode the clear stream. Otherwise, we'll
-  // try to see whether any decoder can decrypt-and-decode the encrypted stream
-  // directly. So in both cases, we'll initialize the decoders.
-
-  if (status == PIPELINE_OK) {
-    input_stream_ = decrypted_stream_.get();
-    DCHECK(!IsStreamEncrypted(input_stream_));
-  } else {
-    decrypted_stream_.reset();
-    DCHECK(IsStreamEncrypted(input_stream_));
-  }
-
-  InitializeDecoder();
-}
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::InitializeDecoder() {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(!decoder_);
-
-  if (decoders_.empty()) {
-    ReturnNullDecoder();
-    return;
-  }
-
-  decoder_.reset(decoders_.front());
-  decoders_.weak_erase(decoders_.begin());
-
-  traits_->InitializeDecoder(
-      decoder_.get(), input_stream_, cdm_context_,
-      base::Bind(&DecoderSelector<StreamType>::DecoderInitDone,
-                 weak_ptr_factory_.GetWeakPtr()),
-      output_cb_);
-}
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::DecoderInitDone(bool success) {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (!success) {
-    decoder_.reset();
-    InitializeDecoder();
-    return;
-  }
-
-  base::ResetAndReturn(&select_decoder_cb_)
-      .Run(std::move(decoder_), std::move(decrypted_stream_));
-}
-
-template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::ReturnNullDecoder() {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  base::ResetAndReturn(&select_decoder_cb_)
-      .Run(std::unique_ptr<Decoder>(),
-           std::unique_ptr<DecryptingDemuxerStream>());
-}
-
-// These forward declarations tell the compiler that we will use
-// DecoderSelector with these arguments, allowing us to keep these definitions
-// in our .cc without causing linker errors. This also means if anyone tries to
-// instantiate a DecoderSelector with anything but these two specializations
-// they'll most likely get linker errors.
-template class DecoderSelector<DemuxerStream::AUDIO>;
-template class DecoderSelector<DemuxerStream::VIDEO>;
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/decoder_selector.h b/src/cobalt/media/filters/decoder_selector.h
deleted file mode 100644
index 8916654..0000000
--- a/src/cobalt/media/filters/decoder_selector.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_DECODER_SELECTOR_H_
-#define COBALT_MEDIA_FILTERS_DECODER_SELECTOR_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_vector.h"
-#include "base/memory/weak_ptr.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/filters/decoder_stream_traits.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace cobalt {
-namespace media {
-
-class CdmContext;
-class DecoderBuffer;
-class DecryptingDemuxerStream;
-class MediaLog;
-
-// DecoderSelector (creates if necessary and) initializes the proper
-// Decoder for a given DemuxerStream. If the given DemuxerStream is
-// encrypted, a DecryptingDemuxerStream may also be created.
-// The template parameter |StreamType| is the type of stream we will be
-// selecting a decoder for.
-template <DemuxerStream::Type StreamType>
-class MEDIA_EXPORT DecoderSelector {
- public:
-  typedef DecoderStreamTraits<StreamType> StreamTraits;
-  typedef typename StreamTraits::DecoderType Decoder;
-
-  // Indicates completion of Decoder selection.
-  // - First parameter: The initialized Decoder. If it's set to NULL, then
-  // Decoder initialization failed.
-  // - Second parameter: The initialized DecryptingDemuxerStream. If it's not
-  // NULL, then a DecryptingDemuxerStream is created and initialized to do
-  // decryption for the initialized Decoder.
-  // Note: The caller owns selected Decoder and DecryptingDemuxerStream.
-  // The caller should call DecryptingDemuxerStream::Reset() before
-  // calling Decoder::Reset() to release any pending decryption or read.
-  typedef base::Callback<void(std::unique_ptr<Decoder>,
-                              std::unique_ptr<DecryptingDemuxerStream>)>
-      SelectDecoderCB;
-
-  // |decoders| contains the Decoders to use when initializing.
-  DecoderSelector(
-      const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
-      ScopedVector<Decoder> decoders, const scoped_refptr<MediaLog>& media_log);
-
-  // Aborts pending Decoder selection and fires |select_decoder_cb| with
-  // NULL and NULL immediately if it's pending.
-  ~DecoderSelector();
-
-  // Initializes and selects the first Decoder that can decode the |stream|.
-  // The selected Decoder (and DecryptingDemuxerStream) is returned via
-  // the |select_decoder_cb|.
-  // Notes:
-  // 1. This must not be called again before |select_decoder_cb| is run.
-  // 2. Decoders that fail to initialize will be deleted. Future calls will
-  //    select from the decoders following the decoder that was last returned.
-  // 3. |cdm_context| is optional. If |cdm_context| is
-  //    null, no CDM will be available to perform decryption.
-  void SelectDecoder(StreamTraits* traits, DemuxerStream* stream,
-                     CdmContext* cdm_context,
-                     const SelectDecoderCB& select_decoder_cb,
-                     const typename Decoder::OutputCB& output_cb,
-                     const base::Closure& waiting_for_decryption_key_cb);
-
- private:
-#if !defined(OS_ANDROID)
-  void InitializeDecryptingDecoder();
-  void DecryptingDecoderInitDone(bool success);
-#endif
-  void InitializeDecryptingDemuxerStream();
-  void DecryptingDemuxerStreamInitDone(PipelineStatus status);
-  void InitializeDecoder();
-  void DecoderInitDone(bool success);
-  void ReturnNullDecoder();
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  ScopedVector<Decoder> decoders_;
-  scoped_refptr<MediaLog> media_log_;
-
-  StreamTraits* traits_;
-  DemuxerStream* input_stream_;
-  CdmContext* cdm_context_;
-  SelectDecoderCB select_decoder_cb_;
-  typename Decoder::OutputCB output_cb_;
-  base::Closure waiting_for_decryption_key_cb_;
-
-  std::unique_ptr<Decoder> decoder_;
-  std::unique_ptr<DecryptingDemuxerStream> decrypted_stream_;
-
-  // NOTE: Weak pointers must be invalidated before all other member variables.
-  base::WeakPtrFactory<DecoderSelector> weak_ptr_factory_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(DecoderSelector);
-};
-
-typedef DecoderSelector<DemuxerStream::VIDEO> VideoDecoderSelector;
-typedef DecoderSelector<DemuxerStream::AUDIO> AudioDecoderSelector;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_DECODER_SELECTOR_H_
diff --git a/src/cobalt/media/filters/decrypting_audio_decoder.cc b/src/cobalt/media/filters/decrypting_audio_decoder.cc
deleted file mode 100644
index 311412f..0000000
--- a/src/cobalt/media/filters/decrypting_audio_decoder.cc
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/decrypting_audio_decoder.h"
-
-#include <cstdlib>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "base/string_number_conversions.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static inline bool IsOutOfSync(const base::TimeDelta& timestamp_1,
-                               const base::TimeDelta& timestamp_2) {
-  // Out of sync of 100ms would be pretty noticeable and we should keep any
-  // drift below that.
-  const int64_t kOutOfSyncThresholdInMilliseconds = 100;
-  return std::abs(timestamp_1.InMilliseconds() - timestamp_2.InMilliseconds()) >
-         kOutOfSyncThresholdInMilliseconds;
-}
-
-DecryptingAudioDecoder::DecryptingAudioDecoder(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    const scoped_refptr<MediaLog>& media_log,
-    const base::Closure& waiting_for_decryption_key_cb)
-    : task_runner_(task_runner),
-      media_log_(media_log),
-      state_(kUninitialized),
-      waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb),
-      decryptor_(NULL),
-      key_added_while_decode_pending_(false),
-      weak_factory_(this) {}
-
-std::string DecryptingAudioDecoder::GetDisplayName() const {
-  return "DecryptingAudioDecoder";
-}
-
-void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config,
-                                        CdmContext* cdm_context,
-                                        const InitCB& init_cb,
-                                        const OutputCB& output_cb) {
-  DVLOG(2) << "Initialize()";
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(decode_cb_.is_null());
-  DCHECK(reset_cb_.is_null());
-
-  weak_this_ = weak_factory_.GetWeakPtr();
-  init_cb_ = BindToCurrentLoop(init_cb);
-  output_cb_ = BindToCurrentLoop(output_cb);
-
-  // TODO(xhwang): We should be able to DCHECK config.IsValidConfig() and
-  // config.is_encrypted().
-  if (!config.IsValidConfig()) {
-    DLOG(ERROR) << "Invalid audio stream config.";
-    base::ResetAndReturn(&init_cb_).Run(false);
-    return;
-  }
-
-  // DecryptingAudioDecoder only accepts potentially encrypted stream.
-  if (!config.is_encrypted()) {
-    base::ResetAndReturn(&init_cb_).Run(false);
-    return;
-  }
-
-  config_ = config;
-
-  if (state_ == kUninitialized) {
-    DCHECK(cdm_context);
-    if (!cdm_context->GetDecryptor()) {
-      MEDIA_LOG(DEBUG, media_log_) << GetDisplayName() << ": no decryptor";
-      base::ResetAndReturn(&init_cb_).Run(false);
-      return;
-    }
-
-    decryptor_ = cdm_context->GetDecryptor();
-  } else {
-    // Reinitialization (i.e. upon a config change)
-    decryptor_->DeinitializeDecoder(Decryptor::kAudio);
-  }
-
-  InitializeDecoder();
-}
-
-void DecryptingAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
-                                    const DecodeCB& decode_cb) {
-  DVLOG(3) << "Decode()";
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kIdle || state_ == kDecodeFinished) << state_;
-  DCHECK(!decode_cb.is_null());
-  CHECK(decode_cb_.is_null()) << "Overlapping decodes are not supported.";
-
-  decode_cb_ = BindToCurrentLoop(decode_cb);
-
-  // Return empty (end-of-stream) frames if decoding has finished.
-  if (state_ == kDecodeFinished) {
-    output_cb_.Run(AudioBuffer::CreateEOSBuffer());
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::OK);
-    return;
-  }
-
-  // Initialize the |next_output_timestamp_| to be the timestamp of the first
-  // non-EOS buffer.
-  if (timestamp_helper_->base_timestamp() == kNoTimestamp &&
-      !buffer->end_of_stream()) {
-    timestamp_helper_->SetBaseTimestamp(buffer->timestamp());
-  }
-
-  pending_buffer_to_decode_ = buffer;
-  state_ = kPendingDecode;
-  DecodePendingBuffer();
-}
-
-void DecryptingAudioDecoder::Reset(const base::Closure& closure) {
-  DVLOG(2) << "Reset() - state: " << state_;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kIdle || state_ == kPendingDecode ||
-         state_ == kWaitingForKey || state_ == kDecodeFinished)
-      << state_;
-  DCHECK(init_cb_.is_null());  // No Reset() during pending initialization.
-  DCHECK(reset_cb_.is_null());
-
-  reset_cb_ = BindToCurrentLoop(closure);
-
-  decryptor_->ResetDecoder(Decryptor::kAudio);
-
-  // Reset() cannot complete if the read callback is still pending.
-  // Defer the resetting process in this case. The |reset_cb_| will be fired
-  // after the read callback is fired - see DecryptAndDecodeBuffer() and
-  // DeliverFrame().
-  if (state_ == kPendingDecode) {
-    DCHECK(!decode_cb_.is_null());
-    return;
-  }
-
-  if (state_ == kWaitingForKey) {
-    DCHECK(!decode_cb_.is_null());
-    pending_buffer_to_decode_ = NULL;
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::ABORTED);
-  }
-
-  DCHECK(decode_cb_.is_null());
-  DoReset();
-}
-
-DecryptingAudioDecoder::~DecryptingAudioDecoder() {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (state_ == kUninitialized) return;
-
-  if (decryptor_) {
-    decryptor_->DeinitializeDecoder(Decryptor::kAudio);
-    decryptor_ = NULL;
-  }
-  pending_buffer_to_decode_ = NULL;
-  if (!init_cb_.is_null()) base::ResetAndReturn(&init_cb_).Run(false);
-  if (!decode_cb_.is_null())
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::ABORTED);
-  if (!reset_cb_.is_null()) base::ResetAndReturn(&reset_cb_).Run();
-}
-
-void DecryptingAudioDecoder::InitializeDecoder() {
-  state_ = kPendingDecoderInit;
-  decryptor_->InitializeAudioDecoder(
-      config_, BindToCurrentLoop(base::Bind(
-                   &DecryptingAudioDecoder::FinishInitialization, weak_this_)));
-}
-
-void DecryptingAudioDecoder::FinishInitialization(bool success) {
-  DVLOG(2) << "FinishInitialization()";
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kPendingDecoderInit) << state_;
-  DCHECK(!init_cb_.is_null());
-  DCHECK(reset_cb_.is_null());   // No Reset() before initialization finished.
-  DCHECK(decode_cb_.is_null());  // No Decode() before initialization finished.
-
-  if (!success) {
-    MEDIA_LOG(DEBUG, media_log_) << GetDisplayName()
-                                 << ": failed to init decoder on decryptor";
-    base::ResetAndReturn(&init_cb_).Run(false);
-    decryptor_ = NULL;
-    state_ = kError;
-    return;
-  }
-
-  // Success!
-  timestamp_helper_.reset(
-      new AudioTimestampHelper(config_.samples_per_second()));
-
-  decryptor_->RegisterNewKeyCB(
-      Decryptor::kAudio, BindToCurrentLoop(base::Bind(
-                             &DecryptingAudioDecoder::OnKeyAdded, weak_this_)));
-
-  state_ = kIdle;
-  base::ResetAndReturn(&init_cb_).Run(true);
-}
-
-void DecryptingAudioDecoder::DecodePendingBuffer() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecode) << state_;
-
-  int buffer_size = 0;
-  if (!pending_buffer_to_decode_->end_of_stream()) {
-    buffer_size = pending_buffer_to_decode_->data_size();
-  }
-
-  decryptor_->DecryptAndDecodeAudio(
-      pending_buffer_to_decode_,
-      BindToCurrentLoop(base::Bind(&DecryptingAudioDecoder::DeliverFrame,
-                                   weak_this_, buffer_size)));
-}
-
-void DecryptingAudioDecoder::DeliverFrame(
-    int buffer_size, Decryptor::Status status,
-    const Decryptor::AudioFrames& frames) {
-  DVLOG(3) << "DeliverFrame() - status: " << status;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecode) << state_;
-  DCHECK(!decode_cb_.is_null());
-  DCHECK(pending_buffer_to_decode_.get());
-
-  bool need_to_try_again_if_nokey_is_returned = key_added_while_decode_pending_;
-  key_added_while_decode_pending_ = false;
-
-  scoped_refptr<DecoderBuffer> scoped_pending_buffer_to_decode =
-      pending_buffer_to_decode_;
-  pending_buffer_to_decode_ = NULL;
-
-  if (!reset_cb_.is_null()) {
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::ABORTED);
-    DoReset();
-    return;
-  }
-
-  DCHECK_EQ(status == Decryptor::kSuccess, !frames.empty());
-
-  if (status == Decryptor::kError) {
-    DVLOG(2) << "DeliverFrame() - kError";
-    MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": decode error";
-    state_ = kDecodeFinished;  // TODO add kError state
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::DECODE_ERROR);
-    return;
-  }
-
-  if (status == Decryptor::kNoKey) {
-    std::string key_id =
-        scoped_pending_buffer_to_decode->decrypt_config()->key_id();
-    std::string missing_key_id = base::HexEncode(key_id.data(), key_id.size());
-    DVLOG(1) << "DeliverFrame() - no key for key ID " << missing_key_id;
-    MEDIA_LOG(DEBUG, media_log_) << GetDisplayName() << ": no key for key ID "
-                                 << missing_key_id;
-
-    // Set |pending_buffer_to_decode_| back as we need to try decoding the
-    // pending buffer again when new key is added to the decryptor.
-    pending_buffer_to_decode_ = scoped_pending_buffer_to_decode;
-
-    if (need_to_try_again_if_nokey_is_returned) {
-      // The |state_| is still kPendingDecode.
-      MEDIA_LOG(INFO, media_log_) << GetDisplayName()
-                                  << ": key was added, resuming decode";
-      DecodePendingBuffer();
-      return;
-    }
-
-    state_ = kWaitingForKey;
-    waiting_for_decryption_key_cb_.Run();
-    return;
-  }
-
-  if (status == Decryptor::kNeedMoreData) {
-    DVLOG(2) << "DeliverFrame() - kNeedMoreData";
-    state_ = scoped_pending_buffer_to_decode->end_of_stream() ? kDecodeFinished
-                                                              : kIdle;
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::OK);
-    return;
-  }
-
-  DCHECK_EQ(status, Decryptor::kSuccess);
-  DCHECK(!frames.empty());
-  ProcessDecodedFrames(frames);
-
-  if (scoped_pending_buffer_to_decode->end_of_stream()) {
-    // Set |pending_buffer_to_decode_| back as we need to keep flushing the
-    // decryptor until kNeedMoreData is returned.
-    pending_buffer_to_decode_ = scoped_pending_buffer_to_decode;
-    DecodePendingBuffer();
-    return;
-  }
-
-  state_ = kIdle;
-  base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::OK);
-}
-
-void DecryptingAudioDecoder::OnKeyAdded() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (state_ == kPendingDecode) {
-    key_added_while_decode_pending_ = true;
-    return;
-  }
-
-  if (state_ == kWaitingForKey) {
-    MEDIA_LOG(INFO, media_log_) << GetDisplayName()
-                                << ": key added, resuming decode";
-    state_ = kPendingDecode;
-    DecodePendingBuffer();
-  }
-}
-
-void DecryptingAudioDecoder::DoReset() {
-  DCHECK(init_cb_.is_null());
-  DCHECK(decode_cb_.is_null());
-  timestamp_helper_->SetBaseTimestamp(kNoTimestamp);
-  state_ = kIdle;
-  base::ResetAndReturn(&reset_cb_).Run();
-}
-
-void DecryptingAudioDecoder::ProcessDecodedFrames(
-    const Decryptor::AudioFrames& frames) {
-  for (Decryptor::AudioFrames::const_iterator iter = frames.begin();
-       iter != frames.end(); ++iter) {
-    scoped_refptr<AudioBuffer> frame = *iter;
-
-    DCHECK(!frame->end_of_stream()) << "EOS frame returned.";
-    DCHECK_GT(frame->frame_count(), 0) << "Empty frame returned.";
-
-    base::TimeDelta current_time = timestamp_helper_->GetTimestamp();
-    if (IsOutOfSync(current_time, frame->timestamp())) {
-      DVLOG(1) << "Timestamp returned by the decoder ("
-               << frame->timestamp().InMilliseconds() << " ms)"
-               << " does not match the input timestamp and number of samples"
-               << " decoded (" << current_time.InMilliseconds() << " ms).";
-    }
-
-    frame->set_timestamp(current_time);
-    timestamp_helper_->AddFrames(frame->frame_count());
-
-    output_cb_.Run(frame);
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/decrypting_audio_decoder.h b/src/cobalt/media/filters/decrypting_audio_decoder.h
deleted file mode 100644
index 9ee686e..0000000
--- a/src/cobalt/media/filters/decrypting_audio_decoder.h
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
-#define COBALT_MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/time.h"
-#include "cobalt/media/base/audio_decoder.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/decryptor.h"
-#include "cobalt/media/base/demuxer_stream.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace cobalt {
-namespace media {
-
-class AudioTimestampHelper;
-class DecoderBuffer;
-class Decryptor;
-class MediaLog;
-
-// Decryptor-based AudioDecoder implementation that can decrypt and decode
-// encrypted audio buffers and return decrypted and decompressed audio frames.
-// All public APIs and callbacks are trampolined to the |task_runner_| so
-// that no locks are required for thread safety.
-class MEDIA_EXPORT DecryptingAudioDecoder : public AudioDecoder {
- public:
-  DecryptingAudioDecoder(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const scoped_refptr<MediaLog>& media_log,
-      const base::Closure& waiting_for_decryption_key_cb);
-  ~DecryptingAudioDecoder() OVERRIDE;
-
-  // AudioDecoder implementation.
-  std::string GetDisplayName() const OVERRIDE;
-  void Initialize(const AudioDecoderConfig& config, CdmContext* cdm_context,
-                  const InitCB& init_cb, const OutputCB& output_cb) OVERRIDE;
-  void Decode(const scoped_refptr<DecoderBuffer>& buffer,
-              const DecodeCB& decode_cb) OVERRIDE;
-  void Reset(const base::Closure& closure) OVERRIDE;
-
- private:
-  // For a detailed state diagram please see this link: http://goo.gl/8jAok
-  // TODO(xhwang): Add a ASCII state diagram in this file after this class
-  // stabilizes.
-  // TODO(xhwang): Update this diagram for DecryptingAudioDecoder.
-  enum State {
-    kUninitialized = 0,
-    kPendingDecoderInit,
-    kIdle,
-    kPendingDecode,
-    kWaitingForKey,
-    kDecodeFinished,
-    kError
-  };
-
-  // Initializes the audio decoder on the |decryptor_| with |config_|.
-  void InitializeDecoder();
-
-  // Callback for Decryptor::InitializeAudioDecoder() during initialization.
-  void FinishInitialization(bool success);
-
-  void DecodePendingBuffer();
-
-  // Callback for Decryptor::DecryptAndDecodeAudio().
-  void DeliverFrame(int buffer_size, Decryptor::Status status,
-                    const Decryptor::AudioFrames& frames);
-
-  // Callback for the |decryptor_| to notify this object that a new key has been
-  // added.
-  void OnKeyAdded();
-
-  // Resets decoder and calls |reset_cb_|.
-  void DoReset();
-
-  // Sets timestamps for |frames| and then passes them to |output_cb_|.
-  void ProcessDecodedFrames(const Decryptor::AudioFrames& frames);
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  scoped_refptr<MediaLog> media_log_;
-
-  State state_;
-
-  InitCB init_cb_;
-  OutputCB output_cb_;
-  DecodeCB decode_cb_;
-  base::Closure reset_cb_;
-  base::Closure waiting_for_decryption_key_cb_;
-
-  // The current decoder configuration.
-  AudioDecoderConfig config_;
-
-  Decryptor* decryptor_;
-
-  // The buffer that needs decrypting/decoding.
-  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_;
-
-  // Indicates the situation where new key is added during pending decode
-  // (in other words, this variable can only be set in state kPendingDecode).
-  // If this variable is true and kNoKey is returned then we need to try
-  // decrypting/decoding again in case the newly added key is the correct
-  // decryption key.
-  bool key_added_while_decode_pending_;
-
-  std::unique_ptr<AudioTimestampHelper> timestamp_helper_;
-
-  base::WeakPtr<DecryptingAudioDecoder> weak_this_;
-  base::WeakPtrFactory<DecryptingAudioDecoder> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(DecryptingAudioDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
diff --git a/src/cobalt/media/filters/decrypting_audio_decoder_unittest.cc b/src/cobalt/media/filters/decrypting_audio_decoder_unittest.cc
deleted file mode 100644
index 3c90504..0000000
--- a/src/cobalt/media/filters/decrypting_audio_decoder_unittest.cc
+++ /dev/null
@@ -1,465 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/decrypting_audio_decoder.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-using ::testing::_;
-using ::testing::AtMost;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-const int kSampleRate = 44100;
-
-// Make sure the kFakeAudioFrameSize is a valid frame size for all audio decoder
-// configs used in this test.
-const int kFakeAudioFrameSize = 48;
-const uint8_t kFakeKeyId[] = {0x4b, 0x65, 0x79, 0x20, 0x49, 0x44};
-const uint8_t kFakeIv[DecryptConfig::kDecryptionKeySize] = {0};
-const int kDecodingDelay = 3;
-
-// Create a fake non-empty encrypted buffer.
-static scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() {
-  const int buffer_size = 16;  // Need a non-empty buffer;
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(buffer_size));
-  buffer->set_decrypt_config(std::unique_ptr<DecryptConfig>(new DecryptConfig(
-      std::string(reinterpret_cast<const char*>(kFakeKeyId),
-                  arraysize(kFakeKeyId)),
-      std::string(reinterpret_cast<const char*>(kFakeIv), arraysize(kFakeIv)),
-      std::vector<SubsampleEntry>())));
-  return buffer;
-}
-
-// Use anonymous namespace here to prevent the actions to be defined multiple
-// times across multiple test files. Sadly we can't use static for them.
-namespace {
-
-ACTION_P(ReturnBuffer, buffer) { return buffer; }
-
-}  // namespace
-
-class DecryptingAudioDecoderTest : public testing::Test {
- public:
-  DecryptingAudioDecoderTest()
-      : decoder_(new DecryptingAudioDecoder(
-            message_loop_.task_runner(), new MediaLog(),
-            base::Bind(&DecryptingAudioDecoderTest::OnWaitingForDecryptionKey,
-                       base::Unretained(this)))),
-        cdm_context_(new StrictMock<MockCdmContext>()),
-        decryptor_(new StrictMock<MockDecryptor>()),
-        num_decrypt_and_decode_calls_(0),
-        num_frames_in_decryptor_(0),
-        encrypted_buffer_(CreateFakeEncryptedBuffer()),
-        decoded_frame_(NULL),
-        decoded_frame_list_() {}
-
-  virtual ~DecryptingAudioDecoderTest() { Destroy(); }
-
-  void InitializeAndExpectResult(const AudioDecoderConfig& config,
-                                 bool success) {
-    // Initialize data now that the config is known. Since the code uses
-    // invalid values (that CreateEmptyBuffer() doesn't support), tweak them
-    // just for CreateEmptyBuffer().
-    int channels = ChannelLayoutToChannelCount(config.channel_layout());
-    if (channels < 0) channels = 0;
-    decoded_frame_ = AudioBuffer::CreateEmptyBuffer(
-        config.channel_layout(), channels, kSampleRate, kFakeAudioFrameSize,
-        kNoTimestamp);
-    decoded_frame_list_.push_back(decoded_frame_);
-
-    decoder_->Initialize(config, cdm_context_.get(), NewExpectedBoolCB(success),
-                         base::Bind(&DecryptingAudioDecoderTest::FrameReady,
-                                    base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  enum CdmType { CDM_WITHOUT_DECRYPTOR, CDM_WITH_DECRYPTOR };
-
-  void SetCdmType(CdmType cdm_type) {
-    const bool has_decryptor = cdm_type == CDM_WITH_DECRYPTOR;
-    EXPECT_CALL(*cdm_context_, GetDecryptor())
-        .WillRepeatedly(Return(has_decryptor ? decryptor_.get() : NULL));
-  }
-
-  void Initialize() {
-    SetCdmType(CDM_WITH_DECRYPTOR);
-    EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-        .Times(AtMost(1))
-        .WillOnce(RunCallback<1>(true));
-    EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
-        .WillOnce(SaveArg<1>(&key_added_cb_));
-
-    config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32,
-                       CHANNEL_LAYOUT_STEREO, kSampleRate, EmptyExtraData(),
-                       AesCtrEncryptionScheme(), base::TimeDelta(), 0);
-    InitializeAndExpectResult(config_, true);
-  }
-
-  void Reinitialize() { ReinitializeConfigChange(config_); }
-
-  void ReinitializeConfigChange(const AudioDecoderConfig& new_config) {
-    EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
-    EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-        .WillOnce(RunCallback<1>(true));
-    EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
-        .WillOnce(SaveArg<1>(&key_added_cb_));
-    decoder_->Initialize(new_config, NULL, NewExpectedBoolCB(true),
-                         base::Bind(&DecryptingAudioDecoderTest::FrameReady,
-                                    base::Unretained(this)));
-  }
-
-  // Decode |buffer| and expect DecodeDone to get called with |status|.
-  void DecodeAndExpect(const scoped_refptr<DecoderBuffer>& buffer,
-                       DecodeStatus status) {
-    EXPECT_CALL(*this, DecodeDone(status));
-    decoder_->Decode(buffer, base::Bind(&DecryptingAudioDecoderTest::DecodeDone,
-                                        base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Helper function to simulate the decrypting and decoding process in the
-  // |decryptor_| with a decoding delay of kDecodingDelay buffers.
-  void DecryptAndDecodeAudio(const scoped_refptr<DecoderBuffer>& encrypted,
-                             const Decryptor::AudioDecodeCB& audio_decode_cb) {
-    num_decrypt_and_decode_calls_++;
-    if (!encrypted->end_of_stream()) num_frames_in_decryptor_++;
-
-    if (num_decrypt_and_decode_calls_ <= kDecodingDelay ||
-        num_frames_in_decryptor_ == 0) {
-      audio_decode_cb.Run(Decryptor::kNeedMoreData, Decryptor::AudioFrames());
-      return;
-    }
-
-    num_frames_in_decryptor_--;
-    audio_decode_cb.Run(Decryptor::kSuccess,
-                        Decryptor::AudioFrames(1, decoded_frame_));
-  }
-
-  // Sets up expectations and actions to put DecryptingAudioDecoder in an
-  // active normal decoding state.
-  void EnterNormalDecodingState() {
-    EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
-        .WillRepeatedly(
-            Invoke(this, &DecryptingAudioDecoderTest::DecryptAndDecodeAudio));
-    EXPECT_CALL(*this, FrameReady(decoded_frame_));
-    for (int i = 0; i < kDecodingDelay + 1; ++i)
-      DecodeAndExpect(encrypted_buffer_, DecodeStatus::OK);
-  }
-
-  // Sets up expectations and actions to put DecryptingAudioDecoder in an end
-  // of stream state. This function must be called after
-  // EnterNormalDecodingState() to work.
-  void EnterEndOfStreamState() {
-    // The codec in the |decryptor_| will be flushed.
-    EXPECT_CALL(*this, FrameReady(decoded_frame_)).Times(kDecodingDelay);
-    DecodeAndExpect(DecoderBuffer::CreateEOSBuffer(), DecodeStatus::OK);
-    EXPECT_EQ(0, num_frames_in_decryptor_);
-  }
-
-  // Make the audio decode callback pending by saving and not firing it.
-  void EnterPendingDecodeState() {
-    EXPECT_TRUE(pending_audio_decode_cb_.is_null());
-    EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _))
-        .WillOnce(SaveArg<1>(&pending_audio_decode_cb_));
-
-    decoder_->Decode(encrypted_buffer_,
-                     base::Bind(&DecryptingAudioDecoderTest::DecodeDone,
-                                base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    // Make sure the Decode() on the decoder triggers a DecryptAndDecode() on
-    // the decryptor.
-    EXPECT_FALSE(pending_audio_decode_cb_.is_null());
-  }
-
-  void EnterWaitingForKeyState() {
-    EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _))
-        .WillRepeatedly(
-            RunCallback<1>(Decryptor::kNoKey, Decryptor::AudioFrames()));
-    EXPECT_CALL(*this, OnWaitingForDecryptionKey());
-    decoder_->Decode(encrypted_buffer_,
-                     base::Bind(&DecryptingAudioDecoderTest::DecodeDone,
-                                base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void AbortPendingAudioDecodeCB() {
-    if (!pending_audio_decode_cb_.is_null()) {
-      base::ResetAndReturn(&pending_audio_decode_cb_)
-          .Run(Decryptor::kSuccess, Decryptor::AudioFrames());
-    }
-  }
-
-  void AbortAllPendingCBs() {
-    if (!pending_init_cb_.is_null()) {
-      ASSERT_TRUE(pending_audio_decode_cb_.is_null());
-      base::ResetAndReturn(&pending_init_cb_).Run(false);
-      return;
-    }
-
-    AbortPendingAudioDecodeCB();
-  }
-
-  void Reset() {
-    EXPECT_CALL(*decryptor_, ResetDecoder(Decryptor::kAudio))
-        .WillRepeatedly(InvokeWithoutArgs(
-            this, &DecryptingAudioDecoderTest::AbortPendingAudioDecodeCB));
-
-    decoder_->Reset(NewExpectedClosure());
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void Destroy() {
-    EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio))
-        .WillRepeatedly(InvokeWithoutArgs(
-            this, &DecryptingAudioDecoderTest::AbortAllPendingCBs));
-
-    decoder_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  MOCK_METHOD1(FrameReady, void(const scoped_refptr<AudioBuffer>&));
-  MOCK_METHOD1(DecodeDone, void(DecodeStatus));
-
-  MOCK_METHOD0(OnWaitingForDecryptionKey, void(void));
-
-  base::MessageLoop message_loop_;
-  std::unique_ptr<DecryptingAudioDecoder> decoder_;
-  std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
-  std::unique_ptr<StrictMock<MockDecryptor>> decryptor_;
-  AudioDecoderConfig config_;
-
-  // Variables to help the |decryptor_| to simulate decoding delay and flushing.
-  int num_decrypt_and_decode_calls_;
-  int num_frames_in_decryptor_;
-
-  Decryptor::DecoderInitCB pending_init_cb_;
-  Decryptor::NewKeyCB key_added_cb_;
-  Decryptor::AudioDecodeCB pending_audio_decode_cb_;
-
-  // Constant buffer/frames, to be used/returned by |decoder_| and |decryptor_|.
-  scoped_refptr<DecoderBuffer> encrypted_buffer_;
-  scoped_refptr<AudioBuffer> decoded_frame_;
-  Decryptor::AudioFrames decoded_frame_list_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DecryptingAudioDecoderTest);
-};
-
-TEST_F(DecryptingAudioDecoderTest, Initialize_Normal) { Initialize(); }
-
-// Ensure that DecryptingAudioDecoder only accepts encrypted audio.
-TEST_F(DecryptingAudioDecoderTest, Initialize_UnencryptedAudioConfig) {
-  AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
-                            CHANNEL_LAYOUT_STEREO, kSampleRate,
-                            EmptyExtraData(), Unencrypted());
-
-  InitializeAndExpectResult(config, false);
-}
-
-// Ensure decoder handles invalid audio configs without crashing.
-TEST_F(DecryptingAudioDecoderTest, Initialize_InvalidAudioConfig) {
-  AudioDecoderConfig config(kUnknownAudioCodec, kUnknownSampleFormat,
-                            CHANNEL_LAYOUT_STEREO, 0, EmptyExtraData(),
-                            AesCtrEncryptionScheme());
-
-  InitializeAndExpectResult(config, false);
-}
-
-// Ensure decoder handles unsupported audio configs without crashing.
-TEST_F(DecryptingAudioDecoderTest, Initialize_UnsupportedAudioConfig) {
-  SetCdmType(CDM_WITH_DECRYPTOR);
-  EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-      .WillOnce(RunCallback<1>(false));
-
-  AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
-                            CHANNEL_LAYOUT_STEREO, kSampleRate,
-                            EmptyExtraData(), AesCtrEncryptionScheme());
-  InitializeAndExpectResult(config, false);
-}
-
-TEST_F(DecryptingAudioDecoderTest, Initialize_CdmWithoutDecryptor) {
-  SetCdmType(CDM_WITHOUT_DECRYPTOR);
-  AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
-                            CHANNEL_LAYOUT_STEREO, kSampleRate,
-                            EmptyExtraData(), AesCtrEncryptionScheme());
-  InitializeAndExpectResult(config, false);
-}
-
-// Test normal decrypt and decode case.
-TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) {
-  Initialize();
-  EnterNormalDecodingState();
-}
-
-// Test the case where the decryptor returns error when doing decrypt and
-// decode.
-TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) {
-  Initialize();
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
-      .WillRepeatedly(
-          RunCallback<1>(Decryptor::kError, Decryptor::AudioFrames()));
-
-  DecodeAndExpect(encrypted_buffer_, DecodeStatus::DECODE_ERROR);
-}
-
-// Test the case where the decryptor returns multiple decoded frames.
-TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) {
-  Initialize();
-
-  scoped_refptr<AudioBuffer> frame_a = AudioBuffer::CreateEmptyBuffer(
-      config_.channel_layout(),
-      ChannelLayoutToChannelCount(config_.channel_layout()), kSampleRate,
-      kFakeAudioFrameSize, kNoTimestamp);
-  scoped_refptr<AudioBuffer> frame_b = AudioBuffer::CreateEmptyBuffer(
-      config_.channel_layout(),
-      ChannelLayoutToChannelCount(config_.channel_layout()), kSampleRate,
-      kFakeAudioFrameSize, kNoTimestamp);
-  decoded_frame_list_.push_back(frame_a);
-  decoded_frame_list_.push_back(frame_b);
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
-      .WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
-
-  EXPECT_CALL(*this, FrameReady(decoded_frame_));
-  EXPECT_CALL(*this, FrameReady(frame_a));
-  EXPECT_CALL(*this, FrameReady(frame_b));
-  DecodeAndExpect(encrypted_buffer_, DecodeStatus::OK);
-}
-
-// Test the case where the decryptor receives end-of-stream buffer.
-TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_EndOfStream) {
-  Initialize();
-  EnterNormalDecodingState();
-  EnterEndOfStreamState();
-}
-
-// Test reinitializing decode with a new config
-TEST_F(DecryptingAudioDecoderTest, Reinitialize_ConfigChange) {
-  Initialize();
-
-  EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-      .Times(AtMost(1))
-      .WillOnce(RunCallback<1>(true));
-
-  // The new config is different from the initial config in bits-per-channel,
-  // channel layout and samples_per_second.
-  AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16,
-                                CHANNEL_LAYOUT_5_1, 88200, EmptyExtraData(),
-                                AesCtrEncryptionScheme());
-  EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel());
-  EXPECT_NE(new_config.channel_layout(), config_.channel_layout());
-  EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second());
-
-  ReinitializeConfigChange(new_config);
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test the case where the a key is added when the decryptor is in
-// kWaitingForKey state.
-TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
-      .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
-  EXPECT_CALL(*this, FrameReady(decoded_frame_));
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::OK));
-  key_added_cb_.Run();
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test the case where the a key is added when the decryptor is in
-// kPendingDecode state.
-TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) {
-  Initialize();
-  EnterPendingDecodeState();
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
-      .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
-  EXPECT_CALL(*this, FrameReady(decoded_frame_));
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::OK));
-  // The audio decode callback is returned after the correct decryption key is
-  // added.
-  key_added_cb_.Run();
-  base::ResetAndReturn(&pending_audio_decode_cb_)
-      .Run(Decryptor::kNoKey, Decryptor::AudioFrames());
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test resetting when the decoder is in kIdle state but has not decoded any
-// frame.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterInitialization) {
-  Initialize();
-  Reset();
-}
-
-// Test resetting when the decoder is in kIdle state after it has decoded one
-// frame.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) {
-  Initialize();
-  EnterNormalDecodingState();
-  Reset();
-}
-
-// Test resetting when the decoder is in kPendingDecode state.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDecode) {
-  Initialize();
-  EnterPendingDecodeState();
-
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  Reset();
-}
-
-// Test resetting when the decoder is in kWaitingForKey state.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  Reset();
-}
-
-// Test resetting when the decoder has hit end of stream and is in
-// kDecodeFinished state.
-TEST_F(DecryptingAudioDecoderTest, Reset_AfterDecodeFinished) {
-  Initialize();
-  EnterNormalDecodingState();
-  EnterEndOfStreamState();
-  Reset();
-}
-
-// Test resetting after the decoder has been reset.
-TEST_F(DecryptingAudioDecoderTest, Reset_AfterReset) {
-  Initialize();
-  EnterNormalDecodingState();
-  Reset();
-  Reset();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/decrypting_demuxer_stream.cc b/src/cobalt/media/filters/decrypting_demuxer_stream.cc
deleted file mode 100644
index 31d1295..0000000
--- a/src/cobalt/media/filters/decrypting_demuxer_stream.cc
+++ /dev/null
@@ -1,397 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/decrypting_demuxer_stream.h"
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "base/string_number_conversions.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_util.h"
-
-namespace cobalt {
-namespace media {
-
-static bool IsStreamValidAndEncrypted(DemuxerStream* stream) {
-  return ((stream->type() == DemuxerStream::AUDIO &&
-           stream->audio_decoder_config().IsValidConfig() &&
-           stream->audio_decoder_config().is_encrypted()) ||
-          (stream->type() == DemuxerStream::VIDEO &&
-           stream->video_decoder_config().IsValidConfig() &&
-           stream->video_decoder_config().is_encrypted()));
-}
-
-DecryptingDemuxerStream::DecryptingDemuxerStream(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    const scoped_refptr<MediaLog>& media_log,
-    const base::Closure& waiting_for_decryption_key_cb)
-    : task_runner_(task_runner),
-      media_log_(media_log),
-      state_(kUninitialized),
-      waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb),
-      demuxer_stream_(NULL),
-      decryptor_(NULL),
-      key_added_while_decrypt_pending_(false),
-      weak_factory_(this) {}
-
-std::string DecryptingDemuxerStream::GetDisplayName() const {
-  return "DecryptingDemuxerStream";
-}
-
-void DecryptingDemuxerStream::Initialize(DemuxerStream* stream,
-                                         CdmContext* cdm_context,
-                                         const PipelineStatusCB& status_cb) {
-  DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kUninitialized) << state_;
-  DCHECK(stream);
-  DCHECK(cdm_context);
-  DCHECK(!demuxer_stream_);
-
-  weak_this_ = weak_factory_.GetWeakPtr();
-  demuxer_stream_ = stream;
-  init_cb_ = BindToCurrentLoop(status_cb);
-
-  InitializeDecoderConfig();
-
-  if (!cdm_context->GetDecryptor()) {
-    MEDIA_LOG(DEBUG, media_log_) << GetDisplayName() << ": no decryptor";
-    state_ = kUninitialized;
-    base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
-    return;
-  }
-
-  decryptor_ = cdm_context->GetDecryptor();
-
-  decryptor_->RegisterNewKeyCB(
-      GetDecryptorStreamType(),
-      BindToCurrentLoop(
-          base::Bind(&DecryptingDemuxerStream::OnKeyAdded, weak_this_)));
-
-  state_ = kIdle;
-  base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
-}
-
-void DecryptingDemuxerStream::Read(const ReadCB& read_cb) {
-  DVLOG(3) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kIdle) << state_;
-  DCHECK(!read_cb.is_null());
-  CHECK(read_cb_.is_null()) << "Overlapping reads are not supported.";
-
-  read_cb_ = BindToCurrentLoop(read_cb);
-  state_ = kPendingDemuxerRead;
-  demuxer_stream_->Read(
-      base::Bind(&DecryptingDemuxerStream::DecryptBuffer, weak_this_));
-}
-
-void DecryptingDemuxerStream::Reset(const base::Closure& closure) {
-  DVLOG(2) << __func__ << " - state: " << state_;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ != kUninitialized) << state_;
-  DCHECK(reset_cb_.is_null());
-
-  reset_cb_ = BindToCurrentLoop(closure);
-
-  decryptor_->CancelDecrypt(GetDecryptorStreamType());
-
-  // Reset() cannot complete if the read callback is still pending.
-  // Defer the resetting process in this case. The |reset_cb_| will be fired
-  // after the read callback is fired - see DoDecryptBuffer() and
-  // DoDeliverBuffer().
-  if (state_ == kPendingDemuxerRead || state_ == kPendingDecrypt) {
-    DCHECK(!read_cb_.is_null());
-    return;
-  }
-
-  if (state_ == kWaitingForKey) {
-    DCHECK(!read_cb_.is_null());
-    pending_buffer_to_decrypt_ = NULL;
-    base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-  }
-
-  DCHECK(read_cb_.is_null());
-  DoReset();
-}
-
-AudioDecoderConfig DecryptingDemuxerStream::audio_decoder_config() {
-  DCHECK(state_ != kUninitialized) << state_;
-  CHECK_EQ(demuxer_stream_->type(), AUDIO);
-  return audio_config_;
-}
-
-VideoDecoderConfig DecryptingDemuxerStream::video_decoder_config() {
-  DCHECK(state_ != kUninitialized) << state_;
-  CHECK_EQ(demuxer_stream_->type(), VIDEO);
-  return video_config_;
-}
-
-DemuxerStream::Type DecryptingDemuxerStream::type() const {
-  DCHECK(state_ != kUninitialized) << state_;
-  return demuxer_stream_->type();
-}
-
-DemuxerStream::Liveness DecryptingDemuxerStream::liveness() const {
-  DCHECK(state_ != kUninitialized) << state_;
-  return demuxer_stream_->liveness();
-}
-
-void DecryptingDemuxerStream::EnableBitstreamConverter() {
-  demuxer_stream_->EnableBitstreamConverter();
-}
-
-bool DecryptingDemuxerStream::SupportsConfigChanges() {
-  return demuxer_stream_->SupportsConfigChanges();
-}
-
-VideoRotation DecryptingDemuxerStream::video_rotation() {
-  return demuxer_stream_->video_rotation();
-}
-
-bool DecryptingDemuxerStream::enabled() const {
-  return demuxer_stream_->enabled();
-}
-
-void DecryptingDemuxerStream::set_enabled(bool enabled,
-                                          base::TimeDelta timestamp) {
-  demuxer_stream_->set_enabled(enabled, timestamp);
-}
-
-void DecryptingDemuxerStream::SetStreamStatusChangeCB(
-    const StreamStatusChangeCB& cb) {
-  demuxer_stream_->SetStreamStatusChangeCB(cb);
-}
-
-DecryptingDemuxerStream::~DecryptingDemuxerStream() {
-  DVLOG(2) << __func__ << " : state_ = " << state_;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (state_ == kUninitialized) return;
-
-  if (decryptor_) {
-    decryptor_->CancelDecrypt(GetDecryptorStreamType());
-    decryptor_ = NULL;
-  }
-  if (!init_cb_.is_null())
-    base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
-  if (!read_cb_.is_null()) base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-  if (!reset_cb_.is_null()) base::ResetAndReturn(&reset_cb_).Run();
-  pending_buffer_to_decrypt_ = NULL;
-}
-
-void DecryptingDemuxerStream::DecryptBuffer(
-    DemuxerStream::Status status, const scoped_refptr<DecoderBuffer>& buffer) {
-  DVLOG(3) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDemuxerRead) << state_;
-  DCHECK(!read_cb_.is_null());
-  DCHECK_EQ(buffer.get() != NULL, status == kOk) << status;
-
-  // Even when |!reset_cb_.is_null()|, we need to pass |kConfigChanged| back to
-  // the caller so that the downstream decoder can be properly reinitialized.
-  if (status == kConfigChanged) {
-    DVLOG(2) << "DoDecryptBuffer() - kConfigChanged.";
-    DCHECK_EQ(demuxer_stream_->type() == AUDIO, audio_config_.IsValidConfig());
-    DCHECK_EQ(demuxer_stream_->type() == VIDEO, video_config_.IsValidConfig());
-
-    // Update the decoder config, which the decoder will use when it is notified
-    // of kConfigChanged.
-    InitializeDecoderConfig();
-
-    state_ = kIdle;
-    base::ResetAndReturn(&read_cb_).Run(kConfigChanged, NULL);
-    if (!reset_cb_.is_null()) DoReset();
-    return;
-  }
-
-  if (!reset_cb_.is_null()) {
-    base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-    DoReset();
-    return;
-  }
-
-  if (status == kAborted) {
-    DVLOG(2) << "DoDecryptBuffer() - kAborted.";
-    state_ = kIdle;
-    base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-    return;
-  }
-
-  if (buffer->end_of_stream()) {
-    DVLOG(2) << "DoDecryptBuffer() - EOS buffer.";
-    state_ = kIdle;
-    base::ResetAndReturn(&read_cb_).Run(status, buffer);
-    return;
-  }
-
-  DCHECK(buffer->decrypt_config());
-  // An empty iv string signals that the frame is unencrypted.
-  if (buffer->decrypt_config()->iv().empty()) {
-    DVLOG(2) << "DoDecryptBuffer() - clear buffer.";
-    scoped_refptr<DecoderBuffer> decrypted =
-        DecoderBuffer::CopyFrom(buffer->data(), buffer->data_size());
-    decrypted->set_timestamp(buffer->timestamp());
-    decrypted->set_duration(buffer->duration());
-    if (buffer->is_key_frame()) decrypted->set_is_key_frame(true);
-
-    state_ = kIdle;
-    base::ResetAndReturn(&read_cb_).Run(kOk, decrypted);
-    return;
-  }
-
-  pending_buffer_to_decrypt_ = buffer;
-  state_ = kPendingDecrypt;
-  DecryptPendingBuffer();
-}
-
-void DecryptingDemuxerStream::DecryptPendingBuffer() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecrypt) << state_;
-  decryptor_->Decrypt(
-      GetDecryptorStreamType(), pending_buffer_to_decrypt_,
-      BindToCurrentLoop(
-          base::Bind(&DecryptingDemuxerStream::DeliverBuffer, weak_this_)));
-}
-
-void DecryptingDemuxerStream::DeliverBuffer(
-    Decryptor::Status status,
-    const scoped_refptr<DecoderBuffer>& decrypted_buffer) {
-  DVLOG(3) << __func__ << " - status: " << status;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecrypt) << state_;
-  DCHECK_NE(status, Decryptor::kNeedMoreData);
-  DCHECK(!read_cb_.is_null());
-  DCHECK(pending_buffer_to_decrypt_.get());
-
-  bool need_to_try_again_if_nokey = key_added_while_decrypt_pending_;
-  key_added_while_decrypt_pending_ = false;
-
-  if (!reset_cb_.is_null()) {
-    pending_buffer_to_decrypt_ = NULL;
-    base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-    DoReset();
-    return;
-  }
-
-  DCHECK_EQ(status == Decryptor::kSuccess, decrypted_buffer.get() != NULL);
-
-  if (status == Decryptor::kError) {
-    DVLOG(2) << "DoDeliverBuffer() - kError";
-    MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": decrypt error";
-    pending_buffer_to_decrypt_ = NULL;
-    state_ = kIdle;
-    base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-    return;
-  }
-
-  if (status == Decryptor::kNoKey) {
-    std::string key_id = pending_buffer_to_decrypt_->decrypt_config()->key_id();
-    std::string missing_key_id = base::HexEncode(key_id.data(), key_id.size());
-    DVLOG(1) << "DeliverBuffer() - no key for key ID " << missing_key_id;
-    MEDIA_LOG(INFO, media_log_) << GetDisplayName() << ": no key for key ID "
-                                << missing_key_id;
-
-    if (need_to_try_again_if_nokey) {
-      // The |state_| is still kPendingDecrypt.
-      MEDIA_LOG(INFO, media_log_) << GetDisplayName()
-                                  << ": key was added, resuming decrypt";
-      DecryptPendingBuffer();
-      return;
-    }
-
-    state_ = kWaitingForKey;
-    waiting_for_decryption_key_cb_.Run();
-    return;
-  }
-
-  DCHECK_EQ(status, Decryptor::kSuccess);
-
-  // Copy the key frame flag from the encrypted to decrypted buffer, assuming
-  // that the decryptor initialized the flag to false.
-  if (pending_buffer_to_decrypt_->is_key_frame())
-    decrypted_buffer->set_is_key_frame(true);
-
-  pending_buffer_to_decrypt_ = NULL;
-  state_ = kIdle;
-  base::ResetAndReturn(&read_cb_).Run(kOk, decrypted_buffer);
-}
-
-void DecryptingDemuxerStream::OnKeyAdded() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (state_ == kPendingDecrypt) {
-    key_added_while_decrypt_pending_ = true;
-    return;
-  }
-
-  if (state_ == kWaitingForKey) {
-    MEDIA_LOG(INFO, media_log_) << GetDisplayName()
-                                << ": key added, resuming decrypt";
-    state_ = kPendingDecrypt;
-    DecryptPendingBuffer();
-  }
-}
-
-void DecryptingDemuxerStream::DoReset() {
-  DCHECK(state_ != kUninitialized);
-  DCHECK(init_cb_.is_null());
-  DCHECK(read_cb_.is_null());
-
-  state_ = kIdle;
-
-  base::ResetAndReturn(&reset_cb_).Run();
-}
-
-Decryptor::StreamType DecryptingDemuxerStream::GetDecryptorStreamType() const {
-  if (demuxer_stream_->type() == AUDIO) return Decryptor::kAudio;
-
-  DCHECK_EQ(demuxer_stream_->type(), VIDEO);
-  return Decryptor::kVideo;
-}
-
-void DecryptingDemuxerStream::InitializeDecoderConfig() {
-  // The decoder selector or upstream demuxer make sure the stream is valid and
-  // potentially encrypted.
-  DCHECK(IsStreamValidAndEncrypted(demuxer_stream_));
-
-  switch (demuxer_stream_->type()) {
-    case AUDIO: {
-      AudioDecoderConfig input_audio_config =
-          demuxer_stream_->audio_decoder_config();
-      audio_config_.Initialize(
-          input_audio_config.codec(), input_audio_config.sample_format(),
-          input_audio_config.channel_layout(),
-          input_audio_config.samples_per_second(),
-          input_audio_config.extra_data(), Unencrypted(),
-          input_audio_config.seek_preroll(), input_audio_config.codec_delay());
-      break;
-    }
-
-    case VIDEO: {
-      VideoDecoderConfig input_video_config =
-          demuxer_stream_->video_decoder_config();
-      video_config_.Initialize(
-          input_video_config.codec(), input_video_config.profile(),
-          input_video_config.format(), input_video_config.color_space(),
-          input_video_config.coded_size(), input_video_config.visible_rect(),
-          input_video_config.natural_size(), input_video_config.extra_data(),
-          Unencrypted());
-      video_config_->set_webm_color_metadata(
-          input_video_config->webm_color_metadata());
-      break;
-    }
-
-    default:
-      NOTREACHED();
-      return;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/decrypting_demuxer_stream.h b/src/cobalt/media/filters/decrypting_demuxer_stream.h
deleted file mode 100644
index c573886..0000000
--- a/src/cobalt/media/filters/decrypting_demuxer_stream.h
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_DECRYPTING_DEMUXER_STREAM_H_
-#define COBALT_MEDIA_FILTERS_DECRYPTING_DEMUXER_STREAM_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/decryptor.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/video_decoder_config.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace cobalt {
-namespace media {
-
-class DecoderBuffer;
-class MediaLog;
-
-// Decryptor-based DemuxerStream implementation that converts a potentially
-// encrypted demuxer stream to a clear demuxer stream.
-// All public APIs and callbacks are trampolined to the |task_runner_| so
-// that no locks are required for thread safety.
-class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream {
- public:
-  DecryptingDemuxerStream(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const scoped_refptr<MediaLog>& media_log,
-      const base::Closure& waiting_for_decryption_key_cb);
-
-  // Cancels all pending operations immediately and fires all pending callbacks.
-  ~DecryptingDemuxerStream() OVERRIDE;
-
-  // |steram| must be encrypted and |cdm_context| must be non-null.
-  void Initialize(DemuxerStream* stream, CdmContext* cdm_context,
-                  const PipelineStatusCB& status_cb);
-
-  // Cancels all pending operations and fires all pending callbacks. If in
-  // kPendingDemuxerRead or kPendingDecrypt state, waits for the pending
-  // operation to finish before satisfying |closure|. Sets the state to
-  // kUninitialized if |this| hasn't been initialized, or to kIdle otherwise.
-  void Reset(const base::Closure& closure);
-
-  // Returns the name of this class for logging purpose.
-  std::string GetDisplayName() const;
-
-  // DemuxerStream implementation.
-  void Read(const ReadCB& read_cb) OVERRIDE;
-  AudioDecoderConfig audio_decoder_config() OVERRIDE;
-  VideoDecoderConfig video_decoder_config() OVERRIDE;
-  Type type() const OVERRIDE;
-  Liveness liveness() const OVERRIDE;
-  void EnableBitstreamConverter() OVERRIDE;
-  bool SupportsConfigChanges() OVERRIDE;
-  VideoRotation video_rotation() OVERRIDE;
-  bool enabled() const OVERRIDE;
-  void set_enabled(bool enabled, base::TimeDelta timestamp) OVERRIDE;
-  void SetStreamStatusChangeCB(const StreamStatusChangeCB& cb) OVERRIDE;
-
- private:
-  // For a detailed state diagram please see this link: http://goo.gl/8jAok
-  // TODO(xhwang): Add a ASCII state diagram in this file after this class
-  // stabilizes.
-  // TODO(xhwang): Update this diagram for DecryptingDemuxerStream.
-  enum State {
-    kUninitialized = 0,
-    kIdle,
-    kPendingDemuxerRead,
-    kPendingDecrypt,
-    kWaitingForKey
-  };
-
-  // Callback for DemuxerStream::Read().
-  void DecryptBuffer(DemuxerStream::Status status,
-                     const scoped_refptr<DecoderBuffer>& buffer);
-
-  void DecryptPendingBuffer();
-
-  // Callback for Decryptor::Decrypt().
-  void DeliverBuffer(Decryptor::Status status,
-                     const scoped_refptr<DecoderBuffer>& decrypted_buffer);
-
-  // Callback for the |decryptor_| to notify this object that a new key has been
-  // added.
-  void OnKeyAdded();
-
-  // Resets decoder and calls |reset_cb_|.
-  void DoReset();
-
-  // Returns Decryptor::StreamType converted from |stream_type_|.
-  Decryptor::StreamType GetDecryptorStreamType() const;
-
-  // Creates and initializes either |audio_config_| or |video_config_| based on
-  // |demuxer_stream_|.
-  void InitializeDecoderConfig();
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  scoped_refptr<MediaLog> media_log_;
-
-  State state_;
-
-  PipelineStatusCB init_cb_;
-  ReadCB read_cb_;
-  base::Closure reset_cb_;
-  base::Closure waiting_for_decryption_key_cb_;
-
-  // Pointer to the input demuxer stream that will feed us encrypted buffers.
-  DemuxerStream* demuxer_stream_;
-
-  AudioDecoderConfig audio_config_;
-  VideoDecoderConfig video_config_;
-
-  Decryptor* decryptor_;
-
-  // The buffer returned by the demuxer that needs to be decrypted.
-  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decrypt_;
-
-  // Indicates the situation where new key is added during pending decryption
-  // (in other words, this variable can only be set in state kPendingDecrypt).
-  // If this variable is true and kNoKey is returned then we need to try
-  // decrypting again in case the newly added key is the correct decryption key.
-  bool key_added_while_decrypt_pending_;
-
-  base::WeakPtr<DecryptingDemuxerStream> weak_this_;
-  base::WeakPtrFactory<DecryptingDemuxerStream> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(DecryptingDemuxerStream);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_DECRYPTING_DEMUXER_STREAM_H_
diff --git a/src/cobalt/media/filters/decrypting_demuxer_stream_unittest.cc b/src/cobalt/media/filters/decrypting_demuxer_stream_unittest.cc
deleted file mode 100644
index 0adf1f4..0000000
--- a/src/cobalt/media/filters/decrypting_demuxer_stream_unittest.cc
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/filters/decrypting_demuxer_stream.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-using ::testing::_;
-using ::testing::IsNull;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-static const int kFakeBufferSize = 16;
-static const uint8_t kFakeKeyId[] = {0x4b, 0x65, 0x79, 0x20, 0x49, 0x44};
-static const uint8_t kFakeIv[DecryptConfig::kDecryptionKeySize] = {0};
-
-// Create a fake non-empty buffer in an encrypted stream. When |is_clear| is
-// true, the buffer is not encrypted (signaled by an empty IV).
-static scoped_refptr<DecoderBuffer> CreateFakeEncryptedStreamBuffer(
-    bool is_clear) {
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(kFakeBufferSize));
-  std::string iv = is_clear
-                       ? std::string()
-                       : std::string(reinterpret_cast<const char*>(kFakeIv),
-                                     arraysize(kFakeIv));
-  buffer->set_decrypt_config(std::unique_ptr<DecryptConfig>(
-      new DecryptConfig(std::string(reinterpret_cast<const char*>(kFakeKeyId),
-                                    arraysize(kFakeKeyId)),
-                        iv, std::vector<SubsampleEntry>())));
-  return buffer;
-}
-
-// Use anonymous namespace here to prevent the actions to be defined multiple
-// times across multiple test files. Sadly we can't use static for them.
-namespace {
-
-ACTION_P(ReturnBuffer, buffer) {
-  arg0.Run(buffer.get() ? DemuxerStream::kOk : DemuxerStream::kAborted, buffer);
-}
-
-}  // namespace
-
-class DecryptingDemuxerStreamTest : public testing::Test {
- public:
-  DecryptingDemuxerStreamTest()
-      : demuxer_stream_(new DecryptingDemuxerStream(
-            message_loop_.task_runner(), new MediaLog(),
-            base::Bind(&DecryptingDemuxerStreamTest::OnWaitingForDecryptionKey,
-                       base::Unretained(this)))),
-        cdm_context_(new StrictMock<MockCdmContext>()),
-        decryptor_(new StrictMock<MockDecryptor>()),
-        is_initialized_(false),
-        input_audio_stream_(
-            new StrictMock<MockDemuxerStream>(DemuxerStream::AUDIO)),
-        input_video_stream_(
-            new StrictMock<MockDemuxerStream>(DemuxerStream::VIDEO)),
-        clear_buffer_(CreateFakeEncryptedStreamBuffer(true)),
-        encrypted_buffer_(CreateFakeEncryptedStreamBuffer(false)),
-        decrypted_buffer_(new DecoderBuffer(kFakeBufferSize)) {}
-
-  virtual ~DecryptingDemuxerStreamTest() {
-    if (is_initialized_) EXPECT_CALL(*decryptor_, CancelDecrypt(_));
-    demuxer_stream_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void OnInitialized(PipelineStatus expected_status, PipelineStatus status) {
-    EXPECT_EQ(expected_status, status);
-    is_initialized_ = status == PIPELINE_OK;
-  }
-
-  void InitializeAudioAndExpectStatus(const AudioDecoderConfig& config,
-                                      PipelineStatus expected_status) {
-    input_audio_stream_->set_audio_decoder_config(config);
-    demuxer_stream_->Initialize(
-        input_audio_stream_.get(), cdm_context_.get(),
-        base::Bind(&DecryptingDemuxerStreamTest::OnInitialized,
-                   base::Unretained(this), expected_status));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void InitializeVideoAndExpectStatus(const VideoDecoderConfig& config,
-                                      PipelineStatus expected_status) {
-    input_video_stream_->set_video_decoder_config(config);
-    demuxer_stream_->Initialize(
-        input_video_stream_.get(), cdm_context_.get(),
-        base::Bind(&DecryptingDemuxerStreamTest::OnInitialized,
-                   base::Unretained(this), expected_status));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  enum CdmType { CDM_WITHOUT_DECRYPTOR, CDM_WITH_DECRYPTOR };
-
-  void SetCdmType(CdmType cdm_type) {
-    const bool has_decryptor = cdm_type == CDM_WITH_DECRYPTOR;
-    EXPECT_CALL(*cdm_context_, GetDecryptor())
-        .WillRepeatedly(Return(has_decryptor ? decryptor_.get() : NULL));
-  }
-
-  // The following functions are used to test stream-type-neutral logic in
-  // DecryptingDemuxerStream. Therefore, we don't specify audio or video in the
-  // function names. But for testing purpose, they all use an audio input
-  // demuxer stream.
-
-  void Initialize() {
-    SetCdmType(CDM_WITH_DECRYPTOR);
-    EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
-        .WillOnce(SaveArg<1>(&key_added_cb_));
-
-    AudioDecoderConfig input_config(kCodecVorbis, kSampleFormatPlanarF32,
-                                    CHANNEL_LAYOUT_STEREO, 44100,
-                                    EmptyExtraData(), AesCtrEncryptionScheme());
-    InitializeAudioAndExpectStatus(input_config, PIPELINE_OK);
-
-    const AudioDecoderConfig& output_config =
-        demuxer_stream_->audio_decoder_config();
-    EXPECT_EQ(DemuxerStream::AUDIO, demuxer_stream_->type());
-    EXPECT_FALSE(output_config.is_encrypted());
-    EXPECT_EQ(input_config.bits_per_channel(),
-              output_config.bits_per_channel());
-    EXPECT_EQ(input_config.channel_layout(), output_config.channel_layout());
-    EXPECT_EQ(input_config.sample_format(), output_config.sample_format());
-    EXPECT_EQ(input_config.samples_per_second(),
-              output_config.samples_per_second());
-  }
-
-  void ReadAndExpectBufferReadyWith(
-      DemuxerStream::Status status,
-      const scoped_refptr<DecoderBuffer>& decrypted_buffer) {
-    if (status != DemuxerStream::kOk)
-      EXPECT_CALL(*this, BufferReady(status, IsNull()));
-    else if (decrypted_buffer->end_of_stream())
-      EXPECT_CALL(*this, BufferReady(status, IsEndOfStream()));
-    else
-      EXPECT_CALL(*this, BufferReady(status, decrypted_buffer));
-
-    demuxer_stream_->Read(base::Bind(&DecryptingDemuxerStreamTest::BufferReady,
-                                     base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void EnterClearReadingState() {
-    EXPECT_TRUE(clear_buffer_->decrypt_config());
-    EXPECT_CALL(*input_audio_stream_, Read(_))
-        .WillOnce(ReturnBuffer(clear_buffer_));
-
-    // For clearbuffer, decryptor->Decrypt() will not be called.
-
-    scoped_refptr<DecoderBuffer> decrypted_buffer;
-    EXPECT_CALL(*this, BufferReady(DemuxerStream::kOk, _))
-        .WillOnce(SaveArg<1>(&decrypted_buffer));
-    demuxer_stream_->Read(base::Bind(&DecryptingDemuxerStreamTest::BufferReady,
-                                     base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-
-    EXPECT_FALSE(decrypted_buffer->decrypt_config());
-  }
-
-  // Sets up expectations and actions to put DecryptingDemuxerStream in an
-  // active normal reading state.
-  void EnterNormalReadingState() {
-    EXPECT_CALL(*input_audio_stream_, Read(_))
-        .WillOnce(ReturnBuffer(encrypted_buffer_));
-    EXPECT_CALL(*decryptor_, Decrypt(_, _, _))
-        .WillOnce(RunCallback<2>(Decryptor::kSuccess, decrypted_buffer_));
-
-    ReadAndExpectBufferReadyWith(DemuxerStream::kOk, decrypted_buffer_);
-  }
-
-  // Make the read callback pending by saving and not firing it.
-  void EnterPendingReadState() {
-    EXPECT_TRUE(pending_demuxer_read_cb_.is_null());
-    EXPECT_CALL(*input_audio_stream_, Read(_))
-        .WillOnce(SaveArg<0>(&pending_demuxer_read_cb_));
-    demuxer_stream_->Read(base::Bind(&DecryptingDemuxerStreamTest::BufferReady,
-                                     base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    // Make sure the Read() triggers a Read() on the input demuxer stream.
-    EXPECT_FALSE(pending_demuxer_read_cb_.is_null());
-  }
-
-  // Make the decrypt callback pending by saving and not firing it.
-  void EnterPendingDecryptState() {
-    EXPECT_TRUE(pending_decrypt_cb_.is_null());
-    EXPECT_CALL(*input_audio_stream_, Read(_))
-        .WillRepeatedly(ReturnBuffer(encrypted_buffer_));
-    EXPECT_CALL(*decryptor_, Decrypt(_, encrypted_buffer_, _))
-        .WillOnce(SaveArg<2>(&pending_decrypt_cb_));
-
-    demuxer_stream_->Read(base::Bind(&DecryptingDemuxerStreamTest::BufferReady,
-                                     base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    // Make sure Read() triggers a Decrypt() on the decryptor.
-    EXPECT_FALSE(pending_decrypt_cb_.is_null());
-  }
-
-  void EnterWaitingForKeyState() {
-    EXPECT_CALL(*input_audio_stream_, Read(_))
-        .WillRepeatedly(ReturnBuffer(encrypted_buffer_));
-    EXPECT_CALL(*decryptor_, Decrypt(_, encrypted_buffer_, _))
-        .WillRepeatedly(
-            RunCallback<2>(Decryptor::kNoKey, scoped_refptr<DecoderBuffer>()));
-    EXPECT_CALL(*this, OnWaitingForDecryptionKey());
-    demuxer_stream_->Read(base::Bind(&DecryptingDemuxerStreamTest::BufferReady,
-                                     base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void AbortPendingDecryptCB() {
-    if (!pending_decrypt_cb_.is_null()) {
-      base::ResetAndReturn(&pending_decrypt_cb_).Run(Decryptor::kSuccess, NULL);
-    }
-  }
-
-  void SatisfyPendingDemuxerReadCB(DemuxerStream::Status status) {
-    scoped_refptr<DecoderBuffer> buffer =
-        (status == DemuxerStream::kOk) ? encrypted_buffer_ : NULL;
-    base::ResetAndReturn(&pending_demuxer_read_cb_).Run(status, buffer);
-  }
-
-  void Reset() {
-    EXPECT_CALL(*decryptor_, CancelDecrypt(Decryptor::kAudio))
-        .WillRepeatedly(InvokeWithoutArgs(
-            this, &DecryptingDemuxerStreamTest::AbortPendingDecryptCB));
-
-    demuxer_stream_->Reset(NewExpectedClosure());
-    base::RunLoop().RunUntilIdle();
-  }
-
-  MOCK_METHOD2(BufferReady, void(DemuxerStream::Status,
-                                 const scoped_refptr<DecoderBuffer>&));
-  MOCK_METHOD0(OnWaitingForDecryptionKey, void(void));
-
-  base::MessageLoop message_loop_;
-  std::unique_ptr<DecryptingDemuxerStream> demuxer_stream_;
-  std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
-  std::unique_ptr<StrictMock<MockDecryptor>> decryptor_;
-  // Whether the |demuxer_stream_| is successfully initialized.
-  bool is_initialized_;
-  std::unique_ptr<StrictMock<MockDemuxerStream>> input_audio_stream_;
-  std::unique_ptr<StrictMock<MockDemuxerStream>> input_video_stream_;
-
-  DemuxerStream::ReadCB pending_demuxer_read_cb_;
-  Decryptor::NewKeyCB key_added_cb_;
-  Decryptor::DecryptCB pending_decrypt_cb_;
-
-  // Constant buffers to be returned by the input demuxer streams and the
-  // |decryptor_|.
-  scoped_refptr<DecoderBuffer> clear_buffer_;
-  scoped_refptr<DecoderBuffer> encrypted_buffer_;
-  scoped_refptr<DecoderBuffer> decrypted_buffer_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DecryptingDemuxerStreamTest);
-};
-
-TEST_F(DecryptingDemuxerStreamTest, Initialize_NormalAudio) { Initialize(); }
-
-TEST_F(DecryptingDemuxerStreamTest, Initialize_NormalVideo) {
-  SetCdmType(CDM_WITH_DECRYPTOR);
-  EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
-      .WillOnce(SaveArg<1>(&key_added_cb_));
-
-  VideoDecoderConfig input_config = TestVideoConfig::NormalEncrypted();
-  InitializeVideoAndExpectStatus(input_config, PIPELINE_OK);
-
-  const VideoDecoderConfig& output_config =
-      demuxer_stream_->video_decoder_config();
-  EXPECT_EQ(DemuxerStream::VIDEO, demuxer_stream_->type());
-  EXPECT_FALSE(output_config.is_encrypted());
-  EXPECT_EQ(input_config.codec(), output_config.codec());
-  EXPECT_EQ(input_config.format(), output_config.format());
-  EXPECT_EQ(input_config.profile(), output_config.profile());
-  EXPECT_EQ(input_config.coded_size(), output_config.coded_size());
-  EXPECT_EQ(input_config.visible_rect(), output_config.visible_rect());
-  EXPECT_EQ(input_config.natural_size(), output_config.natural_size());
-  ASSERT_EQ(input_config.extra_data(), output_config.extra_data());
-}
-
-TEST_F(DecryptingDemuxerStreamTest, Initialize_CdmWithoutDecryptor) {
-  SetCdmType(CDM_WITHOUT_DECRYPTOR);
-  AudioDecoderConfig input_config(kCodecVorbis, kSampleFormatPlanarF32,
-                                  CHANNEL_LAYOUT_STEREO, 44100,
-                                  EmptyExtraData(), AesCtrEncryptionScheme());
-  InitializeAudioAndExpectStatus(input_config, DECODER_ERROR_NOT_SUPPORTED);
-}
-
-// Test normal read case where the buffer is encrypted.
-TEST_F(DecryptingDemuxerStreamTest, Read_Normal) {
-  Initialize();
-  EnterNormalReadingState();
-}
-
-// Test normal read case where the buffer is clear.
-TEST_F(DecryptingDemuxerStreamTest, Read_Clear) {
-  Initialize();
-  EnterClearReadingState();
-}
-
-// Test the case where the decryptor returns error during read.
-TEST_F(DecryptingDemuxerStreamTest, Read_DecryptError) {
-  Initialize();
-
-  EXPECT_CALL(*input_audio_stream_, Read(_))
-      .WillRepeatedly(ReturnBuffer(encrypted_buffer_));
-  EXPECT_CALL(*decryptor_, Decrypt(_, encrypted_buffer_, _))
-      .WillRepeatedly(
-          RunCallback<2>(Decryptor::kError, scoped_refptr<DecoderBuffer>()));
-  ReadAndExpectBufferReadyWith(DemuxerStream::kAborted, NULL);
-}
-
-// Test the case where the input is an end-of-stream buffer.
-TEST_F(DecryptingDemuxerStreamTest, Read_EndOfStream) {
-  Initialize();
-  EnterNormalReadingState();
-
-  // No Decryptor::Decrypt() call is expected for EOS buffer.
-  EXPECT_CALL(*input_audio_stream_, Read(_))
-      .WillOnce(ReturnBuffer(DecoderBuffer::CreateEOSBuffer()));
-
-  ReadAndExpectBufferReadyWith(DemuxerStream::kOk,
-                               DecoderBuffer::CreateEOSBuffer());
-}
-
-// Test the case where the a key is added when the decryptor is in
-// kWaitingForKey state.
-TEST_F(DecryptingDemuxerStreamTest, KeyAdded_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*decryptor_, Decrypt(_, encrypted_buffer_, _))
-      .WillRepeatedly(RunCallback<2>(Decryptor::kSuccess, decrypted_buffer_));
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kOk, decrypted_buffer_));
-  key_added_cb_.Run();
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test the case where the a key is added when the decryptor is in
-// kPendingDecrypt state.
-TEST_F(DecryptingDemuxerStreamTest, KeyAdded_DuringPendingDecrypt) {
-  Initialize();
-  EnterPendingDecryptState();
-
-  EXPECT_CALL(*decryptor_, Decrypt(_, encrypted_buffer_, _))
-      .WillRepeatedly(RunCallback<2>(Decryptor::kSuccess, decrypted_buffer_));
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kOk, decrypted_buffer_));
-  // The decrypt callback is returned after the correct decryption key is added.
-  key_added_cb_.Run();
-  base::ResetAndReturn(&pending_decrypt_cb_).Run(Decryptor::kNoKey, NULL);
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test resetting in kIdle state but has not returned any buffer.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringIdleAfterInitialization) {
-  Initialize();
-  Reset();
-}
-
-// Test resetting in kIdle state after having returned one buffer.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringIdleAfterReadOneBuffer) {
-  Initialize();
-  EnterNormalReadingState();
-  Reset();
-}
-
-// Test resetting in kPendingDemuxerRead state.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDemuxerRead) {
-  Initialize();
-  EnterPendingReadState();
-
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-
-  Reset();
-  SatisfyPendingDemuxerReadCB(DemuxerStream::kOk);
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test resetting in kPendingDecrypt state.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDecrypt) {
-  Initialize();
-  EnterPendingDecryptState();
-
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-
-  Reset();
-}
-
-// Test resetting in kWaitingForKey state.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-
-  Reset();
-}
-
-// Test resetting after reset.
-TEST_F(DecryptingDemuxerStreamTest, Reset_AfterReset) {
-  Initialize();
-  EnterNormalReadingState();
-  Reset();
-  Reset();
-}
-
-// Test aborted read on the demuxer stream.
-TEST_F(DecryptingDemuxerStreamTest, DemuxerRead_Aborted) {
-  Initialize();
-
-  // ReturnBuffer() with NULL triggers aborted demuxer read.
-  EXPECT_CALL(*input_audio_stream_, Read(_))
-      .WillOnce(ReturnBuffer(scoped_refptr<DecoderBuffer>()));
-
-  ReadAndExpectBufferReadyWith(DemuxerStream::kAborted, NULL);
-}
-
-// Test resetting when waiting for an aborted read.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringAbortedDemuxerRead) {
-  Initialize();
-  EnterPendingReadState();
-
-  // Make sure we get a NULL audio frame returned.
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-
-  Reset();
-  SatisfyPendingDemuxerReadCB(DemuxerStream::kAborted);
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test config change on the input demuxer stream.
-TEST_F(DecryptingDemuxerStreamTest, DemuxerRead_ConfigChanged) {
-  Initialize();
-
-  AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarF32,
-                                CHANNEL_LAYOUT_STEREO, 88200, EmptyExtraData(),
-                                AesCtrEncryptionScheme());
-  input_audio_stream_->set_audio_decoder_config(new_config);
-
-  EXPECT_CALL(*input_audio_stream_, Read(_))
-      .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged,
-                               scoped_refptr<DecoderBuffer>()));
-
-  ReadAndExpectBufferReadyWith(DemuxerStream::kConfigChanged, NULL);
-}
-
-// Test resetting when waiting for a config changed read.
-TEST_F(DecryptingDemuxerStreamTest, Reset_DuringConfigChangedDemuxerRead) {
-  Initialize();
-  EnterPendingReadState();
-
-  // Make sure we get a |kConfigChanged| instead of a |kAborted|.
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kConfigChanged, IsNull()));
-
-  Reset();
-  SatisfyPendingDemuxerReadCB(DemuxerStream::kConfigChanged);
-  base::RunLoop().RunUntilIdle();
-}
-
-// The following tests test destruction in various scenarios. The destruction
-// happens in DecryptingDemuxerStreamTest's dtor.
-
-// Test destruction in kIdle state but has not returned any buffer.
-TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringIdleAfterInitialization) {
-  Initialize();
-}
-
-// Test destruction in kIdle state after having returned one buffer.
-TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringIdleAfterReadOneBuffer) {
-  Initialize();
-  EnterNormalReadingState();
-}
-
-// Test destruction in kPendingDemuxerRead state.
-TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringPendingDemuxerRead) {
-  Initialize();
-  EnterPendingReadState();
-
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-}
-
-// Test destruction in kPendingDecrypt state.
-TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringPendingDecrypt) {
-  Initialize();
-  EnterPendingDecryptState();
-
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-}
-
-// Test destruction in kWaitingForKey state.
-TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
-}
-
-// Test destruction after reset.
-TEST_F(DecryptingDemuxerStreamTest, Destroy_AfterReset) {
-  Initialize();
-  EnterNormalReadingState();
-  Reset();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/decrypting_video_decoder.cc b/src/cobalt/media/filters/decrypting_video_decoder.cc
deleted file mode 100644
index f395b38..0000000
--- a/src/cobalt/media/filters/decrypting_video_decoder.cc
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/decrypting_video_decoder.h"
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "base/string_number_conversions.h"
-#include "base/trace_event/trace_event.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/video_frame.h"
-
-namespace cobalt {
-namespace media {
-
-const char DecryptingVideoDecoder::kDecoderName[] = "DecryptingVideoDecoder";
-
-DecryptingVideoDecoder::DecryptingVideoDecoder(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    const scoped_refptr<MediaLog>& media_log,
-    const base::Closure& waiting_for_decryption_key_cb)
-    : task_runner_(task_runner),
-      media_log_(media_log),
-      state_(kUninitialized),
-      waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb),
-      decryptor_(NULL),
-      key_added_while_decode_pending_(false),
-      trace_id_(0),
-      weak_factory_(this) {}
-
-std::string DecryptingVideoDecoder::GetDisplayName() const {
-  return kDecoderName;
-}
-
-void DecryptingVideoDecoder::Initialize(const VideoDecoderConfig& config,
-                                        bool /* low_delay */,
-                                        CdmContext* cdm_context,
-                                        const InitCB& init_cb,
-                                        const OutputCB& output_cb) {
-  DVLOG(2) << __func__ << ": " << config.AsHumanReadableString();
-
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kUninitialized || state_ == kIdle ||
-         state_ == kDecodeFinished)
-      << state_;
-  DCHECK(decode_cb_.is_null());
-  DCHECK(reset_cb_.is_null());
-  DCHECK(config.IsValidConfig());
-  DCHECK(config.is_encrypted());
-
-  init_cb_ = BindToCurrentLoop(init_cb);
-  output_cb_ = BindToCurrentLoop(output_cb);
-  weak_this_ = weak_factory_.GetWeakPtr();
-  config_ = config;
-
-  if (state_ == kUninitialized) {
-    DCHECK(cdm_context);
-    if (!cdm_context->GetDecryptor()) {
-      MEDIA_LOG(DEBUG, media_log_) << GetDisplayName() << ": no decryptor";
-      base::ResetAndReturn(&init_cb_).Run(false);
-      return;
-    }
-
-    decryptor_ = cdm_context->GetDecryptor();
-  } else {
-    // Reinitialization.
-    decryptor_->DeinitializeDecoder(Decryptor::kVideo);
-  }
-
-  state_ = kPendingDecoderInit;
-  decryptor_->InitializeVideoDecoder(
-      config_, BindToCurrentLoop(base::Bind(
-                   &DecryptingVideoDecoder::FinishInitialization, weak_this_)));
-}
-
-void DecryptingVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
-                                    const DecodeCB& decode_cb) {
-  DVLOG(3) << "Decode()";
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kIdle || state_ == kDecodeFinished || state_ == kError)
-      << state_;
-  DCHECK(!decode_cb.is_null());
-  CHECK(decode_cb_.is_null()) << "Overlapping decodes are not supported.";
-
-  decode_cb_ = BindToCurrentLoop(decode_cb);
-
-  if (state_ == kError) {
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::DECODE_ERROR);
-    return;
-  }
-
-  // Return empty frames if decoding has finished.
-  if (state_ == kDecodeFinished) {
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::OK);
-    return;
-  }
-
-  pending_buffer_to_decode_ = buffer;
-  state_ = kPendingDecode;
-  DecodePendingBuffer();
-}
-
-void DecryptingVideoDecoder::Reset(const base::Closure& closure) {
-  DVLOG(2) << "Reset() - state: " << state_;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kIdle || state_ == kPendingDecode ||
-         state_ == kWaitingForKey || state_ == kDecodeFinished ||
-         state_ == kError)
-      << state_;
-  DCHECK(init_cb_.is_null());  // No Reset() during pending initialization.
-  DCHECK(reset_cb_.is_null());
-
-  reset_cb_ = BindToCurrentLoop(closure);
-
-  decryptor_->ResetDecoder(Decryptor::kVideo);
-
-  // Reset() cannot complete if the decode callback is still pending.
-  // Defer the resetting process in this case. The |reset_cb_| will be fired
-  // after the decode callback is fired - see DecryptAndDecodeBuffer() and
-  // DeliverFrame().
-  if (state_ == kPendingDecode) {
-    DCHECK(!decode_cb_.is_null());
-    return;
-  }
-
-  if (state_ == kWaitingForKey) {
-    DCHECK(!decode_cb_.is_null());
-    pending_buffer_to_decode_ = NULL;
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::ABORTED);
-  }
-
-  DCHECK(decode_cb_.is_null());
-  DoReset();
-}
-
-DecryptingVideoDecoder::~DecryptingVideoDecoder() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (state_ == kUninitialized) return;
-
-  if (decryptor_) {
-    decryptor_->DeinitializeDecoder(Decryptor::kVideo);
-    decryptor_ = NULL;
-  }
-  pending_buffer_to_decode_ = NULL;
-  if (!init_cb_.is_null()) base::ResetAndReturn(&init_cb_).Run(false);
-  if (!decode_cb_.is_null())
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::ABORTED);
-  if (!reset_cb_.is_null()) base::ResetAndReturn(&reset_cb_).Run();
-}
-
-void DecryptingVideoDecoder::FinishInitialization(bool success) {
-  DVLOG(2) << "FinishInitialization()";
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecoderInit) << state_;
-  DCHECK(!init_cb_.is_null());
-  DCHECK(reset_cb_.is_null());   // No Reset() before initialization finished.
-  DCHECK(decode_cb_.is_null());  // No Decode() before initialization finished.
-
-  if (!success) {
-    MEDIA_LOG(DEBUG, media_log_) << GetDisplayName()
-                                 << ": failed to init decoder on decryptor";
-    base::ResetAndReturn(&init_cb_).Run(false);
-    decryptor_ = NULL;
-    state_ = kError;
-    return;
-  }
-
-  decryptor_->RegisterNewKeyCB(
-      Decryptor::kVideo, BindToCurrentLoop(base::Bind(
-                             &DecryptingVideoDecoder::OnKeyAdded, weak_this_)));
-
-  // Success!
-  state_ = kIdle;
-  base::ResetAndReturn(&init_cb_).Run(true);
-}
-
-void DecryptingVideoDecoder::DecodePendingBuffer() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecode) << state_;
-  TRACE_EVENT_ASYNC_BEGIN0(
-      "media", "DecryptingVideoDecoder::DecodePendingBuffer", ++trace_id_);
-
-  int buffer_size = 0;
-  if (!pending_buffer_to_decode_->end_of_stream()) {
-    buffer_size = pending_buffer_to_decode_->data_size();
-  }
-
-  decryptor_->DecryptAndDecodeVideo(
-      pending_buffer_to_decode_,
-      BindToCurrentLoop(base::Bind(&DecryptingVideoDecoder::DeliverFrame,
-                                   weak_this_, buffer_size)));
-}
-
-void DecryptingVideoDecoder::DeliverFrame(
-    int buffer_size, Decryptor::Status status,
-    const scoped_refptr<VideoFrame>& frame) {
-  DVLOG(3) << "DeliverFrame() - status: " << status;
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPendingDecode) << state_;
-  DCHECK(!decode_cb_.is_null());
-  DCHECK(pending_buffer_to_decode_.get());
-
-  TRACE_EVENT_ASYNC_END2("media", "DecryptingVideoDecoder::DecodePendingBuffer",
-                         trace_id_, "buffer_size", buffer_size, "status",
-                         status);
-
-  bool need_to_try_again_if_nokey_is_returned = key_added_while_decode_pending_;
-  key_added_while_decode_pending_ = false;
-
-  scoped_refptr<DecoderBuffer> scoped_pending_buffer_to_decode =
-      pending_buffer_to_decode_;
-  pending_buffer_to_decode_ = NULL;
-
-  if (!reset_cb_.is_null()) {
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::ABORTED);
-    DoReset();
-    return;
-  }
-
-  DCHECK_EQ(status == Decryptor::kSuccess, frame.get() != NULL);
-
-  if (status == Decryptor::kError) {
-    DVLOG(2) << "DeliverFrame() - kError";
-    MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": decode error";
-    state_ = kError;
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::DECODE_ERROR);
-    return;
-  }
-
-  if (status == Decryptor::kNoKey) {
-    std::string key_id =
-        scoped_pending_buffer_to_decode->decrypt_config()->key_id();
-    std::string missing_key_id = base::HexEncode(key_id.data(), key_id.size());
-    DVLOG(1) << "DeliverFrame() - no key for key ID " << missing_key_id;
-    MEDIA_LOG(INFO, media_log_) << GetDisplayName() << ": no key for key ID "
-                                << missing_key_id;
-
-    // Set |pending_buffer_to_decode_| back as we need to try decoding the
-    // pending buffer again when new key is added to the decryptor.
-    pending_buffer_to_decode_ = scoped_pending_buffer_to_decode;
-
-    if (need_to_try_again_if_nokey_is_returned) {
-      // The |state_| is still kPendingDecode.
-      MEDIA_LOG(INFO, media_log_) << GetDisplayName()
-                                  << ": key was added, resuming decode";
-      DecodePendingBuffer();
-      return;
-    }
-
-    state_ = kWaitingForKey;
-    waiting_for_decryption_key_cb_.Run();
-    return;
-  }
-
-  if (status == Decryptor::kNeedMoreData) {
-    DVLOG(2) << "DeliverFrame() - kNeedMoreData";
-    state_ = scoped_pending_buffer_to_decode->end_of_stream() ? kDecodeFinished
-                                                              : kIdle;
-    base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::OK);
-    return;
-  }
-
-  DCHECK_EQ(status, Decryptor::kSuccess);
-  // No frame returned with kSuccess should be end-of-stream frame.
-  DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-  output_cb_.Run(frame);
-
-  if (scoped_pending_buffer_to_decode->end_of_stream()) {
-    // Set |pending_buffer_to_decode_| back as we need to keep flushing the
-    // decryptor.
-    pending_buffer_to_decode_ = scoped_pending_buffer_to_decode;
-    DecodePendingBuffer();
-    return;
-  }
-
-  state_ = kIdle;
-  base::ResetAndReturn(&decode_cb_).Run(DecodeStatus::OK);
-}
-
-void DecryptingVideoDecoder::OnKeyAdded() {
-  DVLOG(2) << "OnKeyAdded()";
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (state_ == kPendingDecode) {
-    key_added_while_decode_pending_ = true;
-    return;
-  }
-
-  if (state_ == kWaitingForKey) {
-    MEDIA_LOG(INFO, media_log_) << GetDisplayName()
-                                << ": key added, resuming decode";
-    state_ = kPendingDecode;
-    DecodePendingBuffer();
-  }
-}
-
-void DecryptingVideoDecoder::DoReset() {
-  DCHECK(init_cb_.is_null());
-  DCHECK(decode_cb_.is_null());
-  state_ = kIdle;
-  base::ResetAndReturn(&reset_cb_).Run();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/decrypting_video_decoder.h b/src/cobalt/media/filters/decrypting_video_decoder.h
deleted file mode 100644
index 3eb6552..0000000
--- a/src/cobalt/media/filters/decrypting_video_decoder.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
-#define COBALT_MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/decryptor.h"
-#include "cobalt/media/base/video_decoder.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/types.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace cobalt {
-namespace media {
-
-class DecoderBuffer;
-class Decryptor;
-class MediaLog;
-
-// Decryptor-based VideoDecoder implementation that can decrypt and decode
-// encrypted video buffers and return decrypted and decompressed video frames.
-// All public APIs and callbacks are trampolined to the |task_runner_| so
-// that no locks are required for thread safety.
-class MEDIA_EXPORT DecryptingVideoDecoder : public VideoDecoder {
- public:
-  DecryptingVideoDecoder(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const scoped_refptr<MediaLog>& media_log,
-      const base::Closure& waiting_for_decryption_key_cb);
-  ~DecryptingVideoDecoder() OVERRIDE;
-
-  // VideoDecoder implementation.
-  std::string GetDisplayName() const OVERRIDE;
-  void Initialize(const VideoDecoderConfig& config, bool low_delay,
-                  CdmContext* cdm_context, const InitCB& init_cb,
-                  const OutputCB& output_cb) OVERRIDE;
-  void Decode(const scoped_refptr<DecoderBuffer>& buffer,
-              const DecodeCB& decode_cb) OVERRIDE;
-  void Reset(const base::Closure& closure) OVERRIDE;
-
-  static const char kDecoderName[];
-
- private:
-  // For a detailed state diagram please see this link: http://goo.gl/8jAok
-  // TODO(xhwang): Add a ASCII state diagram in this file after this class
-  // stabilizes.
-  enum State {
-    kUninitialized = 0,
-    kPendingDecoderInit,
-    kIdle,
-    kPendingDecode,
-    kWaitingForKey,
-    kDecodeFinished,
-    kError
-  };
-
-  // Callback for Decryptor::InitializeVideoDecoder() during initialization.
-  void FinishInitialization(bool success);
-
-  void DecodePendingBuffer();
-
-  // Callback for Decryptor::DecryptAndDecodeVideo().
-  void DeliverFrame(int buffer_size, Decryptor::Status status,
-                    const scoped_refptr<VideoFrame>& frame);
-
-  // Callback for the |decryptor_| to notify this object that a new key has been
-  // added.
-  void OnKeyAdded();
-
-  // Reset decoder and call |reset_cb_|.
-  void DoReset();
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  scoped_refptr<MediaLog> media_log_;
-
-  State state_;
-
-  InitCB init_cb_;
-  OutputCB output_cb_;
-  DecodeCB decode_cb_;
-  base::Closure reset_cb_;
-  base::Closure waiting_for_decryption_key_cb_;
-
-  VideoDecoderConfig config_;
-
-  Decryptor* decryptor_;
-
-  // The buffer that needs decrypting/decoding.
-  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_;
-
-  // Indicates the situation where new key is added during pending decode
-  // (in other words, this variable can only be set in state kPendingDecode).
-  // If this variable is true and kNoKey is returned then we need to try
-  // decrypting/decoding again in case the newly added key is the correct
-  // decryption key.
-  bool key_added_while_decode_pending_;
-
-  // A unique ID to trace Decryptor::DecryptAndDecodeVideo() call and the
-  // matching DecryptCB call (in DoDeliverFrame()).
-  uint32_t trace_id_;
-
-  base::WeakPtr<DecryptingVideoDecoder> weak_this_;
-  base::WeakPtrFactory<DecryptingVideoDecoder> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(DecryptingVideoDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
diff --git a/src/cobalt/media/filters/decrypting_video_decoder_unittest.cc b/src/cobalt/media/filters/decrypting_video_decoder_unittest.cc
deleted file mode 100644
index 683b2ba..0000000
--- a/src/cobalt/media/filters/decrypting_video_decoder_unittest.cc
+++ /dev/null
@@ -1,481 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/video_frame.h"
-#include "cobalt/media/filters/decrypting_video_decoder.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-using ::testing::_;
-using ::testing::Invoke;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-const uint8_t kFakeKeyId[] = {0x4b, 0x65, 0x79, 0x20, 0x49, 0x44};
-const uint8_t kFakeIv[DecryptConfig::kDecryptionKeySize] = {0};
-const int kDecodingDelay = 3;
-
-// Create a fake non-empty encrypted buffer.
-static scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() {
-  const int buffer_size = 16;  // Need a non-empty buffer;
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(buffer_size));
-  buffer->set_decrypt_config(std::unique_ptr<DecryptConfig>(new DecryptConfig(
-      std::string(reinterpret_cast<const char*>(kFakeKeyId),
-                  arraysize(kFakeKeyId)),
-      std::string(reinterpret_cast<const char*>(kFakeIv), arraysize(kFakeIv)),
-      std::vector<SubsampleEntry>())));
-  return buffer;
-}
-
-// Use anonymous namespace here to prevent the actions to be defined multiple
-// times across multiple test files. Sadly we can't use static for them.
-namespace {
-
-ACTION_P3(ResetAndRunCallback, callback, p1, p2) {
-  base::ResetAndReturn(callback).Run(p1, p2);
-}
-
-}  // namespace
-
-class DecryptingVideoDecoderTest : public testing::Test {
- public:
-  DecryptingVideoDecoderTest()
-      : decoder_(new DecryptingVideoDecoder(
-            message_loop_.task_runner(), new MediaLog(),
-            base::Bind(&DecryptingVideoDecoderTest::OnWaitingForDecryptionKey,
-                       base::Unretained(this)))),
-        cdm_context_(new StrictMock<MockCdmContext>()),
-        decryptor_(new StrictMock<MockDecryptor>()),
-        num_decrypt_and_decode_calls_(0),
-        num_frames_in_decryptor_(0),
-        encrypted_buffer_(CreateFakeEncryptedBuffer()),
-        decoded_video_frame_(
-            VideoFrame::CreateBlackFrame(TestVideoConfig::NormalCodedSize())),
-        null_video_frame_(scoped_refptr<VideoFrame>()) {}
-
-  virtual ~DecryptingVideoDecoderTest() { Destroy(); }
-
-  enum CdmType { CDM_WITHOUT_DECRYPTOR, CDM_WITH_DECRYPTOR };
-
-  void SetCdmType(CdmType cdm_type) {
-    const bool has_decryptor = cdm_type == CDM_WITH_DECRYPTOR;
-    EXPECT_CALL(*cdm_context_, GetDecryptor())
-        .WillRepeatedly(Return(has_decryptor ? decryptor_.get() : NULL));
-  }
-
-  // Initializes the |decoder_| and expects |success|. Note the initialization
-  // can succeed or fail.
-  void InitializeAndExpectResult(const VideoDecoderConfig& config,
-                                 bool success) {
-    decoder_->Initialize(config, false, cdm_context_.get(),
-                         NewExpectedBoolCB(success),
-                         base::Bind(&DecryptingVideoDecoderTest::FrameReady,
-                                    base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Initialize the |decoder_| and expects it to succeed.
-  void Initialize() {
-    SetCdmType(CDM_WITH_DECRYPTOR);
-    EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-        .WillOnce(RunCallback<1>(true));
-    EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
-        .WillOnce(SaveArg<1>(&key_added_cb_));
-
-    InitializeAndExpectResult(TestVideoConfig::NormalEncrypted(), true);
-  }
-
-  // Reinitialize the |decoder_| and expects it to succeed.
-  void Reinitialize() {
-    EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kVideo));
-    EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-        .WillOnce(RunCallback<1>(true));
-    EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
-        .WillOnce(SaveArg<1>(&key_added_cb_));
-
-    InitializeAndExpectResult(TestVideoConfig::LargeEncrypted(), true);
-  }
-
-  // Decode |buffer| and expect DecodeDone to get called with |status|.
-  void DecodeAndExpect(const scoped_refptr<DecoderBuffer>& buffer,
-                       DecodeStatus status) {
-    EXPECT_CALL(*this, DecodeDone(status));
-    decoder_->Decode(buffer, base::Bind(&DecryptingVideoDecoderTest::DecodeDone,
-                                        base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Helper function to simulate the decrypting and decoding process in the
-  // |decryptor_| with a decoding delay of kDecodingDelay buffers.
-  void DecryptAndDecodeVideo(const scoped_refptr<DecoderBuffer>& encrypted,
-                             const Decryptor::VideoDecodeCB& video_decode_cb) {
-    num_decrypt_and_decode_calls_++;
-    if (!encrypted->end_of_stream()) num_frames_in_decryptor_++;
-
-    if (num_decrypt_and_decode_calls_ <= kDecodingDelay ||
-        num_frames_in_decryptor_ == 0) {
-      video_decode_cb.Run(Decryptor::kNeedMoreData,
-                          scoped_refptr<VideoFrame>());
-      return;
-    }
-
-    num_frames_in_decryptor_--;
-    video_decode_cb.Run(Decryptor::kSuccess, decoded_video_frame_);
-  }
-
-  // Sets up expectations and actions to put DecryptingVideoDecoder in an
-  // active normal decoding state.
-  void EnterNormalDecodingState() {
-    EXPECT_CALL(*decryptor_, DecryptAndDecodeVideo(_, _))
-        .WillRepeatedly(
-            Invoke(this, &DecryptingVideoDecoderTest::DecryptAndDecodeVideo));
-    EXPECT_CALL(*this, FrameReady(decoded_video_frame_));
-    for (int i = 0; i < kDecodingDelay + 1; ++i)
-      DecodeAndExpect(encrypted_buffer_, DecodeStatus::OK);
-  }
-
-  // Sets up expectations and actions to put DecryptingVideoDecoder in an end
-  // of stream state. This function must be called after
-  // EnterNormalDecodingState() to work.
-  void EnterEndOfStreamState() {
-    // The codec in the |decryptor_| will be flushed.
-    EXPECT_CALL(*this, FrameReady(decoded_video_frame_)).Times(kDecodingDelay);
-    DecodeAndExpect(DecoderBuffer::CreateEOSBuffer(), DecodeStatus::OK);
-    EXPECT_EQ(0, num_frames_in_decryptor_);
-  }
-
-  // Make the video decode callback pending by saving and not firing it.
-  void EnterPendingDecodeState() {
-    EXPECT_TRUE(pending_video_decode_cb_.is_null());
-    EXPECT_CALL(*decryptor_, DecryptAndDecodeVideo(encrypted_buffer_, _))
-        .WillOnce(SaveArg<1>(&pending_video_decode_cb_));
-
-    decoder_->Decode(encrypted_buffer_,
-                     base::Bind(&DecryptingVideoDecoderTest::DecodeDone,
-                                base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    // Make sure the Decode() on the decoder triggers a DecryptAndDecode() on
-    // the decryptor.
-    EXPECT_FALSE(pending_video_decode_cb_.is_null());
-  }
-
-  void EnterWaitingForKeyState() {
-    EXPECT_CALL(*decryptor_, DecryptAndDecodeVideo(_, _))
-        .WillRepeatedly(RunCallback<1>(Decryptor::kNoKey, null_video_frame_));
-    EXPECT_CALL(*this, OnWaitingForDecryptionKey());
-    decoder_->Decode(encrypted_buffer_,
-                     base::Bind(&DecryptingVideoDecoderTest::DecodeDone,
-                                base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void AbortPendingVideoDecodeCB() {
-    if (!pending_video_decode_cb_.is_null()) {
-      base::ResetAndReturn(&pending_video_decode_cb_)
-          .Run(Decryptor::kSuccess, scoped_refptr<VideoFrame>(NULL));
-    }
-  }
-
-  void AbortAllPendingCBs() {
-    if (!pending_init_cb_.is_null()) {
-      ASSERT_TRUE(pending_video_decode_cb_.is_null());
-      base::ResetAndReturn(&pending_init_cb_).Run(false);
-      return;
-    }
-
-    AbortPendingVideoDecodeCB();
-  }
-
-  void Reset() {
-    EXPECT_CALL(*decryptor_, ResetDecoder(Decryptor::kVideo))
-        .WillRepeatedly(InvokeWithoutArgs(
-            this, &DecryptingVideoDecoderTest::AbortPendingVideoDecodeCB));
-
-    decoder_->Reset(NewExpectedClosure());
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void Destroy() {
-    EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kVideo))
-        .WillRepeatedly(InvokeWithoutArgs(
-            this, &DecryptingVideoDecoderTest::AbortAllPendingCBs));
-
-    decoder_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  MOCK_METHOD1(FrameReady, void(const scoped_refptr<VideoFrame>&));
-  MOCK_METHOD1(DecodeDone, void(DecodeStatus));
-
-  MOCK_METHOD0(OnWaitingForDecryptionKey, void(void));
-
-  base::MessageLoop message_loop_;
-  std::unique_ptr<DecryptingVideoDecoder> decoder_;
-  std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
-  std::unique_ptr<StrictMock<MockDecryptor>> decryptor_;
-
-  // Variables to help the |decryptor_| to simulate decoding delay and flushing.
-  int num_decrypt_and_decode_calls_;
-  int num_frames_in_decryptor_;
-
-  Decryptor::DecoderInitCB pending_init_cb_;
-  Decryptor::NewKeyCB key_added_cb_;
-  Decryptor::VideoDecodeCB pending_video_decode_cb_;
-
-  // Constant buffer/frames.
-  scoped_refptr<DecoderBuffer> encrypted_buffer_;
-  scoped_refptr<VideoFrame> decoded_video_frame_;
-  scoped_refptr<VideoFrame> null_video_frame_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DecryptingVideoDecoderTest);
-};
-
-TEST_F(DecryptingVideoDecoderTest, Initialize_Normal) { Initialize(); }
-
-TEST_F(DecryptingVideoDecoderTest, Initialize_CdmWithoutDecryptor) {
-  SetCdmType(CDM_WITHOUT_DECRYPTOR);
-  InitializeAndExpectResult(TestVideoConfig::NormalEncrypted(), false);
-}
-
-TEST_F(DecryptingVideoDecoderTest, Initialize_Failure) {
-  SetCdmType(CDM_WITH_DECRYPTOR);
-  EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-      .WillRepeatedly(RunCallback<1>(false));
-  EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
-      .WillRepeatedly(SaveArg<1>(&key_added_cb_));
-
-  InitializeAndExpectResult(TestVideoConfig::NormalEncrypted(), false);
-}
-
-TEST_F(DecryptingVideoDecoderTest, Reinitialize_Normal) {
-  Initialize();
-  EnterNormalDecodingState();
-  Reinitialize();
-}
-
-TEST_F(DecryptingVideoDecoderTest, Reinitialize_Failure) {
-  Initialize();
-  EnterNormalDecodingState();
-
-  EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kVideo));
-  EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-      .WillOnce(RunCallback<1>(false));
-
-  // Reinitialize() expects the reinitialization to succeed. Call
-  // InitializeAndExpectResult() directly to test the reinitialization failure.
-  InitializeAndExpectResult(TestVideoConfig::NormalEncrypted(), false);
-}
-
-// Test normal decrypt and decode case.
-TEST_F(DecryptingVideoDecoderTest, DecryptAndDecode_Normal) {
-  Initialize();
-  EnterNormalDecodingState();
-}
-
-// Test the case where the decryptor returns error when doing decrypt and
-// decode.
-TEST_F(DecryptingVideoDecoderTest, DecryptAndDecode_DecodeError) {
-  Initialize();
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeVideo(_, _))
-      .WillRepeatedly(
-          RunCallback<1>(Decryptor::kError, scoped_refptr<VideoFrame>(NULL)));
-
-  DecodeAndExpect(encrypted_buffer_, DecodeStatus::DECODE_ERROR);
-
-  // After a decode error occurred, all following decodes return DECODE_ERROR.
-  DecodeAndExpect(encrypted_buffer_, DecodeStatus::DECODE_ERROR);
-}
-
-// Test the case where the decryptor receives end-of-stream buffer.
-TEST_F(DecryptingVideoDecoderTest, DecryptAndDecode_EndOfStream) {
-  Initialize();
-  EnterNormalDecodingState();
-  EnterEndOfStreamState();
-}
-
-// Test the case where the a key is added when the decryptor is in
-// kWaitingForKey state.
-TEST_F(DecryptingVideoDecoderTest, KeyAdded_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeVideo(_, _))
-      .WillRepeatedly(
-          RunCallback<1>(Decryptor::kSuccess, decoded_video_frame_));
-  EXPECT_CALL(*this, FrameReady(decoded_video_frame_));
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::OK));
-  key_added_cb_.Run();
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test the case where the a key is added when the decryptor is in
-// kPendingDecode state.
-TEST_F(DecryptingVideoDecoderTest, KeyAdded_DuringPendingDecode) {
-  Initialize();
-  EnterPendingDecodeState();
-
-  EXPECT_CALL(*decryptor_, DecryptAndDecodeVideo(_, _))
-      .WillRepeatedly(
-          RunCallback<1>(Decryptor::kSuccess, decoded_video_frame_));
-  EXPECT_CALL(*this, FrameReady(decoded_video_frame_));
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::OK));
-  // The video decode callback is returned after the correct decryption key is
-  // added.
-  key_added_cb_.Run();
-  base::ResetAndReturn(&pending_video_decode_cb_)
-      .Run(Decryptor::kNoKey, null_video_frame_);
-  base::RunLoop().RunUntilIdle();
-}
-
-// Test resetting when the decoder is in kIdle state but has not decoded any
-// frame.
-TEST_F(DecryptingVideoDecoderTest, Reset_DuringIdleAfterInitialization) {
-  Initialize();
-  Reset();
-}
-
-// Test resetting when the decoder is in kIdle state after it has decoded one
-// frame.
-TEST_F(DecryptingVideoDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) {
-  Initialize();
-  EnterNormalDecodingState();
-  Reset();
-}
-
-// Test resetting when the decoder is in kPendingDecode state.
-TEST_F(DecryptingVideoDecoderTest, Reset_DuringPendingDecode) {
-  Initialize();
-  EnterPendingDecodeState();
-
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  Reset();
-}
-
-// Test resetting when the decoder is in kWaitingForKey state.
-TEST_F(DecryptingVideoDecoderTest, Reset_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  Reset();
-}
-
-// Test resetting when the decoder has hit end of stream and is in
-// kDecodeFinished state.
-TEST_F(DecryptingVideoDecoderTest, Reset_AfterDecodeFinished) {
-  Initialize();
-  EnterNormalDecodingState();
-  EnterEndOfStreamState();
-  Reset();
-}
-
-// Test resetting after the decoder has been reset.
-TEST_F(DecryptingVideoDecoderTest, Reset_AfterReset) {
-  Initialize();
-  EnterNormalDecodingState();
-  Reset();
-  Reset();
-}
-
-// Test destruction when the decoder is in kPendingDecoderInit state.
-TEST_F(DecryptingVideoDecoderTest, Destroy_DuringPendingDecoderInit) {
-  SetCdmType(CDM_WITH_DECRYPTOR);
-  EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-      .WillOnce(SaveArg<1>(&pending_init_cb_));
-
-  InitializeAndExpectResult(TestVideoConfig::NormalEncrypted(), false);
-  EXPECT_FALSE(pending_init_cb_.is_null());
-
-  Destroy();
-}
-
-// Test destruction when the decoder is in kIdle state but has not decoded any
-// frame.
-TEST_F(DecryptingVideoDecoderTest, Destroy_DuringIdleAfterInitialization) {
-  Initialize();
-  Destroy();
-}
-
-// Test destruction when the decoder is in kIdle state after it has decoded one
-// frame.
-TEST_F(DecryptingVideoDecoderTest, Destroy_DuringIdleAfterDecodedOneFrame) {
-  Initialize();
-  EnterNormalDecodingState();
-  Destroy();
-}
-
-// Test destruction when the decoder is in kPendingDecode state.
-TEST_F(DecryptingVideoDecoderTest, Destroy_DuringPendingDecode) {
-  Initialize();
-  EnterPendingDecodeState();
-
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  Destroy();
-}
-
-// Test destruction when the decoder is in kWaitingForKey state.
-TEST_F(DecryptingVideoDecoderTest, Destroy_DuringWaitingForKey) {
-  Initialize();
-  EnterWaitingForKeyState();
-
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  Destroy();
-}
-
-// Test destruction when the decoder has hit end of stream and is in
-// kDecodeFinished state.
-TEST_F(DecryptingVideoDecoderTest, Destroy_AfterDecodeFinished) {
-  Initialize();
-  EnterNormalDecodingState();
-  EnterEndOfStreamState();
-  Destroy();
-}
-
-// Test destruction when there is a pending reset on the decoder.
-// Reset is pending because it cannot complete when the video decode callback
-// is pending.
-TEST_F(DecryptingVideoDecoderTest, Destroy_DuringPendingReset) {
-  Initialize();
-  EnterPendingDecodeState();
-
-  EXPECT_CALL(*decryptor_, ResetDecoder(Decryptor::kVideo));
-  EXPECT_CALL(*this, DecodeDone(DecodeStatus::ABORTED));
-
-  decoder_->Reset(NewExpectedClosure());
-  Destroy();
-}
-
-// Test destruction after the decoder has been reset.
-TEST_F(DecryptingVideoDecoderTest, Destroy_AfterReset) {
-  Initialize();
-  EnterNormalDecodingState();
-  Reset();
-  Destroy();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/fake_video_decoder.cc b/src/cobalt/media/filters/fake_video_decoder.cc
deleted file mode 100644
index 25295ff..0000000
--- a/src/cobalt/media/filters/fake_video_decoder.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/fake_video_decoder.h"
-
-#include "base/location.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/test_helpers.h"
-
-namespace cobalt {
-namespace media {
-
-FakeVideoDecoder::FakeVideoDecoder(int decoding_delay,
-                                   int max_parallel_decoding_requests,
-                                   const BytesDecodedCB& bytes_decoded_cb)
-    : decoding_delay_(decoding_delay),
-      max_parallel_decoding_requests_(max_parallel_decoding_requests),
-      bytes_decoded_cb_(bytes_decoded_cb),
-      state_(STATE_UNINITIALIZED),
-      hold_decode_(false),
-      total_bytes_decoded_(0),
-      fail_to_initialize_(false),
-      weak_factory_(this) {
-  DCHECK_GE(decoding_delay, 0);
-}
-
-FakeVideoDecoder::~FakeVideoDecoder() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (state_ == STATE_UNINITIALIZED) return;
-
-  if (!init_cb_.IsNull()) SatisfyInit();
-  if (!held_decode_callbacks_.empty()) SatisfyDecode();
-  if (!reset_cb_.IsNull()) SatisfyReset();
-
-  decoded_frames_.clear();
-}
-
-std::string FakeVideoDecoder::GetDisplayName() const {
-  return "FakeVideoDecoder";
-}
-
-void FakeVideoDecoder::Initialize(const VideoDecoderConfig& config,
-                                  bool low_delay, CdmContext* /* cdm_context */,
-                                  const InitCB& init_cb,
-                                  const OutputCB& output_cb) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(config.IsValidConfig());
-  DCHECK(held_decode_callbacks_.empty())
-      << "No reinitialization during pending decode.";
-  DCHECK(reset_cb_.IsNull()) << "No reinitialization during pending reset.";
-
-  current_config_ = config;
-  init_cb_.SetCallback(BindToCurrentLoop(init_cb));
-
-  // Don't need BindToCurrentLoop() because |output_cb_| is only called from
-  // RunDecodeCallback() which is posted from Decode().
-  output_cb_ = output_cb;
-
-  if (!decoded_frames_.empty()) {
-    DVLOG(1) << "Decoded frames dropped during reinitialization.";
-    decoded_frames_.clear();
-  }
-
-  if (fail_to_initialize_) {
-    state_ = STATE_ERROR;
-    init_cb_.RunOrHold(false);
-  } else {
-    state_ = STATE_NORMAL;
-    init_cb_.RunOrHold(true);
-  }
-}
-
-void FakeVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
-                              const DecodeCB& decode_cb) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(reset_cb_.IsNull());
-  DCHECK_LE(decoded_frames_.size(),
-            decoding_delay_ + held_decode_callbacks_.size());
-  DCHECK_LT(static_cast<int>(held_decode_callbacks_.size()),
-            max_parallel_decoding_requests_);
-  DCHECK_NE(state_, STATE_END_OF_STREAM);
-
-  int buffer_size = buffer->end_of_stream() ? 0 : buffer->data_size();
-  DecodeCB wrapped_decode_cb =
-      base::Bind(&FakeVideoDecoder::OnFrameDecoded, weak_factory_.GetWeakPtr(),
-                 buffer_size, BindToCurrentLoop(decode_cb));
-
-  if (state_ == STATE_ERROR) {
-    wrapped_decode_cb.Run(DecodeStatus::DECODE_ERROR);
-    return;
-  }
-
-  if (buffer->end_of_stream()) {
-    state_ = STATE_END_OF_STREAM;
-  } else {
-    DCHECK(VerifyFakeVideoBufferForTest(buffer, current_config_));
-    scoped_refptr<VideoFrame> video_frame = VideoFrame::CreateColorFrame(
-        current_config_.coded_size(), 0, 0, 0, buffer->timestamp());
-    decoded_frames_.push_back(video_frame);
-  }
-
-  RunOrHoldDecode(wrapped_decode_cb);
-}
-
-void FakeVideoDecoder::Reset(const base::Closure& closure) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(reset_cb_.IsNull());
-
-  reset_cb_.SetCallback(BindToCurrentLoop(closure));
-  decoded_frames_.clear();
-
-  // Defer the reset if a decode is pending.
-  if (!held_decode_callbacks_.empty()) return;
-
-  DoReset();
-}
-
-void FakeVideoDecoder::HoldNextInit() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  init_cb_.HoldCallback();
-}
-
-void FakeVideoDecoder::HoldDecode() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  hold_decode_ = true;
-}
-
-void FakeVideoDecoder::HoldNextReset() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  reset_cb_.HoldCallback();
-}
-
-void FakeVideoDecoder::SatisfyInit() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(held_decode_callbacks_.empty());
-  DCHECK(reset_cb_.IsNull());
-
-  init_cb_.RunHeldCallback();
-}
-
-void FakeVideoDecoder::SatisfyDecode() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(hold_decode_);
-
-  hold_decode_ = false;
-
-  while (!held_decode_callbacks_.empty()) {
-    SatisfySingleDecode();
-  }
-}
-
-void FakeVideoDecoder::SatisfySingleDecode() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!held_decode_callbacks_.empty());
-
-  DecodeCB decode_cb = held_decode_callbacks_.front();
-  held_decode_callbacks_.pop_front();
-  RunDecodeCallback(decode_cb);
-
-  if (!reset_cb_.IsNull() && held_decode_callbacks_.empty()) DoReset();
-}
-
-void FakeVideoDecoder::SatisfyReset() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(held_decode_callbacks_.empty());
-  reset_cb_.RunHeldCallback();
-}
-
-void FakeVideoDecoder::SimulateError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  state_ = STATE_ERROR;
-  while (!held_decode_callbacks_.empty()) {
-    held_decode_callbacks_.front().Run(DecodeStatus::DECODE_ERROR);
-    held_decode_callbacks_.pop_front();
-  }
-  decoded_frames_.clear();
-}
-
-void FakeVideoDecoder::SimulateFailureToInit() { fail_to_initialize_ = true; }
-
-int FakeVideoDecoder::GetMaxDecodeRequests() const {
-  return max_parallel_decoding_requests_;
-}
-
-void FakeVideoDecoder::OnFrameDecoded(int buffer_size,
-                                      const DecodeCB& decode_cb,
-                                      DecodeStatus status) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (status == DecodeStatus::OK) {
-    total_bytes_decoded_ += buffer_size;
-    bytes_decoded_cb_.Run(buffer_size);
-  }
-  decode_cb.Run(status);
-}
-
-void FakeVideoDecoder::RunOrHoldDecode(const DecodeCB& decode_cb) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (hold_decode_) {
-    held_decode_callbacks_.push_back(decode_cb);
-  } else {
-    DCHECK(held_decode_callbacks_.empty());
-    RunDecodeCallback(decode_cb);
-  }
-}
-
-void FakeVideoDecoder::RunDecodeCallback(const DecodeCB& decode_cb) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!reset_cb_.IsNull()) {
-    DCHECK(decoded_frames_.empty());
-    decode_cb.Run(DecodeStatus::ABORTED);
-    return;
-  }
-
-  // Make sure we leave decoding_delay_ frames in the queue and also frames for
-  // all pending decode callbacks, except the current one.
-  if (decoded_frames_.size() >
-      decoding_delay_ + held_decode_callbacks_.size()) {
-    output_cb_.Run(decoded_frames_.front());
-    decoded_frames_.pop_front();
-  } else if (state_ == STATE_END_OF_STREAM) {
-    // Drain the queue if this was the last request in the stream, otherwise
-    // just pop the last frame from the queue.
-    if (held_decode_callbacks_.empty()) {
-      while (!decoded_frames_.empty()) {
-        output_cb_.Run(decoded_frames_.front());
-        decoded_frames_.pop_front();
-      }
-      state_ = STATE_NORMAL;
-    } else if (!decoded_frames_.empty()) {
-      output_cb_.Run(decoded_frames_.front());
-      decoded_frames_.pop_front();
-    }
-  }
-
-  decode_cb.Run(DecodeStatus::OK);
-}
-
-void FakeVideoDecoder::DoReset() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(held_decode_callbacks_.empty());
-  DCHECK(!reset_cb_.IsNull());
-
-  reset_cb_.RunOrHold();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/fake_video_decoder.h b/src/cobalt/media/filters/fake_video_decoder.h
deleted file mode 100644
index 4f1af47..0000000
--- a/src/cobalt/media/filters/fake_video_decoder.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_
-#define COBALT_MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_
-
-#include <list>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "cobalt/media/base/callback_holder.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/video_decoder.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/base/video_frame.h"
-#include "starboard/types.h"
-#include "ui/gfx/size.h"
-
-using base::ResetAndReturn;
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace cobalt {
-namespace media {
-
-typedef base::Callback<void(int)> BytesDecodedCB;
-
-class FakeVideoDecoder : public VideoDecoder {
- public:
-  // Constructs an object with a decoding delay of |decoding_delay| frames.
-  // |bytes_decoded_cb| is called after each decode. The sum of the byte
-  // count over all calls will be equal to total_bytes_decoded().
-  FakeVideoDecoder(int decoding_delay, int max_parallel_decoding_requests,
-                   const BytesDecodedCB& bytes_decoded_cb);
-  ~FakeVideoDecoder() OVERRIDE;
-
-  // VideoDecoder implementation.
-  std::string GetDisplayName() const OVERRIDE;
-  void Initialize(const VideoDecoderConfig& config, bool low_delay,
-                  CdmContext* cdm_context, const InitCB& init_cb,
-                  const OutputCB& output_cb) OVERRIDE;
-  void Decode(const scoped_refptr<DecoderBuffer>& buffer,
-              const DecodeCB& decode_cb) OVERRIDE;
-  void Reset(const base::Closure& closure) OVERRIDE;
-  int GetMaxDecodeRequests() const OVERRIDE;
-
-  // Holds the next init/decode/reset callback from firing.
-  void HoldNextInit();
-  void HoldDecode();
-  void HoldNextReset();
-
-  // Satisfies the pending init/decode/reset callback, which must be ready to
-  // fire when these methods are called.
-  void SatisfyInit();
-  void SatisfyDecode();
-  void SatisfyReset();
-
-  // Satisfies single  decode request.
-  void SatisfySingleDecode();
-
-  void SimulateError();
-  // Fail with status DECODER_ERROR_NOT_SUPPORTED when Initialize() is called.
-  void SimulateFailureToInit();
-
-  int total_bytes_decoded() const { return total_bytes_decoded_; }
-
- private:
-  enum State {
-    STATE_UNINITIALIZED,
-    STATE_NORMAL,
-    STATE_END_OF_STREAM,
-    STATE_ERROR,
-  };
-
-  // Callback for updating |total_bytes_decoded_|.
-  void OnFrameDecoded(int buffer_size, const DecodeCB& decode_cb,
-                      DecodeStatus status);
-
-  // Runs |decode_cb| or puts it to |held_decode_callbacks_| depending on
-  // current value of |hold_decode_|.
-  void RunOrHoldDecode(const DecodeCB& decode_cb);
-
-  // Runs |decode_cb| with a frame from |decoded_frames_|.
-  void RunDecodeCallback(const DecodeCB& decode_cb);
-
-  void DoReset();
-
-  base::ThreadChecker thread_checker_;
-
-  const size_t decoding_delay_;
-  const int max_parallel_decoding_requests_;
-  BytesDecodedCB bytes_decoded_cb_;
-
-  State state_;
-
-  CallbackHolder<InitCB> init_cb_;
-  CallbackHolder<base::Closure> reset_cb_;
-
-  OutputCB output_cb_;
-
-  bool hold_decode_;
-  std::list<DecodeCB> held_decode_callbacks_;
-
-  VideoDecoderConfig current_config_;
-
-  std::list<scoped_refptr<VideoFrame> > decoded_frames_;
-
-  int total_bytes_decoded_;
-
-  bool fail_to_initialize_;
-
-  // NOTE: Weak pointers must be invalidated before all other member variables.
-  base::WeakPtrFactory<FakeVideoDecoder> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeVideoDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_FAKE_VIDEO_DECODER_H_
diff --git a/src/cobalt/media/filters/fake_video_decoder_unittest.cc b/src/cobalt/media/filters/fake_video_decoder_unittest.cc
deleted file mode 100644
index bb5a229..0000000
--- a/src/cobalt/media/filters/fake_video_decoder_unittest.cc
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/video_frame.h"
-#include "cobalt/media/filters/fake_video_decoder.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static const int kTotalBuffers = 12;
-static const int kDurationMs = 30;
-
-struct FakeVideoDecoderTestParams {
-  FakeVideoDecoderTestParams(int decoding_delay, int max_decode_requests)
-      : decoding_delay(decoding_delay),
-        max_decode_requests(max_decode_requests) {}
-  int decoding_delay;
-  int max_decode_requests;
-};
-
-class FakeVideoDecoderTest
-    : public testing::Test,
-      public testing::WithParamInterface<FakeVideoDecoderTestParams> {
- public:
-  FakeVideoDecoderTest()
-      : decoder_(new FakeVideoDecoder(
-            GetParam().decoding_delay, GetParam().max_decode_requests,
-            base::Bind(&FakeVideoDecoderTest::OnBytesDecoded,
-                       base::Unretained(this)))),
-        num_input_buffers_(0),
-        num_decoded_frames_(0),
-        num_bytes_decoded_(0),
-        total_bytes_in_buffers_(0),
-        last_decode_status_(DecodeStatus::OK),
-        pending_decode_requests_(0),
-        is_reset_pending_(false) {}
-
-  virtual ~FakeVideoDecoderTest() { Destroy(); }
-
-  void InitializeWithConfigAndExpectResult(const VideoDecoderConfig& config,
-                                           bool success) {
-    decoder_->Initialize(
-        config, false, NULL, NewExpectedBoolCB(success),
-        base::Bind(&FakeVideoDecoderTest::FrameReady, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    current_config_ = config;
-  }
-
-  void Initialize() {
-    InitializeWithConfigAndExpectResult(TestVideoConfig::Normal(), true);
-  }
-
-  void EnterPendingInitState() {
-    decoder_->HoldNextInit();
-    Initialize();
-  }
-
-  void SatisfyInit() {
-    decoder_->SatisfyInit();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Callback for VideoDecoder::Decode().
-  void DecodeDone(DecodeStatus status) {
-    DCHECK_GT(pending_decode_requests_, 0);
-    --pending_decode_requests_;
-    last_decode_status_ = status;
-  }
-
-  void FrameReady(const scoped_refptr<VideoFrame>& frame) {
-    DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-    last_decoded_frame_ = frame;
-    num_decoded_frames_++;
-  }
-
-  void OnBytesDecoded(int count) { num_bytes_decoded_ += count; }
-
-  enum CallbackResult { PENDING, OK, NOT_ENOUGH_DATA, ABORTED };
-
-  void ExpectReadResult(CallbackResult result) {
-    switch (result) {
-      case PENDING:
-        EXPECT_GT(pending_decode_requests_, 0);
-        break;
-      case OK:
-        EXPECT_EQ(0, pending_decode_requests_);
-        ASSERT_EQ(DecodeStatus::OK, last_decode_status_);
-        ASSERT_TRUE(last_decoded_frame_.get());
-        break;
-      case NOT_ENOUGH_DATA:
-        EXPECT_EQ(0, pending_decode_requests_);
-        ASSERT_EQ(DecodeStatus::OK, last_decode_status_);
-        ASSERT_FALSE(last_decoded_frame_.get());
-        break;
-      case ABORTED:
-        EXPECT_EQ(0, pending_decode_requests_);
-        ASSERT_EQ(DecodeStatus::ABORTED, last_decode_status_);
-        EXPECT_FALSE(last_decoded_frame_.get());
-        break;
-    }
-  }
-
-  void Decode() {
-    scoped_refptr<DecoderBuffer> buffer;
-
-    if (num_input_buffers_ < kTotalBuffers) {
-      buffer = CreateFakeVideoBufferForTest(
-          current_config_,
-          base::TimeDelta::FromMilliseconds(kDurationMs * num_input_buffers_),
-          base::TimeDelta::FromMilliseconds(kDurationMs));
-      total_bytes_in_buffers_ += buffer->data_size();
-    } else {
-      buffer = DecoderBuffer::CreateEOSBuffer();
-    }
-
-    ++num_input_buffers_;
-    ++pending_decode_requests_;
-
-    decoder_->Decode(buffer, base::Bind(&FakeVideoDecoderTest::DecodeDone,
-                                        base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void ReadOneFrame() {
-    last_decoded_frame_ = NULL;
-    do {
-      Decode();
-    } while (!last_decoded_frame_.get() && pending_decode_requests_ == 0);
-  }
-
-  void ReadAllFrames() {
-    do {
-      Decode();
-    } while (num_input_buffers_ <= kTotalBuffers);  // All input buffers + EOS.
-  }
-
-  void EnterPendingReadState() {
-    // Pass the initial NOT_ENOUGH_DATA stage.
-    ReadOneFrame();
-    decoder_->HoldDecode();
-    ReadOneFrame();
-    ExpectReadResult(PENDING);
-  }
-
-  void SatisfyDecodeAndExpect(CallbackResult result) {
-    decoder_->SatisfyDecode();
-    base::RunLoop().RunUntilIdle();
-    ExpectReadResult(result);
-  }
-
-  void SatisfyRead() { SatisfyDecodeAndExpect(OK); }
-
-  // Callback for VideoDecoder::Reset().
-  void OnDecoderReset() {
-    DCHECK(is_reset_pending_);
-    is_reset_pending_ = false;
-  }
-
-  void ExpectResetResult(CallbackResult result) {
-    switch (result) {
-      case PENDING:
-        EXPECT_TRUE(is_reset_pending_);
-        break;
-      case OK:
-        EXPECT_FALSE(is_reset_pending_);
-        break;
-      default:
-        NOTREACHED();
-    }
-  }
-
-  void ResetAndExpect(CallbackResult result) {
-    is_reset_pending_ = true;
-    decoder_->Reset(base::Bind(&FakeVideoDecoderTest::OnDecoderReset,
-                               base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    ExpectResetResult(result);
-  }
-
-  void EnterPendingResetState() {
-    decoder_->HoldNextReset();
-    ResetAndExpect(PENDING);
-  }
-
-  void SatisfyReset() {
-    decoder_->SatisfyReset();
-    base::RunLoop().RunUntilIdle();
-    ExpectResetResult(OK);
-  }
-
-  void Destroy() {
-    decoder_.reset();
-    base::RunLoop().RunUntilIdle();
-
-    // All pending callbacks must have been fired.
-    DCHECK_EQ(pending_decode_requests_, 0);
-    DCHECK(!is_reset_pending_);
-  }
-
-  base::MessageLoop message_loop_;
-  VideoDecoderConfig current_config_;
-
-  std::unique_ptr<FakeVideoDecoder> decoder_;
-
-  int num_input_buffers_;
-  int num_decoded_frames_;
-  int num_bytes_decoded_;
-  int total_bytes_in_buffers_;
-
-  // Callback result/status.
-  DecodeStatus last_decode_status_;
-  scoped_refptr<VideoFrame> last_decoded_frame_;
-  int pending_decode_requests_;
-  bool is_reset_pending_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FakeVideoDecoderTest);
-};
-
-INSTANTIATE_TEST_CASE_P(NoParallelDecode, FakeVideoDecoderTest,
-                        ::testing::Values(FakeVideoDecoderTestParams(9, 1),
-                                          FakeVideoDecoderTestParams(0, 1)));
-INSTANTIATE_TEST_CASE_P(ParallelDecode, FakeVideoDecoderTest,
-                        ::testing::Values(FakeVideoDecoderTestParams(9, 3),
-                                          FakeVideoDecoderTestParams(0, 3)));
-
-TEST_P(FakeVideoDecoderTest, Initialize) { Initialize(); }
-
-TEST_P(FakeVideoDecoderTest, SimulateFailureToInitialize) {
-  decoder_->SimulateFailureToInit();
-  InitializeWithConfigAndExpectResult(TestVideoConfig::Normal(), false);
-  Decode();
-  EXPECT_EQ(last_decode_status_, DecodeStatus::DECODE_ERROR);
-}
-
-TEST_P(FakeVideoDecoderTest, Read_AllFrames) {
-  Initialize();
-  ReadAllFrames();
-  EXPECT_EQ(kTotalBuffers, num_decoded_frames_);
-  EXPECT_EQ(total_bytes_in_buffers_, num_bytes_decoded_);
-}
-
-TEST_P(FakeVideoDecoderTest, Read_DecodingDelay) {
-  Initialize();
-
-  while (num_input_buffers_ < kTotalBuffers) {
-    ReadOneFrame();
-    EXPECT_EQ(num_input_buffers_,
-              num_decoded_frames_ + GetParam().decoding_delay);
-  }
-}
-
-TEST_P(FakeVideoDecoderTest, Read_ZeroDelay) {
-  decoder_.reset(new FakeVideoDecoder(
-      0, 1, base::Bind(&FakeVideoDecoderTest::OnBytesDecoded,
-                       base::Unretained(this))));
-  Initialize();
-
-  while (num_input_buffers_ < kTotalBuffers) {
-    ReadOneFrame();
-    EXPECT_EQ(num_input_buffers_, num_decoded_frames_);
-  }
-}
-
-TEST_P(FakeVideoDecoderTest, Read_Pending_NotEnoughData) {
-  if (GetParam().decoding_delay < 1) return;
-
-  Initialize();
-  decoder_->HoldDecode();
-  ReadOneFrame();
-  ExpectReadResult(PENDING);
-  SatisfyDecodeAndExpect(NOT_ENOUGH_DATA);
-
-  // Verify that FrameReady() hasn't been called.
-  EXPECT_FALSE(last_decoded_frame_.get());
-}
-
-TEST_P(FakeVideoDecoderTest, Read_Pending_OK) {
-  Initialize();
-  EnterPendingReadState();
-  SatisfyDecodeAndExpect(OK);
-}
-
-TEST_P(FakeVideoDecoderTest, Read_Parallel) {
-  if (GetParam().max_decode_requests < 2) return;
-
-  Initialize();
-  decoder_->HoldDecode();
-  for (int i = 0; i < GetParam().max_decode_requests; ++i) {
-    ReadOneFrame();
-    ExpectReadResult(PENDING);
-  }
-  EXPECT_EQ(GetParam().max_decode_requests, pending_decode_requests_);
-  SatisfyDecodeAndExpect(GetParam().max_decode_requests >
-                                 GetParam().decoding_delay
-                             ? OK
-                             : NOT_ENOUGH_DATA);
-}
-
-TEST_P(FakeVideoDecoderTest, ReadWithHold_DecodingDelay) {
-  Initialize();
-
-  // Hold all decodes and satisfy one decode at a time.
-  decoder_->HoldDecode();
-  int num_decodes_satisfied = 0;
-  while (num_decoded_frames_ == 0) {
-    while (pending_decode_requests_ < decoder_->GetMaxDecodeRequests())
-      Decode();
-    decoder_->SatisfySingleDecode();
-    ++num_decodes_satisfied;
-    base::RunLoop().RunUntilIdle();
-  }
-
-  DCHECK_EQ(num_decoded_frames_, 1);
-  DCHECK_EQ(num_decodes_satisfied, GetParam().decoding_delay + 1);
-}
-
-TEST_P(FakeVideoDecoderTest, Reinitialize) {
-  Initialize();
-  ReadOneFrame();
-  InitializeWithConfigAndExpectResult(TestVideoConfig::Large(), true);
-  ReadOneFrame();
-}
-
-TEST_P(FakeVideoDecoderTest, SimulateFailureToReinitialize) {
-  Initialize();
-  ReadOneFrame();
-  decoder_->SimulateFailureToInit();
-  InitializeWithConfigAndExpectResult(TestVideoConfig::Normal(), false);
-  Decode();
-  EXPECT_EQ(last_decode_status_, DecodeStatus::DECODE_ERROR);
-}
-
-// Reinitializing the decoder during the middle of the decoding process can
-// cause dropped frames.
-TEST_P(FakeVideoDecoderTest, Reinitialize_FrameDropped) {
-  if (GetParam().decoding_delay < 1) return;
-
-  Initialize();
-  ReadOneFrame();
-  Initialize();
-  ReadAllFrames();
-  EXPECT_LT(num_decoded_frames_, kTotalBuffers);
-}
-
-TEST_P(FakeVideoDecoderTest, Reset) {
-  Initialize();
-  ReadOneFrame();
-  ResetAndExpect(OK);
-}
-
-TEST_P(FakeVideoDecoderTest, Reset_DuringPendingRead) {
-  Initialize();
-  EnterPendingReadState();
-  ResetAndExpect(PENDING);
-  SatisfyDecodeAndExpect(ABORTED);
-}
-
-TEST_P(FakeVideoDecoderTest, Reset_Pending) {
-  Initialize();
-  EnterPendingResetState();
-  SatisfyReset();
-}
-
-TEST_P(FakeVideoDecoderTest, Reset_PendingDuringPendingRead) {
-  Initialize();
-  EnterPendingReadState();
-  EnterPendingResetState();
-  SatisfyDecodeAndExpect(ABORTED);
-  SatisfyReset();
-}
-
-TEST_P(FakeVideoDecoderTest, Destroy) {
-  Initialize();
-  ReadOneFrame();
-  ExpectReadResult(OK);
-  Destroy();
-}
-
-TEST_P(FakeVideoDecoderTest, Destroy_DuringPendingInitialization) {
-  EnterPendingInitState();
-  Destroy();
-}
-
-TEST_P(FakeVideoDecoderTest, Destroy_DuringPendingRead) {
-  Initialize();
-  EnterPendingReadState();
-  Destroy();
-}
-
-TEST_P(FakeVideoDecoderTest, Destroy_DuringPendingReset) {
-  Initialize();
-  EnterPendingResetState();
-  Destroy();
-}
-
-TEST_P(FakeVideoDecoderTest, Destroy_DuringPendingReadAndPendingReset) {
-  Initialize();
-  EnterPendingReadState();
-  EnterPendingResetState();
-  Destroy();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/file_data_source.cc b/src/cobalt/media/filters/file_data_source.cc
deleted file mode 100644
index 5725e2f..0000000
--- a/src/cobalt/media/filters/file_data_source.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/file_data_source.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "base/logging.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-FileDataSource::FileDataSource()
-    : force_read_errors_(false), force_streaming_(false), bytes_read_(0) {}
-
-FileDataSource::FileDataSource(base::File file)
-    : force_read_errors_(false), force_streaming_(false), bytes_read_(0) {
-  file_.Initialize(std::move(file));
-}
-
-bool FileDataSource::Initialize(const base::FilePath& file_path) {
-  DCHECK(!file_.IsValid());
-  return file_.Initialize(file_path);
-}
-
-void FileDataSource::Stop() {}
-
-void FileDataSource::Abort() {}
-
-void FileDataSource::Read(int64_t position, int size, uint8_t* data,
-                          const DataSource::ReadCB& read_cb) {
-  if (force_read_errors_ || !file_.IsValid()) {
-    read_cb.Run(kReadError);
-    return;
-  }
-
-  int64_t file_size = file_.length();
-
-  CHECK_GE(file_size, 0);
-  CHECK_GE(position, 0);
-  CHECK_GE(size, 0);
-
-  // Cap position and size within bounds.
-  position = std::min(position, file_size);
-  int64_t clamped_size =
-      std::min(static_cast<int64_t>(size), file_size - position);
-
-  SbMemoryCopy(data, file_.data() + position, clamped_size);
-  bytes_read_ += clamped_size;
-  read_cb.Run(clamped_size);
-}
-
-bool FileDataSource::GetSize(int64_t* size_out) {
-  *size_out = file_.length();
-  return true;
-}
-
-bool FileDataSource::IsStreaming() { return force_streaming_; }
-
-void FileDataSource::SetBitrate(int bitrate) {}
-
-FileDataSource::~FileDataSource() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/file_data_source.h b/src/cobalt/media/filters/file_data_source.h
deleted file mode 100644
index f66f0f3..0000000
--- a/src/cobalt/media/filters/file_data_source.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_FILE_DATA_SOURCE_H_
-#define COBALT_MEDIA_FILTERS_FILE_DATA_SOURCE_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/files/memory_mapped_file.h"
-#include "cobalt/media/base/data_source.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Basic data source that treats the URL as a file path, and uses the file
-// system to read data for a media pipeline.
-class MEDIA_EXPORT FileDataSource : public DataSource {
- public:
-  FileDataSource();
-  explicit FileDataSource(base::File file);
-  ~FileDataSource() OVERRIDE;
-
-  bool Initialize(const base::FilePath& file_path);
-
-  // Implementation of DataSource.
-  void Stop() OVERRIDE;
-  void Abort() OVERRIDE;
-  void Read(int64_t position, int size, uint8_t* data,
-            const DataSource::ReadCB& read_cb) OVERRIDE;
-  bool GetSize(int64_t* size_out) OVERRIDE;
-  bool IsStreaming() OVERRIDE;
-  void SetBitrate(int bitrate) OVERRIDE;
-
-  // Unit test helpers. Recreate the object if you want the default behaviour.
-  void force_read_errors_for_testing() { force_read_errors_ = true; }
-  void force_streaming_for_testing() { force_streaming_ = true; }
-  uint64_t bytes_read_for_testing() { return bytes_read_; }
-  void reset_bytes_read_for_testing() { bytes_read_ = 0; }
-
- private:
-  base::MemoryMappedFile file_;
-
-  bool force_read_errors_;
-  bool force_streaming_;
-  uint64_t bytes_read_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileDataSource);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_FILE_DATA_SOURCE_H_
diff --git a/src/cobalt/media/filters/file_data_source_unittest.cc b/src/cobalt/media/filters/file_data_source_unittest.cc
deleted file mode 100644
index 03ed9f7..0000000
--- a/src/cobalt/media/filters/file_data_source_unittest.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/base_paths.h"
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "base/utf_string_conversions.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/filters/file_data_source.h"
-#include "starboard/types.h"
-
-using ::testing::NiceMock;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-class ReadCBHandler {
- public:
-  ReadCBHandler() {}
-
-  MOCK_METHOD1(ReadCB, void(int size));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ReadCBHandler);
-};
-
-// Returns a path to the test file which contains the string "0123456789"
-// without the quotes or any trailing space or null termination.  The file lives
-// under the media/test/data directory.  Under Windows, strings for the
-// FilePath class are unicode, and the pipeline wants char strings.  Convert
-// the string to UTF8 under Windows.  For Mac and Linux, file paths are already
-// chars so just return the string from the base::FilePath.
-base::FilePath TestFileURL() {
-  base::FilePath data_dir;
-  EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
-  data_dir = data_dir.Append(FILE_PATH_LITERAL("media"))
-                 .Append(FILE_PATH_LITERAL("test"))
-                 .Append(FILE_PATH_LITERAL("data"))
-                 .Append(FILE_PATH_LITERAL("ten_byte_file"));
-  return data_dir;
-}
-
-// Use the mock filter host to directly call the Read and GetPosition methods.
-TEST(FileDataSourceTest, ReadData) {
-  int64_t size;
-  uint8_t ten_bytes[10];
-
-  // Create our mock filter host and initialize the data source.
-  FileDataSource data_source;
-
-  EXPECT_TRUE(data_source.Initialize(TestFileURL()));
-  EXPECT_TRUE(data_source.GetSize(&size));
-  EXPECT_EQ(10, size);
-
-  ReadCBHandler handler;
-  EXPECT_CALL(handler, ReadCB(10));
-  data_source.Read(0, 10, ten_bytes, base::Bind(&ReadCBHandler::ReadCB,
-                                                base::Unretained(&handler)));
-  EXPECT_EQ('0', ten_bytes[0]);
-  EXPECT_EQ('5', ten_bytes[5]);
-  EXPECT_EQ('9', ten_bytes[9]);
-
-  EXPECT_CALL(handler, ReadCB(1));
-  data_source.Read(9, 1, ten_bytes, base::Bind(&ReadCBHandler::ReadCB,
-                                               base::Unretained(&handler)));
-  EXPECT_EQ('9', ten_bytes[0]);
-
-  EXPECT_CALL(handler, ReadCB(0));
-  data_source.Read(10, 10, ten_bytes, base::Bind(&ReadCBHandler::ReadCB,
-                                                 base::Unretained(&handler)));
-
-  EXPECT_CALL(handler, ReadCB(5));
-  data_source.Read(5, 10, ten_bytes, base::Bind(&ReadCBHandler::ReadCB,
-                                                base::Unretained(&handler)));
-  EXPECT_EQ('5', ten_bytes[0]);
-
-  data_source.Stop();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/in_memory_url_protocol.cc b/src/cobalt/media/filters/in_memory_url_protocol.cc
deleted file mode 100644
index ad63b69..0000000
--- a/src/cobalt/media/filters/in_memory_url_protocol.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/in_memory_url_protocol.h"
-
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-InMemoryUrlProtocol::InMemoryUrlProtocol(const uint8_t* data, int64_t size,
-                                         bool streaming)
-    : data_(data),
-      size_(size >= 0 ? size : 0),
-      position_(0),
-      streaming_(streaming) {}
-
-InMemoryUrlProtocol::~InMemoryUrlProtocol() {}
-
-int InMemoryUrlProtocol::Read(int size, uint8_t* data) {
-  if (size < 0) return AVERROR(EIO);
-
-  int64_t available_bytes = size_ - position_;
-  if (size > available_bytes) size = available_bytes;
-
-  if (size > 0) {
-    SbMemoryCopy(data, data_ + position_, size);
-    position_ += size;
-  }
-
-  return size;
-}
-
-bool InMemoryUrlProtocol::GetPosition(int64_t* position_out) {
-  if (!position_out) return false;
-
-  *position_out = position_;
-  return true;
-}
-
-bool InMemoryUrlProtocol::SetPosition(int64_t position) {
-  if (position < 0 || position > size_) return false;
-  position_ = position;
-  return true;
-}
-
-bool InMemoryUrlProtocol::GetSize(int64_t* size_out) {
-  if (!size_out) return false;
-
-  *size_out = size_;
-  return true;
-}
-
-bool InMemoryUrlProtocol::IsStreaming() { return streaming_; }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/in_memory_url_protocol.h b/src/cobalt/media/filters/in_memory_url_protocol.h
deleted file mode 100644
index a8de6b6..0000000
--- a/src/cobalt/media/filters/in_memory_url_protocol.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_IN_MEMORY_URL_PROTOCOL_H_
-#define COBALT_MEDIA_FILTERS_IN_MEMORY_URL_PROTOCOL_H_
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "cobalt/media/filters/ffmpeg_glue.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Simple FFmpegURLProtocol that reads from a buffer.
-// NOTE: This object does not copy the buffer so the
-//       buffer pointer passed into the constructor
-//       needs to remain valid for the entire lifetime of
-//       this object.
-class MEDIA_EXPORT InMemoryUrlProtocol : public FFmpegURLProtocol {
- public:
-  InMemoryUrlProtocol(const uint8_t* buf, int64_t size, bool streaming);
-  virtual ~InMemoryUrlProtocol();
-
-  // FFmpegURLProtocol methods.
-  int Read(int size, uint8_t* data) OVERRIDE;
-  bool GetPosition(int64_t* position_out) OVERRIDE;
-  bool SetPosition(int64_t position) OVERRIDE;
-  bool GetSize(int64_t* size_out) OVERRIDE;
-  bool IsStreaming() OVERRIDE;
-
- private:
-  const uint8_t* data_;
-  int64_t size_;
-  int64_t position_;
-  bool streaming_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(InMemoryUrlProtocol);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_IN_MEMORY_URL_PROTOCOL_H_
diff --git a/src/cobalt/media/filters/in_memory_url_protocol_unittest.cc b/src/cobalt/media/filters/in_memory_url_protocol_unittest.cc
deleted file mode 100644
index 6ef461d..0000000
--- a/src/cobalt/media/filters/in_memory_url_protocol_unittest.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <limits>
-
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "cobalt/media/filters/in_memory_url_protocol.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static const uint8_t kData[] = {0x01, 0x02, 0x03, 0x04};
-
-TEST(InMemoryUrlProtocolTest, ReadFromLargeBuffer) {
-  InMemoryUrlProtocol protocol(kData, std::numeric_limits<int64_t>::max(),
-                               false);
-
-  uint8_t out[sizeof(kData)];
-  EXPECT_EQ(4, protocol.Read(sizeof(out), out));
-  EXPECT_EQ(0, SbMemoryCompare(out, kData, sizeof(out)));
-}
-
-TEST(InMemoryUrlProtocolTest, ReadWithNegativeSize) {
-  InMemoryUrlProtocol protocol(kData, sizeof(kData), false);
-
-  uint8_t out[sizeof(kData)];
-  EXPECT_EQ(AVERROR(EIO), protocol.Read(-2, out));
-}
-
-TEST(InMemoryUrlProtocolTest, ReadWithZeroSize) {
-  InMemoryUrlProtocol protocol(kData, sizeof(kData), false);
-
-  uint8_t out;
-  EXPECT_EQ(0, protocol.Read(0, &out));
-}
-
-TEST(InMemoryUrlProtocolTest, SetPosition) {
-  InMemoryUrlProtocol protocol(kData, sizeof(kData), false);
-
-  EXPECT_FALSE(protocol.SetPosition(-1));
-  EXPECT_FALSE(protocol.SetPosition(sizeof(kData) + 1));
-
-  uint8_t out;
-  EXPECT_TRUE(protocol.SetPosition(sizeof(kData)));
-  EXPECT_EQ(0, protocol.Read(1, &out));
-
-  int i = sizeof(kData) / 2;
-  EXPECT_TRUE(protocol.SetPosition(i));
-  EXPECT_EQ(1, protocol.Read(1, &out));
-  EXPECT_EQ(kData[i], out);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/jpeg_parser.cc b/src/cobalt/media/filters/jpeg_parser.cc
deleted file mode 100644
index 2c69ac2..0000000
--- a/src/cobalt/media/filters/jpeg_parser.cc
+++ /dev/null
@@ -1,472 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/jpeg_parser.h"
-
-#include "base/basictypes.h"
-#include "base/big_endian.h"
-#include "base/logging.h"
-#include "starboard/memory.h"
-
-using base::BigEndianReader;
-
-#define READ_U8_OR_RETURN_FALSE(out)                                       \
-  do {                                                                     \
-    uint8_t _out;                                                          \
-    if (!reader.ReadU8(&_out)) {                                           \
-      DVLOG(1)                                                             \
-          << "Error in stream: unexpected EOS while trying to read " #out; \
-      return false;                                                        \
-    }                                                                      \
-    *(out) = _out;                                                         \
-  } while (0)
-
-#define READ_U16_OR_RETURN_FALSE(out)                                      \
-  do {                                                                     \
-    uint16_t _out;                                                         \
-    if (!reader.ReadU16(&_out)) {                                          \
-      DVLOG(1)                                                             \
-          << "Error in stream: unexpected EOS while trying to read " #out; \
-      return false;                                                        \
-    }                                                                      \
-    *(out) = _out;                                                         \
-  } while (0)
-
-namespace cobalt {
-namespace media {
-
-static bool InRange(int value, int a, int b) {
-  return a <= value && value <= b;
-}
-
-// Round up |value| to multiple of |mul|. |value| must be non-negative.
-// |mul| must be positive.
-static int RoundUp(int value, int mul) {
-  DCHECK_GE(value, 0);
-  DCHECK_GE(mul, 1);
-  return (value + mul - 1) / mul * mul;
-}
-
-// |frame_header| is already initialized to 0 in ParseJpegPicture.
-static bool ParseSOF(const char* buffer, size_t length,
-                     JpegFrameHeader* frame_header) {
-  // Spec B.2.2 Frame header syntax
-  DCHECK(buffer);
-  DCHECK(frame_header);
-  BigEndianReader reader(buffer, length);
-
-  uint8_t precision;
-  READ_U8_OR_RETURN_FALSE(&precision);
-  READ_U16_OR_RETURN_FALSE(&frame_header->visible_height);
-  READ_U16_OR_RETURN_FALSE(&frame_header->visible_width);
-  READ_U8_OR_RETURN_FALSE(&frame_header->num_components);
-
-  if (precision != 8) {
-    DLOG(ERROR) << "Only support 8-bit precision, not "
-                << static_cast<int>(precision) << " bit for baseline";
-    return false;
-  }
-  if (!InRange(frame_header->num_components, 1,
-               arraysize(frame_header->components))) {
-    DLOG(ERROR) << "num_components="
-                << static_cast<int>(frame_header->num_components)
-                << " is not supported";
-    return false;
-  }
-
-  int max_h_factor = 0;
-  int max_v_factor = 0;
-  for (size_t i = 0; i < frame_header->num_components; i++) {
-    JpegComponent& component = frame_header->components[i];
-    READ_U8_OR_RETURN_FALSE(&component.id);
-    if (component.id > frame_header->num_components) {
-      DLOG(ERROR) << "component id (" << static_cast<int>(component.id)
-                  << ") should be <= num_components ("
-                  << static_cast<int>(frame_header->num_components) << ")";
-      return false;
-    }
-    uint8_t hv;
-    READ_U8_OR_RETURN_FALSE(&hv);
-    component.horizontal_sampling_factor = hv / 16;
-    component.vertical_sampling_factor = hv % 16;
-    if (component.horizontal_sampling_factor > max_h_factor)
-      max_h_factor = component.horizontal_sampling_factor;
-    if (component.vertical_sampling_factor > max_v_factor)
-      max_v_factor = component.vertical_sampling_factor;
-    if (!InRange(component.horizontal_sampling_factor, 1, 4)) {
-      DVLOG(1) << "Invalid horizontal sampling factor "
-               << static_cast<int>(component.horizontal_sampling_factor);
-      return false;
-    }
-    if (!InRange(component.vertical_sampling_factor, 1, 4)) {
-      DVLOG(1) << "Invalid vertical sampling factor "
-               << static_cast<int>(component.horizontal_sampling_factor);
-      return false;
-    }
-    READ_U8_OR_RETURN_FALSE(&component.quantization_table_selector);
-  }
-
-  // The size of data unit is 8*8 and the coded size should be extended
-  // to complete minimum coded unit, MCU. See Spec A.2.
-  frame_header->coded_width =
-      RoundUp(frame_header->visible_width, max_h_factor * 8);
-  frame_header->coded_height =
-      RoundUp(frame_header->visible_height, max_v_factor * 8);
-
-  return true;
-}
-
-// |q_table| is already initialized to 0 in ParseJpegPicture.
-static bool ParseDQT(const char* buffer, size_t length,
-                     JpegQuantizationTable* q_table) {
-  // Spec B.2.4.1 Quantization table-specification syntax
-  DCHECK(buffer);
-  DCHECK(q_table);
-  BigEndianReader reader(buffer, length);
-  while (reader.remaining() > 0) {
-    uint8_t precision_and_table_id;
-    READ_U8_OR_RETURN_FALSE(&precision_and_table_id);
-    uint8_t precision = precision_and_table_id / 16;
-    uint8_t table_id = precision_and_table_id % 16;
-    if (!InRange(precision, 0, 1)) {
-      DVLOG(1) << "Invalid precision " << static_cast<int>(precision);
-      return false;
-    }
-    if (precision == 1) {  // 1 means 16-bit precision
-      DLOG(ERROR) << "An 8-bit DCT-based process shall not use a 16-bit "
-                  << "precision quantization table";
-      return false;
-    }
-    if (table_id >= kJpegMaxQuantizationTableNum) {
-      DLOG(ERROR) << "Quantization table id (" << static_cast<int>(table_id)
-                  << ") exceeded " << kJpegMaxQuantizationTableNum;
-      return false;
-    }
-
-    if (!reader.ReadBytes(&q_table[table_id].value,
-                          sizeof(q_table[table_id].value)))
-      return false;
-    q_table[table_id].valid = true;
-  }
-  return true;
-}
-
-// |dc_table| and |ac_table| are already initialized to 0 in ParseJpegPicture.
-static bool ParseDHT(const char* buffer, size_t length,
-                     JpegHuffmanTable* dc_table, JpegHuffmanTable* ac_table) {
-  // Spec B.2.4.2 Huffman table-specification syntax
-  DCHECK(buffer);
-  DCHECK(dc_table);
-  DCHECK(ac_table);
-  BigEndianReader reader(buffer, length);
-  while (reader.remaining() > 0) {
-    uint8_t table_class_and_id;
-    READ_U8_OR_RETURN_FALSE(&table_class_and_id);
-    int table_class = table_class_and_id / 16;
-    int table_id = table_class_and_id % 16;
-    if (!InRange(table_class, 0, 1)) {
-      DVLOG(1) << "Invalid table class " << table_class;
-      return false;
-    }
-    if (table_id >= 2) {
-      DLOG(ERROR) << "Table id(" << table_id
-                  << ") >= 2 is invalid for baseline profile";
-      return false;
-    }
-
-    JpegHuffmanTable* table;
-    if (table_class == 1)
-      table = &ac_table[table_id];
-    else
-      table = &dc_table[table_id];
-
-    size_t count = 0;
-    if (!reader.ReadBytes(&table->code_length, sizeof(table->code_length)))
-      return false;
-    for (size_t i = 0; i < arraysize(table->code_length); i++)
-      count += table->code_length[i];
-
-    if (!InRange(count, 0, sizeof(table->code_value))) {
-      DVLOG(1) << "Invalid code count " << count;
-      return false;
-    }
-    if (!reader.ReadBytes(&table->code_value, count)) return false;
-    table->valid = true;
-  }
-  return true;
-}
-
-static bool ParseDRI(const char* buffer, size_t length,
-                     uint16_t* restart_interval) {
-  // Spec B.2.4.4 Restart interval definition syntax
-  DCHECK(buffer);
-  DCHECK(restart_interval);
-  BigEndianReader reader(buffer, length);
-  return reader.ReadU16(restart_interval) && reader.remaining() == 0;
-}
-
-// |scan| is already initialized to 0 in ParseJpegPicture.
-static bool ParseSOS(const char* buffer, size_t length,
-                     const JpegFrameHeader& frame_header,
-                     JpegScanHeader* scan) {
-  // Spec B.2.3 Scan header syntax
-  DCHECK(buffer);
-  DCHECK(scan);
-  BigEndianReader reader(buffer, length);
-  READ_U8_OR_RETURN_FALSE(&scan->num_components);
-  if (scan->num_components != frame_header.num_components) {
-    DLOG(ERROR) << "The number of scan components ("
-                << static_cast<int>(scan->num_components)
-                << ") mismatches the number of image components ("
-                << static_cast<int>(frame_header.num_components) << ")";
-    return false;
-  }
-
-  for (int i = 0; i < scan->num_components; i++) {
-    JpegScanHeader::Component* component = &scan->components[i];
-    READ_U8_OR_RETURN_FALSE(&component->component_selector);
-    uint8_t dc_and_ac_selector;
-    READ_U8_OR_RETURN_FALSE(&dc_and_ac_selector);
-    component->dc_selector = dc_and_ac_selector / 16;
-    component->ac_selector = dc_and_ac_selector % 16;
-    if (component->component_selector != frame_header.components[i].id) {
-      DLOG(ERROR) << "component selector mismatches image component id";
-      return false;
-    }
-    if (component->dc_selector >= kJpegMaxHuffmanTableNumBaseline) {
-      DLOG(ERROR) << "DC selector (" << static_cast<int>(component->dc_selector)
-                  << ") should be 0 or 1 for baseline mode";
-      return false;
-    }
-    if (component->ac_selector >= kJpegMaxHuffmanTableNumBaseline) {
-      DLOG(ERROR) << "AC selector (" << static_cast<int>(component->ac_selector)
-                  << ") should be 0 or 1 for baseline mode";
-      return false;
-    }
-  }
-
-  // Unused fields, only for value checking.
-  uint8_t spectral_selection_start;
-  uint8_t spectral_selection_end;
-  uint8_t point_transform;
-  READ_U8_OR_RETURN_FALSE(&spectral_selection_start);
-  READ_U8_OR_RETURN_FALSE(&spectral_selection_end);
-  READ_U8_OR_RETURN_FALSE(&point_transform);
-  if (spectral_selection_start != 0 || spectral_selection_end != 63) {
-    DLOG(ERROR) << "Spectral selection should be 0,63 for baseline mode";
-    return false;
-  }
-  if (point_transform != 0) {
-    DLOG(ERROR) << "Point transform should be 0 for baseline mode";
-    return false;
-  }
-
-  return true;
-}
-
-// |eoi_ptr| will point to the end of image (after EOI marker) after search
-// succeeds. Returns true on EOI marker found, or false.
-static bool SearchEOI(const char* buffer, size_t length, const char** eoi_ptr) {
-  DCHECK(buffer);
-  DCHECK(eoi_ptr);
-  BigEndianReader reader(buffer, length);
-  uint8_t marker2;
-
-  while (reader.remaining() > 0) {
-    const char* marker1_ptr = static_cast<const char*>(
-        SbMemoryFindByte(reader.ptr(), JPEG_MARKER_PREFIX, reader.remaining()));
-    if (!marker1_ptr) return false;
-    reader.Skip(marker1_ptr - reader.ptr() + 1);
-
-    do {
-      READ_U8_OR_RETURN_FALSE(&marker2);
-    } while (marker2 == JPEG_MARKER_PREFIX);  // skip fill bytes
-
-    switch (marker2) {
-      // Compressed data escape.
-      case 0x00:
-        break;
-      // Restart
-      case JPEG_RST0:
-      case JPEG_RST1:
-      case JPEG_RST2:
-      case JPEG_RST3:
-      case JPEG_RST4:
-      case JPEG_RST5:
-      case JPEG_RST6:
-      case JPEG_RST7:
-        break;
-      case JPEG_EOI:
-        *eoi_ptr = reader.ptr();
-        return true;
-      default:
-        // Skip for other markers.
-        uint16_t size;
-        READ_U16_OR_RETURN_FALSE(&size);
-        if (size < sizeof(size)) {
-          DLOG(ERROR) << "Ill-formed JPEG. Segment size (" << size
-                      << ") is smaller than size field (" << sizeof(size)
-                      << ")";
-          return false;
-        }
-        size -= sizeof(size);
-
-        if (!reader.Skip(size)) {
-          DLOG(ERROR) << "Ill-formed JPEG. Remaining size ("
-                      << reader.remaining()
-                      << ") is smaller than header specified (" << size << ")";
-          return false;
-        }
-        break;
-    }
-  }
-  return false;
-}
-
-// |result| is already initialized to 0 in ParseJpegPicture.
-static bool ParseSOI(const char* buffer, size_t length,
-                     JpegParseResult* result) {
-  // Spec B.2.1 High-level syntax
-  DCHECK(buffer);
-  DCHECK(result);
-  BigEndianReader reader(buffer, length);
-  uint8_t marker1;
-  uint8_t marker2;
-  bool has_marker_dqt = false;
-  bool has_marker_sos = false;
-
-  // Once reached SOS, all neccesary data are parsed.
-  while (!has_marker_sos) {
-    READ_U8_OR_RETURN_FALSE(&marker1);
-    if (marker1 != JPEG_MARKER_PREFIX) return false;
-
-    do {
-      READ_U8_OR_RETURN_FALSE(&marker2);
-    } while (marker2 == JPEG_MARKER_PREFIX);  // skip fill bytes
-
-    uint16_t size;
-    READ_U16_OR_RETURN_FALSE(&size);
-    // The size includes the size field itself.
-    if (size < sizeof(size)) {
-      DLOG(ERROR) << "Ill-formed JPEG. Segment size (" << size
-                  << ") is smaller than size field (" << sizeof(size) << ")";
-      return false;
-    }
-    size -= sizeof(size);
-
-    if (reader.remaining() < size) {
-      DLOG(ERROR) << "Ill-formed JPEG. Remaining size (" << reader.remaining()
-                  << ") is smaller than header specified (" << size << ")";
-      return false;
-    }
-
-    switch (marker2) {
-      case JPEG_SOF0:
-        if (!ParseSOF(reader.ptr(), size, &result->frame_header)) {
-          DLOG(ERROR) << "ParseSOF failed";
-          return false;
-        }
-        break;
-      case JPEG_SOF1:
-      case JPEG_SOF2:
-      case JPEG_SOF3:
-      case JPEG_SOF5:
-      case JPEG_SOF6:
-      case JPEG_SOF7:
-      case JPEG_SOF9:
-      case JPEG_SOF10:
-      case JPEG_SOF11:
-      case JPEG_SOF13:
-      case JPEG_SOF14:
-      case JPEG_SOF15:
-        DLOG(ERROR) << "Only SOF0 (baseline) is supported, but got SOF"
-                    << (marker2 - JPEG_SOF0);
-        return false;
-      case JPEG_DQT:
-        if (!ParseDQT(reader.ptr(), size, result->q_table)) {
-          DLOG(ERROR) << "ParseDQT failed";
-          return false;
-        }
-        has_marker_dqt = true;
-        break;
-      case JPEG_DHT:
-        if (!ParseDHT(reader.ptr(), size, result->dc_table, result->ac_table)) {
-          DLOG(ERROR) << "ParseDHT failed";
-          return false;
-        }
-        break;
-      case JPEG_DRI:
-        if (!ParseDRI(reader.ptr(), size, &result->restart_interval)) {
-          DLOG(ERROR) << "ParseDRI failed";
-          return false;
-        }
-        break;
-      case JPEG_SOS:
-        if (!ParseSOS(reader.ptr(), size, result->frame_header,
-                      &result->scan)) {
-          DLOG(ERROR) << "ParseSOS failed";
-          return false;
-        }
-        has_marker_sos = true;
-        break;
-      default:
-        DVLOG(4) << "unknown marker " << static_cast<int>(marker2);
-        break;
-    }
-    reader.Skip(size);
-  }
-
-  if (!has_marker_dqt) {
-    DLOG(ERROR) << "No DQT marker found";
-    return false;
-  }
-
-  // Scan data follows scan header immediately.
-  result->data = reader.ptr();
-  result->data_size = reader.remaining();
-  const size_t kSoiSize = 2;
-  result->image_size = length + kSoiSize;
-
-  return true;
-}
-
-bool ParseJpegPicture(const uint8_t* buffer, size_t length,
-                      JpegParseResult* result) {
-  DCHECK(buffer);
-  DCHECK(result);
-  BigEndianReader reader(reinterpret_cast<const char*>(buffer), length);
-  SbMemorySet(result, 0, sizeof(JpegParseResult));
-
-  uint8_t marker1, marker2;
-  READ_U8_OR_RETURN_FALSE(&marker1);
-  READ_U8_OR_RETURN_FALSE(&marker2);
-  if (marker1 != JPEG_MARKER_PREFIX || marker2 != JPEG_SOI) {
-    DLOG(ERROR) << "Not a JPEG";
-    return false;
-  }
-
-  return ParseSOI(reader.ptr(), reader.remaining(), result);
-}
-
-bool ParseJpegStream(const uint8_t* buffer, size_t length,
-                     JpegParseResult* result) {
-  DCHECK(buffer);
-  DCHECK(result);
-  if (!ParseJpegPicture(buffer, length, result)) return false;
-
-  BigEndianReader reader(reinterpret_cast<const char*>(result->data),
-                         result->data_size);
-  const char* eoi_ptr = NULL;
-  if (!SearchEOI(reader.ptr(), reader.remaining(), &eoi_ptr)) {
-    DLOG(ERROR) << "SearchEOI failed";
-    return false;
-  }
-  DCHECK(eoi_ptr);
-  result->data_size = eoi_ptr - result->data;
-  result->image_size = eoi_ptr - reinterpret_cast<const char*>(buffer);
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/jpeg_parser.h b/src/cobalt/media/filters/jpeg_parser.h
deleted file mode 100644
index ecf8e93..0000000
--- a/src/cobalt/media/filters/jpeg_parser.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-#ifndef COBALT_MEDIA_FILTERS_JPEG_PARSER_H_
-#define COBALT_MEDIA_FILTERS_JPEG_PARSER_H_
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// It's not a full featured JPEG parser implememtation. It only parses JPEG
-// baseline sequential process. For explanations of each struct and its
-// members, see JPEG specification at
-// http://www.w3.org/Graphics/JPEG/itu-t81.pdf.
-
-enum JpegMarker {
-  JPEG_SOF0 = 0xC0,   // start of frame (baseline)
-  JPEG_SOF1 = 0xC1,   // start of frame (extended sequential)
-  JPEG_SOF2 = 0xC2,   // start of frame (progressive)
-  JPEG_SOF3 = 0xC3,   // start of frame (lossless))
-  JPEG_DHT = 0xC4,    // define huffman table
-  JPEG_SOF5 = 0xC5,   // start of frame (differential, sequential)
-  JPEG_SOF6 = 0xC6,   // start of frame (differential, progressive)
-  JPEG_SOF7 = 0xC7,   // start of frame (differential, lossless)
-  JPEG_SOF9 = 0xC9,   // start of frame (arithmetic coding, extended)
-  JPEG_SOF10 = 0xCA,  // start of frame (arithmetic coding, progressive)
-  JPEG_SOF11 = 0xCB,  // start of frame (arithmetic coding, lossless)
-  JPEG_SOF13 = 0xCD,  // start of frame (differential, arithmetic, sequential)
-  JPEG_SOF14 = 0xCE,  // start of frame (differential, arithmetic, progressive)
-  JPEG_SOF15 = 0xCF,  // start of frame (differential, arithmetic, lossless)
-  JPEG_RST0 = 0xD0,   // restart
-  JPEG_RST1 = 0xD1,   // restart
-  JPEG_RST2 = 0xD2,   // restart
-  JPEG_RST3 = 0xD3,   // restart
-  JPEG_RST4 = 0xD4,   // restart
-  JPEG_RST5 = 0xD5,   // restart
-  JPEG_RST6 = 0xD6,   // restart
-  JPEG_RST7 = 0xD7,   // restart
-  JPEG_SOI = 0xD8,    // start of image
-  JPEG_EOI = 0xD9,    // end of image
-  JPEG_SOS = 0xDA,    // start of scan
-  JPEG_DQT = 0xDB,    // define quantization table
-  JPEG_DRI = 0xDD,    // define restart internal
-  JPEG_MARKER_PREFIX = 0xFF,  // jpeg marker prefix
-};
-
-const size_t kJpegMaxHuffmanTableNumBaseline = 2;
-const size_t kJpegMaxComponents = 4;
-const size_t kJpegMaxQuantizationTableNum = 4;
-
-// Parsing result of JPEG DHT marker.
-struct JpegHuffmanTable {
-  bool valid;
-  uint8_t code_length[16];
-  uint8_t code_value[256];
-};
-
-// Parsing result of JPEG DQT marker.
-struct JpegQuantizationTable {
-  bool valid;
-  uint8_t value[64];  // baseline only supports 8 bits quantization table
-};
-
-// Parsing result of a JPEG component.
-struct JpegComponent {
-  uint8_t id;
-  uint8_t horizontal_sampling_factor;
-  uint8_t vertical_sampling_factor;
-  uint8_t quantization_table_selector;
-};
-
-// Parsing result of a JPEG SOF marker.
-struct JpegFrameHeader {
-  uint16_t visible_width;
-  uint16_t visible_height;
-  uint16_t coded_width;
-  uint16_t coded_height;
-  uint8_t num_components;
-  JpegComponent components[kJpegMaxComponents];
-};
-
-// Parsing result of JPEG SOS marker.
-struct JpegScanHeader {
-  uint8_t num_components;
-  struct Component {
-    uint8_t component_selector;
-    uint8_t dc_selector;
-    uint8_t ac_selector;
-  } components[kJpegMaxComponents];
-};
-
-struct JpegParseResult {
-  JpegFrameHeader frame_header;
-  JpegHuffmanTable dc_table[kJpegMaxHuffmanTableNumBaseline];
-  JpegHuffmanTable ac_table[kJpegMaxHuffmanTableNumBaseline];
-  JpegQuantizationTable q_table[kJpegMaxQuantizationTableNum];
-  uint16_t restart_interval;
-  JpegScanHeader scan;
-  const char* data;
-  // The size of compressed data of the first image.
-  size_t data_size;
-  // The size of the first entire image including header.
-  size_t image_size;
-};
-
-// Parses JPEG picture in |buffer| with |length|.  Returns true iff header is
-// valid and JPEG baseline sequential process is present. If parsed
-// successfully, |result| is the parsed result.
-MEDIA_EXPORT bool ParseJpegPicture(const uint8_t* buffer, size_t length,
-                                   JpegParseResult* result);
-
-// Parses the first image of JPEG stream in |buffer| with |length|.  Returns
-// true iff header is valid and JPEG baseline sequential process is present.
-// If parsed successfully, |result| is the parsed result.
-MEDIA_EXPORT bool ParseJpegStream(const uint8_t* buffer, size_t length,
-                                  JpegParseResult* result);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_JPEG_PARSER_H_
diff --git a/src/cobalt/media/filters/jpeg_parser_unittest.cc b/src/cobalt/media/filters/jpeg_parser_unittest.cc
deleted file mode 100644
index 7b6d076..0000000
--- a/src/cobalt/media/filters/jpeg_parser_unittest.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/at_exit.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/path_service.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/filters/jpeg_parser.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(JpegParserTest, Parsing) {
-  base::FilePath data_dir;
-  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
-
-  // This sample frame is captured from Chromebook Pixel
-  base::FilePath file_path = data_dir.AppendASCII("media")
-                                 .AppendASCII("test")
-                                 .AppendASCII("data")
-                                 .AppendASCII("pixel-1280x720.jpg");
-
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path)) << "Couldn't open stream file: "
-                                            << file_path.MaybeAsASCII();
-
-  JpegParseResult result;
-  ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));
-
-  // Verify selected fields
-
-  // SOF fields
-  EXPECT_EQ(1280, result.frame_header.visible_width);
-  EXPECT_EQ(720, result.frame_header.visible_height);
-  EXPECT_EQ(1280, result.frame_header.coded_width);
-  EXPECT_EQ(720, result.frame_header.coded_height);
-  EXPECT_EQ(3, result.frame_header.num_components);
-  EXPECT_EQ(1, result.frame_header.components[0].id);
-  EXPECT_EQ(2, result.frame_header.components[0].horizontal_sampling_factor);
-  EXPECT_EQ(1, result.frame_header.components[0].vertical_sampling_factor);
-  EXPECT_EQ(0, result.frame_header.components[0].quantization_table_selector);
-  EXPECT_EQ(2, result.frame_header.components[1].id);
-  EXPECT_EQ(1, result.frame_header.components[1].horizontal_sampling_factor);
-  EXPECT_EQ(1, result.frame_header.components[1].vertical_sampling_factor);
-  EXPECT_EQ(1, result.frame_header.components[1].quantization_table_selector);
-  EXPECT_EQ(3, result.frame_header.components[2].id);
-  EXPECT_EQ(1, result.frame_header.components[2].horizontal_sampling_factor);
-  EXPECT_EQ(1, result.frame_header.components[2].vertical_sampling_factor);
-  EXPECT_EQ(1, result.frame_header.components[2].quantization_table_selector);
-
-  // DRI fields
-  EXPECT_EQ(0, result.restart_interval);
-
-  // DQT fields
-  EXPECT_TRUE(result.q_table[0].valid);
-  EXPECT_TRUE(result.q_table[1].valid);
-  EXPECT_FALSE(result.q_table[2].valid);
-  EXPECT_FALSE(result.q_table[3].valid);
-
-  // DHT fields (no DHT marker)
-  EXPECT_FALSE(result.dc_table[0].valid);
-  EXPECT_FALSE(result.ac_table[0].valid);
-  EXPECT_FALSE(result.dc_table[1].valid);
-  EXPECT_FALSE(result.ac_table[1].valid);
-
-  // SOS fields
-  EXPECT_EQ(3, result.scan.num_components);
-  EXPECT_EQ(1, result.scan.components[0].component_selector);
-  EXPECT_EQ(0, result.scan.components[0].dc_selector);
-  EXPECT_EQ(0, result.scan.components[0].ac_selector);
-  EXPECT_EQ(2, result.scan.components[1].component_selector);
-  EXPECT_EQ(1, result.scan.components[1].dc_selector);
-  EXPECT_EQ(1, result.scan.components[1].ac_selector);
-  EXPECT_EQ(3, result.scan.components[2].component_selector);
-  EXPECT_EQ(1, result.scan.components[2].dc_selector);
-  EXPECT_EQ(1, result.scan.components[2].ac_selector);
-  EXPECT_EQ(121150u, result.data_size);
-  EXPECT_EQ(121358u, result.image_size);
-}
-
-TEST(JpegParserTest, CodedSizeNotEqualVisibleSize) {
-  base::FilePath data_dir;
-  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
-
-  base::FilePath file_path = data_dir.AppendASCII("media")
-                                 .AppendASCII("test")
-                                 .AppendASCII("data")
-                                 .AppendASCII("blank-1x1.jpg");
-
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path)) << "Couldn't open stream file: "
-                                            << file_path.MaybeAsASCII();
-
-  JpegParseResult result;
-  ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));
-
-  EXPECT_EQ(1, result.frame_header.visible_width);
-  EXPECT_EQ(1, result.frame_header.visible_height);
-  // The sampling factor of the given image is 2:2, so coded size is 16x16
-  EXPECT_EQ(16, result.frame_header.coded_width);
-  EXPECT_EQ(16, result.frame_header.coded_height);
-  EXPECT_EQ(2, result.frame_header.components[0].horizontal_sampling_factor);
-  EXPECT_EQ(2, result.frame_header.components[0].vertical_sampling_factor);
-}
-
-TEST(JpegParserTest, ParsingFail) {
-  const uint8_t data[] = {0, 1, 2, 3};  // not jpeg
-  JpegParseResult result;
-  ASSERT_FALSE(ParseJpegPicture(data, sizeof(data), &result));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/memory_data_source.cc b/src/cobalt/media/filters/memory_data_source.cc
deleted file mode 100644
index 08a90fe..0000000
--- a/src/cobalt/media/filters/memory_data_source.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/memory_data_source.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-MemoryDataSource::MemoryDataSource(const uint8_t* data, size_t size)
-    : data_(data), size_(size) {}
-
-MemoryDataSource::~MemoryDataSource() {}
-
-void MemoryDataSource::Read(int64_t position, int size, uint8_t* data,
-                            const DataSource::ReadCB& read_cb) {
-  DCHECK(!read_cb.is_null());
-
-  if (is_stopped_ || size < 0 || position < 0 ||
-      static_cast<size_t>(position) > size_) {
-    read_cb.Run(kReadError);
-    return;
-  }
-
-  // Cap size within bounds.
-  size_t clamped_size = std::min(static_cast<size_t>(size),
-                                 size_ - static_cast<size_t>(position));
-
-  if (clamped_size > 0) {
-    DCHECK(data);
-    SbMemoryCopy(data, data_ + position, clamped_size);
-  }
-
-  read_cb.Run(clamped_size);
-}
-
-void MemoryDataSource::Stop() { is_stopped_ = true; }
-
-void MemoryDataSource::Abort() {}
-
-bool MemoryDataSource::GetSize(int64_t* size_out) {
-  *size_out = size_;
-  return true;
-}
-
-bool MemoryDataSource::IsStreaming() { return false; }
-
-void MemoryDataSource::SetBitrate(int bitrate) {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/memory_data_source.h b/src/cobalt/media/filters/memory_data_source.h
deleted file mode 100644
index 73bd5d2..0000000
--- a/src/cobalt/media/filters/memory_data_source.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_MEMORY_DATA_SOURCE_H_
-#define COBALT_MEDIA_FILTERS_MEMORY_DATA_SOURCE_H_
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/data_source.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Basic data source that treats the URL as a file path, and uses the file
-// system to read data for a media pipeline.
-class MEDIA_EXPORT MemoryDataSource : public DataSource {
- public:
-  // Construct MemoryDataSource with |data| and |size|. The data is guaranteed
-  // to be valid during the lifetime of MemoryDataSource.
-  MemoryDataSource(const uint8_t* data, size_t size);
-  ~MemoryDataSource() final;
-
-  // Implementation of DataSource.
-  void Read(int64_t position, int size, uint8_t* data,
-            const DataSource::ReadCB& read_cb) final;
-  void Stop() final;
-  void Abort() final;
-  bool GetSize(int64_t* size_out) final;
-  bool IsStreaming() final;
-  void SetBitrate(int bitrate) final;
-
- private:
-  const uint8_t* data_ = NULL;
-  size_t size_ = 0;
-
-  bool is_stopped_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(MemoryDataSource);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_MEMORY_DATA_SOURCE_H_
diff --git a/src/cobalt/media/filters/memory_data_source_unittest.cc b/src/cobalt/media/filters/memory_data_source_unittest.cc
deleted file mode 100644
index f8bfeb4..0000000
--- a/src/cobalt/media/filters/memory_data_source_unittest.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/memory_data_source.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/rand_util.h"
-#include "starboard/memory.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class MemoryDataSourceTest : public ::testing::Test {
- public:
-  MemoryDataSourceTest() {}
-
- protected:
-  void Initialize(size_t size) {
-    data_.assign(size, 0);
-    base::RandBytes(data_.data(), size);
-    memory_data_source_.reset(new MemoryDataSource(data_.data(), size));
-    EXPECT_EQ(size, GetSize());
-  }
-
-  // Reads |size| bytes starting from |position|, expects |expected_read_size|
-  // bytes to be read and checks the read data. Expects error when
-  // |expected_read_size| is DataSource::kReadError.
-  void ReadAndExpect(int64_t position, int size, int expected_read_size) {
-    std::vector<uint8_t> data(size < 0 ? 0 : size, 0);
-
-    EXPECT_CALL(*this, ReadCB(expected_read_size));
-    memory_data_source_->Read(
-        position, size, data.data(),
-        base::Bind(&MemoryDataSourceTest::ReadCB, base::Unretained(this)));
-
-    if (expected_read_size != DataSource::kReadError) {
-      EXPECT_EQ(0, SbMemoryCompare(data_.data() + position, data.data(),
-                                   expected_read_size));
-    }
-  }
-
-  size_t GetSize() {
-    int64_t size = 0;
-    EXPECT_TRUE(memory_data_source_->GetSize(&size));
-    EXPECT_GE(size, 0);
-    return size;
-  }
-
-  void Stop() { memory_data_source_->Stop(); }
-
-  MOCK_METHOD1(ReadCB, void(int size));
-
- private:
-  std::vector<uint8_t> data_;
-  std::unique_ptr<MemoryDataSource> memory_data_source_;
-
-  DISALLOW_COPY_AND_ASSIGN(MemoryDataSourceTest);
-};
-
-TEST_F(MemoryDataSourceTest, EmptySource) {
-  Initialize(0);
-  ReadAndExpect(0, 0, 0);
-}
-
-TEST_F(MemoryDataSourceTest, ReadData) {
-  Initialize(128);
-  ReadAndExpect(0, 0, 0);
-  ReadAndExpect(0, 128, 128);
-  ReadAndExpect(12, 64, 64);
-  ReadAndExpect(128, 0, 0);
-}
-
-TEST_F(MemoryDataSourceTest, ReadData_InvalidPosition) {
-  Initialize(128);
-  ReadAndExpect(-7, 64, DataSource::kReadError);
-  ReadAndExpect(129, 64, DataSource::kReadError);
-}
-
-TEST_F(MemoryDataSourceTest, ReadData_InvalidSize) {
-  Initialize(128);
-  ReadAndExpect(0, -12, DataSource::kReadError);
-}
-
-TEST_F(MemoryDataSourceTest, ReadData_PartialRead) {
-  Initialize(128);
-  ReadAndExpect(0, 129, 128);
-  ReadAndExpect(96, 100, 32);
-}
-
-// All ReadData() will fail after Stop().
-TEST_F(MemoryDataSourceTest, Stop) {
-  Initialize(128);
-  ReadAndExpect(12, 64, 64);
-  Stop();
-  ReadAndExpect(12, 64, DataSource::kReadError);
-}
-
-// ReadData() doesn't affect GetSize().
-TEST_F(MemoryDataSourceTest, GetSize) {
-  Initialize(128);
-  ReadAndExpect(12, 64, 64);
-  EXPECT_EQ(128u, GetSize());
-  ReadAndExpect(-7, 64, DataSource::kReadError);
-  EXPECT_EQ(128u, GetSize());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/pipeline_controller.cc b/src/cobalt/media/filters/pipeline_controller.cc
deleted file mode 100644
index 1a47ed6..0000000
--- a/src/cobalt/media/filters/pipeline_controller.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/pipeline_controller.h"
-
-#include "base/bind.h"
-#include "cobalt/media/base/demuxer.h"
-
-namespace cobalt {
-namespace media {
-
-PipelineController::PipelineController(
-    Pipeline* pipeline, const RendererFactoryCB& renderer_factory_cb,
-    const SeekedCB& seeked_cb, const SuspendedCB& suspended_cb,
-    const PipelineStatusCB& error_cb)
-    : pipeline_(pipeline),
-      renderer_factory_cb_(renderer_factory_cb),
-      seeked_cb_(seeked_cb),
-      suspended_cb_(suspended_cb),
-      error_cb_(error_cb),
-      weak_factory_(this) {
-  DCHECK(pipeline_);
-  DCHECK(!renderer_factory_cb_.is_null());
-  DCHECK(!seeked_cb_.is_null());
-  DCHECK(!suspended_cb_.is_null());
-  DCHECK(!error_cb_.is_null());
-}
-
-PipelineController::~PipelineController() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-}
-
-// TODO(sandersd): If there is a pending suspend, don't call pipeline_.Start()
-// until Resume().
-void PipelineController::Start(Demuxer* demuxer, Pipeline::Client* client,
-                               bool is_streaming, bool is_static) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(state_ == State::CREATED);
-  DCHECK(demuxer);
-
-  // Once the pipeline is started, we want to call the seeked callback but
-  // without a time update.
-  pending_seeked_cb_ = true;
-  state_ = State::STARTING;
-
-  demuxer_ = demuxer;
-  is_streaming_ = is_streaming;
-  is_static_ = is_static;
-  pipeline_->Start(demuxer, renderer_factory_cb_.Run(), client,
-                   base::Bind(&PipelineController::OnPipelineStatus,
-                              weak_factory_.GetWeakPtr(), State::PLAYING));
-}
-
-void PipelineController::Seek(base::TimeDelta time, bool time_updated) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // It would be slightly more clear to set this in Dispatch(), but we want to
-  // be sure it gets updated even if the seek is elided.
-  if (time_updated) pending_time_updated_ = true;
-  pending_seeked_cb_ = true;
-
-  // If we are already seeking to |time|, and the media is static, elide the
-  // seek.
-  if ((state_ == State::SEEKING || state_ == State::RESUMING) &&
-      seek_time_ == time && is_static_) {
-    pending_seek_ = false;
-    return;
-  }
-
-  pending_seek_time_ = time;
-  pending_seek_ = true;
-  Dispatch();
-}
-
-// TODO(sandersd): It may be easier to use this interface if |suspended_cb_| is
-// executed when Suspend() is called while already suspended.
-void PipelineController::Suspend() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  pending_resume_ = false;
-  if (state_ != State::SUSPENDING && state_ != State::SUSPENDED) {
-    pending_suspend_ = true;
-    Dispatch();
-  }
-}
-
-void PipelineController::Resume() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  pending_suspend_ = false;
-  if (state_ == State::SUSPENDING || state_ == State::SUSPENDED) {
-    pending_resume_ = true;
-    Dispatch();
-  }
-}
-
-bool PipelineController::IsStable() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return state_ == State::PLAYING;
-}
-
-bool PipelineController::IsSuspended() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return (pending_suspend_ || state_ == State::SUSPENDING ||
-          state_ == State::SUSPENDED) &&
-         !pending_resume_;
-}
-
-bool PipelineController::IsPipelineSuspended() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return state_ == State::SUSPENDED;
-}
-
-void PipelineController::OnPipelineStatus(State state,
-                                          PipelineStatus pipeline_status) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (pipeline_status != PIPELINE_OK) {
-    error_cb_.Run(pipeline_status);
-    return;
-  }
-
-  state_ = state;
-
-  if (state == State::PLAYING) {
-    // Start(), Seek(), or Resume() completed; we can be sure that
-    // |demuxer_| got the seek it was waiting for.
-    waiting_for_seek_ = false;
-  } else if (state == State::SUSPENDED) {
-    // Warning: possibly reentrant. The state may change inside this callback.
-    // It must be safe to call Dispatch() twice in a row here.
-    suspended_cb_.Run();
-  }
-
-  Dispatch();
-}
-
-// Note: Dispatch() may be called re-entrantly (by callbacks internally) or
-// twice in a row (by OnPipelineStatus()).
-void PipelineController::Dispatch() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Suspend/resume transitions take priority because seeks before a suspend
-  // are wasted, and seeks after can be merged into the resume operation.
-  if (pending_suspend_ && state_ == State::PLAYING) {
-    pending_suspend_ = false;
-    state_ = State::SUSPENDING;
-    pipeline_->Suspend(base::Bind(&PipelineController::OnPipelineStatus,
-                                  weak_factory_.GetWeakPtr(),
-                                  State::SUSPENDED));
-    return;
-  }
-
-  if (pending_resume_ && state_ == State::SUSPENDED) {
-    // If there is a pending seek, resume to that time instead...
-    if (pending_seek_) {
-      seek_time_ = pending_seek_time_;
-      pending_seek_ = false;
-    } else {
-      seek_time_ = pipeline_->GetMediaTime();
-    }
-
-    // ...unless the media is streaming, in which case we resume at the start
-    // because seeking doesn't work well.
-    if (is_streaming_ && !seek_time_.is_zero()) {
-      seek_time_ = base::TimeDelta();
-
-      // In this case we want to make sure that the controls get updated
-      // immediately, so we don't try to hide the seek.
-      pending_time_updated_ = true;
-    }
-
-    // Tell |demuxer_| to expect our resume.
-    DCHECK(!waiting_for_seek_);
-    waiting_for_seek_ = true;
-    demuxer_->StartWaitingForSeek(seek_time_);
-
-    pending_resume_ = false;
-    state_ = State::RESUMING;
-    pipeline_->Resume(renderer_factory_cb_.Run(), seek_time_,
-                      base::Bind(&PipelineController::OnPipelineStatus,
-                                 weak_factory_.GetWeakPtr(), State::PLAYING));
-    return;
-  }
-
-  // If we have pending operations, and a seek is ongoing, abort it.
-  if ((pending_seek_ || pending_suspend_) && waiting_for_seek_) {
-    // If there is no pending seek, return the current seek to pending status.
-    if (!pending_seek_) {
-      pending_seek_time_ = seek_time_;
-      pending_seek_ = true;
-    }
-
-    // CancelPendingSeek() may be reentrant, so update state first and return
-    // immediately.
-    waiting_for_seek_ = false;
-    demuxer_->CancelPendingSeek(pending_seek_time_);
-    return;
-  }
-
-  // Ordinary seeking.
-  if (pending_seek_ && state_ == State::PLAYING) {
-    seek_time_ = pending_seek_time_;
-
-    // Tell |demuxer_| to expect our seek.
-    DCHECK(!waiting_for_seek_);
-    waiting_for_seek_ = true;
-    demuxer_->StartWaitingForSeek(seek_time_);
-
-    pending_seek_ = false;
-    state_ = State::SEEKING;
-    pipeline_->Seek(seek_time_,
-                    base::Bind(&PipelineController::OnPipelineStatus,
-                               weak_factory_.GetWeakPtr(), State::PLAYING));
-    return;
-  }
-
-  // If |state_| is PLAYING and we didn't trigger an operation above then we
-  // are in a stable state. If there is a seeked callback pending, emit it.
-  if (state_ == State::PLAYING) {
-    if (pending_seeked_cb_) {
-      // |seeked_cb_| may be reentrant, so update state first and return
-      // immediately.
-      pending_seeked_cb_ = false;
-      bool was_pending_time_updated = pending_time_updated_;
-      pending_time_updated_ = false;
-      seeked_cb_.Run(was_pending_time_updated);
-      return;
-    }
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/pipeline_controller.h b/src/cobalt/media/filters/pipeline_controller.h
deleted file mode 100644
index 4c6cc43..0000000
--- a/src/cobalt/media/filters/pipeline_controller.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_PIPELINE_CONTROLLER_H_
-#define COBALT_MEDIA_FILTERS_PIPELINE_CONTROLLER_H_
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "base/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/pipeline.h"
-#include "cobalt/media/base/renderer.h"
-
-namespace cobalt {
-namespace media {
-
-class Demuxer;
-
-// PipelineController wraps a Pipeline to expose the one-at-a-time operations
-// (Seek(), Suspend(), and Resume()) with a simpler API. Internally it tracks
-// pending operations and dispatches them when possible. Duplicate requests
-// (such as seeking twice to the same time) may be elided.
-//
-// TODO(sandersd):
-//   - Expose an operation that restarts via suspend+resume.
-//   - Block invalid calls after an error occurs.
-class MEDIA_EXPORT PipelineController {
- public:
-  enum class State {
-    CREATED,
-    STARTING,
-    PLAYING,
-    SEEKING,
-    SUSPENDING,
-    SUSPENDED,
-    RESUMING,
-  };
-
-  using RendererFactoryCB = base::Callback<std::unique_ptr<Renderer>(void)>;
-  using SeekedCB = base::Callback<void(bool time_updated)>;
-  using SuspendedCB = base::Callback<void()>;
-
-  // Construct a PipelineController wrapping |pipeline_|. |pipeline_| must
-  // outlive the resulting PipelineController. The callbacks are:
-  //   - |renderer_factory_cb| is called by PipelineController to create new
-  //     renderers when starting and resuming.
-  //   - |seeked_cb| is called upon reaching a stable state if a seek occured.
-  //   - |suspended_cb| is called immediately after suspendeding.
-  //   - |error_cb| is called if any operation on |pipeline_| does not result
-  //     in PIPELINE_OK or its error callback is called.
-  PipelineController(Pipeline* pipeline,
-                     const RendererFactoryCB& renderer_factory_cb,
-                     const SeekedCB& seeked_cb, const SuspendedCB& suspended_cb,
-                     const PipelineStatusCB& error_cb);
-  ~PipelineController();
-
-  // Start |pipeline_|. |demuxer| will be retained and StartWaitingForSeek()/
-  // CancelPendingSeek() will be issued to it as necessary.
-  //
-  // When |is_streaming| is true, Resume() will always start at the
-  // beginning of the stream, rather than attempting to seek to the current
-  // time.
-  //
-  // When |is_static| is true, seeks to the current time may be elided.
-  // Otherwise it is assumed that the media data may have changed.
-  //
-  // The remaining parameters are just passed directly to pipeline_.Start().
-  void Start(Demuxer* demuxer, Pipeline::Client* client, bool is_streaming,
-             bool is_static);
-
-  // Request a seek to |time|. If |time_updated| is true, then the eventual
-  // |seeked_cb| callback will also have |time_updated| set to true; it
-  // indicates that the seek was requested by Blink and a time update is
-  // expected so that Blink can fire the seeked event.
-  void Seek(base::TimeDelta time, bool time_updated);
-
-  // Request that |pipeline_| be suspended. This is a no-op if |pipeline_| has
-  // been suspended.
-  void Suspend();
-
-  // Request that |pipeline_| be resumed. This is a no-op if |pipeline_| has not
-  // been suspended.
-  void Resume();
-
-  // Returns true if the current state is stable. This means that |state_| is
-  // PLAYING and there are no pending operations. Requests are processed
-  // immediately when the state is stable, otherwise they are queued.
-  //
-  // Exceptions to the above:
-  //   - Start() is processed immediately while in the CREATED state.
-  //   - Resume() is processed immediately while in the SUSPENDED state.
-  bool IsStable();
-
-  // Returns true if the current target state is suspended.
-  bool IsSuspended();
-
-  // Returns true if |pipeline_| is suspended.
-  bool IsPipelineSuspended();
-
- private:
-  // Attempts to make progress from the current state to the target state.
-  void Dispatch();
-
-  // PipelineStaus callback that also carries the target state.
-  void OnPipelineStatus(State state, PipelineStatus pipeline_status);
-
-  // The Pipeline we are managing state for.
-  Pipeline* pipeline_ = NULL;
-
-  // Factory for Renderers, used for Start() and Resume().
-  RendererFactoryCB renderer_factory_cb_;
-
-  // Called after seeks (which includes Start()) upon reaching a stable state.
-  // Multiple seeks result in only one callback if no stable state occurs
-  // between them.
-  SeekedCB seeked_cb_;
-
-  // Called immediately when |pipeline_| completes a suspend operation.
-  SuspendedCB suspended_cb_;
-
-  // Called immediately when any operation on |pipeline_| results in an error.
-  PipelineStatusCB error_cb_;
-
-  // State for handling StartWaitingForSeek()/CancelPendingSeek().
-  Demuxer* demuxer_ = NULL;
-  bool waiting_for_seek_ = false;
-
-  // When true, Resume() will start at time zero instead of seeking to the
-  // current time.
-  bool is_streaming_ = false;
-
-  // When true, seeking to the current time may be elided.
-  bool is_static_ = true;
-
-  // Tracks the current state of |pipeline_|.
-  State state_ = State::CREATED;
-
-  // Indicates that a seek has occurred. When set, a seeked callback will be
-  // issued at the next stable state.
-  bool pending_seeked_cb_ = false;
-
-  // Indicates that time has been changed by a seek, which will be reported at
-  // the next seeked callback.
-  bool pending_time_updated_ = false;
-
-  // The target time of the active seek; valid while SEEKING or RESUMING.
-  base::TimeDelta seek_time_;
-
-  // Target state which we will work to achieve. |pending_seek_time_| is only
-  // valid when |pending_seek_| is true.
-  bool pending_seek_ = false;
-  base::TimeDelta pending_seek_time_;
-  bool pending_suspend_ = false;
-  bool pending_resume_ = false;
-
-  base::ThreadChecker thread_checker_;
-  base::WeakPtrFactory<PipelineController> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PipelineController);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_PIPELINE_CONTROLLER_H_
diff --git a/src/cobalt/media/filters/pipeline_controller_unittest.cc b/src/cobalt/media/filters/pipeline_controller_unittest.cc
deleted file mode 100644
index 94e6638..0000000
--- a/src/cobalt/media/filters/pipeline_controller_unittest.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/pipeline_controller.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "base/time.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/pipeline.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::Mock;
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-class PipelineControllerTest : public ::testing::Test, public Pipeline::Client {
- public:
-  PipelineControllerTest()
-      : pipeline_controller_(&pipeline_,
-                             base::Bind(&PipelineControllerTest::CreateRenderer,
-                                        base::Unretained(this)),
-                             base::Bind(&PipelineControllerTest::OnSeeked,
-                                        base::Unretained(this)),
-                             base::Bind(&PipelineControllerTest::OnSuspended,
-                                        base::Unretained(this)),
-                             base::Bind(&PipelineControllerTest::OnError,
-                                        base::Unretained(this))) {}
-
-  ~PipelineControllerTest() override {}
-
-  PipelineStatusCB StartPipeline(bool is_streaming, bool is_static) {
-    EXPECT_FALSE(pipeline_controller_.IsStable());
-    PipelineStatusCB start_cb;
-    EXPECT_CALL(pipeline_, Start(_, _, _, _)).WillOnce(SaveArg<3>(&start_cb));
-    pipeline_controller_.Start(&demuxer_, this, is_streaming, is_static);
-    Mock::VerifyAndClear(&pipeline_);
-    EXPECT_FALSE(pipeline_controller_.IsStable());
-    return start_cb;
-  }
-
-  PipelineStatusCB StartPipeline() { return StartPipeline(false, true); }
-
-  PipelineStatusCB StartPipeline_WithDynamicData() {
-    return StartPipeline(false, false);
-  }
-
-  PipelineStatusCB StartPipeline_WithStreamingData() {
-    return StartPipeline(true, false);
-  }
-
-  PipelineStatusCB SeekPipeline(base::TimeDelta time) {
-    EXPECT_TRUE(pipeline_controller_.IsStable());
-    PipelineStatusCB seek_cb;
-    EXPECT_CALL(pipeline_, Seek(time, _)).WillOnce(SaveArg<1>(&seek_cb));
-    pipeline_controller_.Seek(time, true);
-    Mock::VerifyAndClear(&pipeline_);
-    EXPECT_FALSE(pipeline_controller_.IsStable());
-    return seek_cb;
-  }
-
-  PipelineStatusCB SuspendPipeline() {
-    EXPECT_TRUE(pipeline_controller_.IsStable());
-    PipelineStatusCB suspend_cb;
-    EXPECT_CALL(pipeline_, Suspend(_)).WillOnce(SaveArg<0>(&suspend_cb));
-    pipeline_controller_.Suspend();
-    Mock::VerifyAndClear(&pipeline_);
-    EXPECT_TRUE(pipeline_controller_.IsSuspended());
-    EXPECT_FALSE(pipeline_controller_.IsStable());
-    EXPECT_FALSE(pipeline_controller_.IsPipelineSuspended());
-    return suspend_cb;
-  }
-
-  PipelineStatusCB ResumePipeline() {
-    EXPECT_TRUE(pipeline_controller_.IsPipelineSuspended());
-    PipelineStatusCB resume_cb;
-    EXPECT_CALL(pipeline_, Resume(_, _, _))
-        .WillOnce(
-            DoAll(SaveArg<1>(&last_resume_time_), SaveArg<2>(&resume_cb)));
-    EXPECT_CALL(pipeline_, GetMediaTime())
-        .WillRepeatedly(Return(base::TimeDelta()));
-    pipeline_controller_.Resume();
-    Mock::VerifyAndClear(&pipeline_);
-    EXPECT_FALSE(pipeline_controller_.IsSuspended());
-    EXPECT_FALSE(pipeline_controller_.IsStable());
-    EXPECT_FALSE(pipeline_controller_.IsPipelineSuspended());
-    return resume_cb;
-  }
-
-  void Complete(const PipelineStatusCB& cb) {
-    cb.Run(PIPELINE_OK);
-    base::RunLoop().RunUntilIdle();
-  }
-
- protected:
-  std::unique_ptr<Renderer> CreateRenderer() {
-    return std::unique_ptr<Renderer>();
-  }
-
-  void OnSeeked(bool time_updated) {
-    was_seeked_ = true;
-    last_seeked_time_updated_ = time_updated;
-  }
-
-  void OnSuspended() { was_suspended_ = true; }
-
-  // Pipeline::Client overrides
-  void OnError(PipelineStatus status) override { NOTREACHED(); }
-  void OnEnded() override {}
-  void OnMetadata(PipelineMetadata metadata) override {}
-  void OnBufferingStateChange(BufferingState state) override {}
-  void OnDurationChange() override {}
-  void OnAddTextTrack(const TextTrackConfig& config,
-                      const AddTextTrackDoneCB& done_cb) override {}
-  void OnWaitingForDecryptionKey() override {}
-  void OnVideoNaturalSizeChange(const gfx::Size& size) override {}
-  void OnVideoOpacityChange(bool opaque) override {}
-
-  base::MessageLoop message_loop_;
-
-  NiceMock<MockDemuxer> demuxer_;
-  StrictMock<MockPipeline> pipeline_;
-  PipelineController pipeline_controller_;
-
-  bool was_seeked_ = false;
-  bool last_seeked_time_updated_ = false;
-  bool was_suspended_ = false;
-  base::TimeDelta last_resume_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(PipelineControllerTest);
-};
-
-TEST_F(PipelineControllerTest, Startup) {
-  PipelineStatusCB start_cb = StartPipeline();
-  EXPECT_FALSE(was_seeked_);
-
-  Complete(start_cb);
-  EXPECT_TRUE(was_seeked_);
-  EXPECT_FALSE(last_seeked_time_updated_);
-  EXPECT_FALSE(was_suspended_);
-  EXPECT_TRUE(pipeline_controller_.IsStable());
-}
-
-TEST_F(PipelineControllerTest, SuspendResume) {
-  Complete(StartPipeline());
-  EXPECT_TRUE(was_seeked_);
-  was_seeked_ = false;
-
-  Complete(SuspendPipeline());
-  EXPECT_TRUE(was_suspended_);
-  EXPECT_FALSE(pipeline_controller_.IsStable());
-
-  Complete(ResumePipeline());
-  EXPECT_TRUE(pipeline_controller_.IsStable());
-
-  // |was_seeked_| should not be affected by Suspend()/Resume() at all.
-  EXPECT_FALSE(was_seeked_);
-}
-
-TEST_F(PipelineControllerTest, Seek) {
-  // Normal seeking should not result in a cancel.
-  EXPECT_CALL(demuxer_, CancelPendingSeek(_)).Times(0);
-
-  Complete(StartPipeline());
-  was_seeked_ = false;
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  EXPECT_CALL(demuxer_, StartWaitingForSeek(seek_time));
-  PipelineStatusCB seek_cb = SeekPipeline(seek_time);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(was_seeked_);
-
-  Complete(seek_cb);
-  EXPECT_TRUE(was_seeked_);
-  EXPECT_TRUE(pipeline_controller_.IsStable());
-}
-
-TEST_F(PipelineControllerTest, SuspendResumeTime) {
-  Complete(StartPipeline());
-  Complete(SuspendPipeline());
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  pipeline_controller_.Seek(seek_time, true);
-  base::RunLoop().RunUntilIdle();
-
-  Complete(ResumePipeline());
-  EXPECT_EQ(seek_time, last_resume_time_);
-}
-
-TEST_F(PipelineControllerTest, SuspendResumeTime_WithStreamingData) {
-  Complete(StartPipeline_WithStreamingData());
-  Complete(SuspendPipeline());
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  pipeline_controller_.Seek(seek_time, true);
-  base::RunLoop().RunUntilIdle();
-
-  Complete(ResumePipeline());
-  EXPECT_EQ(base::TimeDelta(), last_resume_time_);
-}
-
-TEST_F(PipelineControllerTest, SeekAborted) {
-  Complete(StartPipeline());
-
-  // Create a first pending seek.
-  base::TimeDelta seek_time_1 = base::TimeDelta::FromSeconds(5);
-  EXPECT_CALL(demuxer_, StartWaitingForSeek(seek_time_1));
-  PipelineStatusCB seek_cb_1 = SeekPipeline(seek_time_1);
-  base::RunLoop().RunUntilIdle();
-  Mock::VerifyAndClear(&demuxer_);
-
-  // Create a second seek; the first should be aborted.
-  base::TimeDelta seek_time_2 = base::TimeDelta::FromSeconds(10);
-  EXPECT_CALL(demuxer_, CancelPendingSeek(seek_time_2));
-  pipeline_controller_.Seek(seek_time_2, true);
-  base::RunLoop().RunUntilIdle();
-  Mock::VerifyAndClear(&demuxer_);
-
-  // When the first seek is completed (or aborted) the second should be issued.
-  EXPECT_CALL(demuxer_, StartWaitingForSeek(seek_time_2));
-  EXPECT_CALL(pipeline_, Seek(seek_time_2, _));
-  Complete(seek_cb_1);
-}
-
-TEST_F(PipelineControllerTest, PendingSuspend) {
-  Complete(StartPipeline());
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  PipelineStatusCB seek_cb = SeekPipeline(seek_time);
-  base::RunLoop().RunUntilIdle();
-
-  // While the seek is ongoing, request a suspend.
-  // It will be a mock failure if pipeline_.Suspend() is called.
-  pipeline_controller_.Suspend();
-  base::RunLoop().RunUntilIdle();
-
-  // Expect the suspend to trigger when the seek is completed.
-  EXPECT_CALL(pipeline_, Suspend(_));
-  Complete(seek_cb);
-}
-
-TEST_F(PipelineControllerTest, SeekMergesWithResume) {
-  Complete(StartPipeline());
-  Complete(SuspendPipeline());
-
-  // Request a seek while suspended.
-  // It will be a mock failure if pipeline_.Seek() is called.
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  pipeline_controller_.Seek(seek_time, true);
-  base::RunLoop().RunUntilIdle();
-
-  // Resume and verify the resume time includes the seek.
-  Complete(ResumePipeline());
-  EXPECT_EQ(seek_time, last_resume_time_);
-  EXPECT_TRUE(last_seeked_time_updated_);
-}
-
-TEST_F(PipelineControllerTest, SeekMergesWithSeek) {
-  Complete(StartPipeline());
-
-  base::TimeDelta seek_time_1 = base::TimeDelta::FromSeconds(5);
-  PipelineStatusCB seek_cb_1 = SeekPipeline(seek_time_1);
-  base::RunLoop().RunUntilIdle();
-
-  // Request another seek while the first is ongoing.
-  base::TimeDelta seek_time_2 = base::TimeDelta::FromSeconds(10);
-  pipeline_controller_.Seek(seek_time_2, true);
-  base::RunLoop().RunUntilIdle();
-
-  // Request a third seek. (It should replace the second.)
-  base::TimeDelta seek_time_3 = base::TimeDelta::FromSeconds(15);
-  pipeline_controller_.Seek(seek_time_3, true);
-  base::RunLoop().RunUntilIdle();
-
-  // Expect the third seek to trigger when the first seek completes.
-  EXPECT_CALL(pipeline_, Seek(seek_time_3, _));
-  Complete(seek_cb_1);
-}
-
-TEST_F(PipelineControllerTest, SeekToSeekTimeElided) {
-  Complete(StartPipeline());
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  PipelineStatusCB seek_cb_1 = SeekPipeline(seek_time);
-  base::RunLoop().RunUntilIdle();
-
-  // Request a seek to the same time again.
-  pipeline_controller_.Seek(seek_time, true);
-  base::RunLoop().RunUntilIdle();
-
-  // Complete the first seek.
-  // It would be a mock error if the second seek was dispatched here.
-  Complete(seek_cb_1);
-  EXPECT_TRUE(pipeline_controller_.IsStable());
-}
-
-TEST_F(PipelineControllerTest, SeekToSeekTimeNotElided) {
-  Complete(StartPipeline_WithDynamicData());
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
-  PipelineStatusCB seek_cb_1 = SeekPipeline(seek_time);
-  base::RunLoop().RunUntilIdle();
-
-  // Request a seek to the same time again.
-  pipeline_controller_.Seek(seek_time, true);
-  base::RunLoop().RunUntilIdle();
-
-  // Expect the second seek to trigger when the first seek completes.
-  EXPECT_CALL(pipeline_, Seek(seek_time, _));
-  Complete(seek_cb_1);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/media/filters/video_frame_stream_unittest.cc b/src/cobalt/media/filters/video_frame_stream_unittest.cc
deleted file mode 100644
index 89ad107..0000000
--- a/src/cobalt/media/filters/video_frame_stream_unittest.cc
+++ /dev/null
@@ -1,1112 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/fake_demuxer_stream.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/decoder_stream.h"
-#include "cobalt/media/filters/fake_video_decoder.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::Assign;
-using ::testing::Invoke;
-using ::testing::InvokeWithoutArgs;
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::StrictMock;
-
-static const int kNumConfigs = 4;
-static const int kNumBuffersInOneConfig = 5;
-
-namespace cobalt {
-namespace media {
-
-struct VideoFrameStreamTestParams {
-  VideoFrameStreamTestParams(bool is_encrypted, int decoding_delay,
-                             int parallel_decoding)
-      : is_encrypted(is_encrypted),
-        decoding_delay(decoding_delay),
-        parallel_decoding(parallel_decoding) {}
-
-  bool is_encrypted;
-  int decoding_delay;
-  int parallel_decoding;
-};
-
-class VideoFrameStreamTest
-    : public testing::Test,
-      public testing::WithParamInterface<VideoFrameStreamTestParams> {
- public:
-  VideoFrameStreamTest()
-      : demuxer_stream_(new FakeDemuxerStream(
-            kNumConfigs, kNumBuffersInOneConfig, GetParam().is_encrypted)),
-        cdm_context_(new StrictMock<MockCdmContext>()),
-        decryptor_(new NiceMock<MockDecryptor>()),
-        decoder1_(new FakeVideoDecoder(
-            GetParam().decoding_delay, GetParam().parallel_decoding,
-            base::Bind(&VideoFrameStreamTest::OnBytesDecoded,
-                       base::Unretained(this)))),
-        decoder2_(new FakeVideoDecoder(
-            GetParam().decoding_delay, GetParam().parallel_decoding,
-            base::Bind(&VideoFrameStreamTest::OnBytesDecoded,
-                       base::Unretained(this)))),
-        decoder3_(new FakeVideoDecoder(
-            GetParam().decoding_delay, GetParam().parallel_decoding,
-            base::Bind(&VideoFrameStreamTest::OnBytesDecoded,
-                       base::Unretained(this)))),
-        is_initialized_(false),
-        num_decoded_frames_(0),
-        pending_initialize_(false),
-        pending_read_(false),
-        pending_reset_(false),
-        pending_stop_(false),
-        num_decoded_bytes_unreported_(0),
-        has_no_key_(false) {
-    ScopedVector<VideoDecoder> decoders;
-    decoders.push_back(decoder1_);
-    decoders.push_back(decoder2_);
-    decoders.push_back(decoder3_);
-
-    video_frame_stream_.reset(new VideoFrameStream(
-        message_loop_.task_runner(), std::move(decoders), new MediaLog()));
-
-    EXPECT_CALL(*cdm_context_, GetDecryptor())
-        .WillRepeatedly(Return(decryptor_.get()));
-
-    // Decryptor can only decrypt (not decrypt-and-decode) so that
-    // DecryptingDemuxerStream will be used.
-    EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-        .WillRepeatedly(RunCallback<1>(false));
-    EXPECT_CALL(*decryptor_, Decrypt(_, _, _))
-        .WillRepeatedly(Invoke(this, &VideoFrameStreamTest::Decrypt));
-  }
-
-  ~VideoFrameStreamTest() {
-    // Check that the pipeline statistics callback was fired correctly.
-    EXPECT_EQ(num_decoded_bytes_unreported_, 0);
-
-    is_initialized_ = false;
-    decoder1_ = NULL;
-    decoder2_ = NULL;
-    decoder3_ = NULL;
-    video_frame_stream_.reset();
-    base::RunLoop().RunUntilIdle();
-
-    DCHECK(!pending_initialize_);
-    DCHECK(!pending_read_);
-    DCHECK(!pending_reset_);
-    DCHECK(!pending_stop_);
-  }
-
-  MOCK_METHOD1(OnNewSpliceBuffer, void(base::TimeDelta));
-  MOCK_METHOD0(OnWaitingForDecryptionKey, void(void));
-
-  void OnStatistics(const PipelineStatistics& statistics) {
-    num_decoded_bytes_unreported_ -= statistics.video_bytes_decoded;
-  }
-
-  void OnBytesDecoded(int count) { num_decoded_bytes_unreported_ += count; }
-
-  void OnInitialized(bool success) {
-    DCHECK(!pending_read_);
-    DCHECK(!pending_reset_);
-    DCHECK(pending_initialize_);
-    pending_initialize_ = false;
-
-    is_initialized_ = success;
-    if (!success) {
-      decoder1_ = NULL;
-      decoder2_ = NULL;
-      decoder3_ = NULL;
-    }
-  }
-
-  void InitializeVideoFrameStream() {
-    pending_initialize_ = true;
-    video_frame_stream_->Initialize(
-        demuxer_stream_.get(), base::Bind(&VideoFrameStreamTest::OnInitialized,
-                                          base::Unretained(this)),
-        cdm_context_.get(),
-        base::Bind(&VideoFrameStreamTest::OnStatistics, base::Unretained(this)),
-        base::Bind(&VideoFrameStreamTest::OnWaitingForDecryptionKey,
-                   base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Fake Decrypt() function used by DecryptingDemuxerStream. It does nothing
-  // but removes the DecryptConfig to make the buffer unencrypted.
-  void Decrypt(Decryptor::StreamType stream_type,
-               const scoped_refptr<DecoderBuffer>& encrypted,
-               const Decryptor::DecryptCB& decrypt_cb) {
-    DCHECK(encrypted->decrypt_config());
-    if (has_no_key_) {
-      decrypt_cb.Run(Decryptor::kNoKey, NULL);
-      return;
-    }
-
-    DCHECK_EQ(stream_type, Decryptor::kVideo);
-    scoped_refptr<DecoderBuffer> decrypted =
-        DecoderBuffer::CopyFrom(encrypted->data(), encrypted->data_size());
-    if (encrypted->is_key_frame()) decrypted->set_is_key_frame(true);
-    decrypted->set_timestamp(encrypted->timestamp());
-    decrypted->set_duration(encrypted->duration());
-    decrypt_cb.Run(Decryptor::kSuccess, decrypted);
-  }
-
-  // Callback for VideoFrameStream::Read().
-  void FrameReady(VideoFrameStream::Status status,
-                  const scoped_refptr<VideoFrame>& frame) {
-    DCHECK(pending_read_);
-    frame_read_ = frame;
-    last_read_status_ = status;
-    if (frame.get() &&
-        !frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) {
-      num_decoded_frames_++;
-    }
-    pending_read_ = false;
-  }
-
-  void OnReset() {
-    DCHECK(!pending_read_);
-    DCHECK(pending_reset_);
-    pending_reset_ = false;
-  }
-
-  void ReadOneFrame() {
-    frame_read_ = NULL;
-    pending_read_ = true;
-    video_frame_stream_->Read(
-        base::Bind(&VideoFrameStreamTest::FrameReady, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void ReadUntilPending() {
-    do {
-      ReadOneFrame();
-    } while (!pending_read_);
-  }
-
-  void ReadAllFrames(int expected_decoded_frames) {
-    do {
-      ReadOneFrame();
-    } while (
-        frame_read_.get() &&
-        !frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-
-    DCHECK_EQ(expected_decoded_frames, num_decoded_frames_);
-  }
-
-  void ReadAllFrames() {
-    // No frames should have been dropped.
-    ReadAllFrames(kNumConfigs * kNumBuffersInOneConfig);
-  }
-
-  enum PendingState {
-    NOT_PENDING,
-    DEMUXER_READ_NORMAL,
-    DEMUXER_READ_CONFIG_CHANGE,
-    DECRYPTOR_NO_KEY,
-    DECODER_INIT,
-    DECODER_REINIT,
-    DECODER_DECODE,
-    DECODER_RESET
-  };
-
-  void EnterPendingState(PendingState state) {
-    EnterPendingState(state, decoder1_);
-  }
-
-  void EnterPendingState(PendingState state, FakeVideoDecoder* decoder) {
-    DCHECK_NE(state, NOT_PENDING);
-    switch (state) {
-      case DEMUXER_READ_NORMAL:
-        demuxer_stream_->HoldNextRead();
-        ReadUntilPending();
-        break;
-
-      case DEMUXER_READ_CONFIG_CHANGE:
-        demuxer_stream_->HoldNextConfigChangeRead();
-        ReadUntilPending();
-        break;
-
-      case DECRYPTOR_NO_KEY:
-        if (GetParam().is_encrypted)
-          EXPECT_CALL(*this, OnWaitingForDecryptionKey());
-        has_no_key_ = true;
-        ReadOneFrame();
-        break;
-
-      case DECODER_INIT:
-        decoder->HoldNextInit();
-        InitializeVideoFrameStream();
-        break;
-
-      case DECODER_REINIT:
-        decoder->HoldNextInit();
-        ReadUntilPending();
-        break;
-
-      case DECODER_DECODE:
-        decoder->HoldDecode();
-        ReadUntilPending();
-        break;
-
-      case DECODER_RESET:
-        decoder->HoldNextReset();
-        pending_reset_ = true;
-        video_frame_stream_->Reset(
-            base::Bind(&VideoFrameStreamTest::OnReset, base::Unretained(this)));
-        base::RunLoop().RunUntilIdle();
-        break;
-
-      case NOT_PENDING:
-        NOTREACHED();
-        break;
-    }
-  }
-
-  void SatisfyPendingCallback(PendingState state) {
-    SatisfyPendingCallback(state, decoder1_);
-  }
-
-  void SatisfyPendingCallback(PendingState state, FakeVideoDecoder* decoder) {
-    DCHECK_NE(state, NOT_PENDING);
-    switch (state) {
-      case DEMUXER_READ_NORMAL:
-      case DEMUXER_READ_CONFIG_CHANGE:
-        demuxer_stream_->SatisfyRead();
-        break;
-
-      // This is only interesting to test during VideoFrameStream destruction.
-      // There's no need to satisfy a callback.
-      case DECRYPTOR_NO_KEY:
-        NOTREACHED();
-        break;
-
-      case DECODER_INIT:
-        decoder->SatisfyInit();
-        break;
-
-      case DECODER_REINIT:
-        decoder->SatisfyInit();
-        break;
-
-      case DECODER_DECODE:
-        decoder->SatisfyDecode();
-        break;
-
-      case DECODER_RESET:
-        decoder->SatisfyReset();
-        break;
-
-      case NOT_PENDING:
-        NOTREACHED();
-        break;
-    }
-
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void Initialize() {
-    EnterPendingState(DECODER_INIT);
-    SatisfyPendingCallback(DECODER_INIT);
-  }
-
-  void Read() {
-    EnterPendingState(DECODER_DECODE);
-    SatisfyPendingCallback(DECODER_DECODE);
-  }
-
-  void Reset() {
-    EnterPendingState(DECODER_RESET);
-    SatisfyPendingCallback(DECODER_RESET);
-  }
-
-  void ReadUntilDecoderReinitialized(FakeVideoDecoder* decoder) {
-    EnterPendingState(DECODER_REINIT, decoder);
-    SatisfyPendingCallback(DECODER_REINIT, decoder);
-  }
-
-  base::MessageLoop message_loop_;
-
-  std::unique_ptr<VideoFrameStream> video_frame_stream_;
-  std::unique_ptr<FakeDemuxerStream> demuxer_stream_;
-  std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
-
-  // Use NiceMock since we don't care about most of calls on the decryptor,
-  // e.g. RegisterNewKeyCB().
-  std::unique_ptr<NiceMock<MockDecryptor>> decryptor_;
-
-  // Three decoders are needed to test that decoder fallback can occur more than
-  // once on a config change. They are owned by |video_frame_stream_|.
-  FakeVideoDecoder* decoder1_;
-  FakeVideoDecoder* decoder2_;
-  FakeVideoDecoder* decoder3_;
-
-  bool is_initialized_;
-  int num_decoded_frames_;
-  bool pending_initialize_;
-  bool pending_read_;
-  bool pending_reset_;
-  bool pending_stop_;
-  int num_decoded_bytes_unreported_;
-  scoped_refptr<VideoFrame> frame_read_;
-  VideoFrameStream::Status last_read_status_;
-
-  // Decryptor has no key to decrypt a frame.
-  bool has_no_key_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VideoFrameStreamTest);
-};
-
-INSTANTIATE_TEST_CASE_P(
-    Clear, VideoFrameStreamTest,
-    ::testing::Values(VideoFrameStreamTestParams(false, 0, 1),
-                      VideoFrameStreamTestParams(false, 3, 1),
-                      VideoFrameStreamTestParams(false, 7, 1)));
-
-INSTANTIATE_TEST_CASE_P(Encrypted, VideoFrameStreamTest,
-                        ::testing::Values(VideoFrameStreamTestParams(true, 7,
-                                                                     1)));
-
-INSTANTIATE_TEST_CASE_P(
-    Clear_Parallel, VideoFrameStreamTest,
-    ::testing::Values(VideoFrameStreamTestParams(false, 0, 3),
-                      VideoFrameStreamTestParams(false, 2, 3)));
-
-TEST_P(VideoFrameStreamTest, Initialization) { Initialize(); }
-
-TEST_P(VideoFrameStreamTest, AllDecoderInitializationFails) {
-  decoder1_->SimulateFailureToInit();
-  decoder2_->SimulateFailureToInit();
-  decoder3_->SimulateFailureToInit();
-  Initialize();
-  EXPECT_FALSE(is_initialized_);
-}
-
-TEST_P(VideoFrameStreamTest, PartialDecoderInitializationFails) {
-  decoder1_->SimulateFailureToInit();
-  decoder2_->SimulateFailureToInit();
-  Initialize();
-  EXPECT_TRUE(is_initialized_);
-}
-
-TEST_P(VideoFrameStreamTest, ReadOneFrame) {
-  Initialize();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, ReadAllFrames) {
-  Initialize();
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, Read_AfterReset) {
-  Initialize();
-  Reset();
-  Read();
-  Reset();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Read_BlockedDemuxer) {
-  Initialize();
-  demuxer_stream_->HoldNextRead();
-  ReadOneFrame();
-  EXPECT_TRUE(pending_read_);
-
-  int demuxed_buffers = 0;
-
-  // Pass frames from the demuxer to the VideoFrameStream until the first read
-  // request is satisfied.
-  while (pending_read_) {
-    ++demuxed_buffers;
-    demuxer_stream_->SatisfyReadAndHoldNext();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  EXPECT_EQ(std::min(GetParam().decoding_delay + 1, kNumBuffersInOneConfig + 1),
-            demuxed_buffers);
-
-  // At this point the stream is waiting on read from the demuxer, but there is
-  // no pending read from the stream. The stream should be blocked if we try
-  // reading from it again.
-  ReadUntilPending();
-
-  demuxer_stream_->SatisfyRead();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(pending_read_);
-}
-
-TEST_P(VideoFrameStreamTest, Read_BlockedDemuxerAndDecoder) {
-  // Test applies only when the decoder allows multiple parallel requests.
-  if (GetParam().parallel_decoding == 1) return;
-
-  Initialize();
-  demuxer_stream_->HoldNextRead();
-  decoder1_->HoldDecode();
-  ReadOneFrame();
-  EXPECT_TRUE(pending_read_);
-
-  int demuxed_buffers = 0;
-
-  // Pass frames from the demuxer to the VideoFrameStream until the first read
-  // request is satisfied, while always keeping one decode request pending.
-  while (pending_read_) {
-    ++demuxed_buffers;
-    demuxer_stream_->SatisfyReadAndHoldNext();
-    base::RunLoop().RunUntilIdle();
-
-    // Always keep one decode request pending.
-    if (demuxed_buffers > 1) {
-      decoder1_->SatisfySingleDecode();
-      base::RunLoop().RunUntilIdle();
-    }
-  }
-
-  ReadUntilPending();
-  EXPECT_TRUE(pending_read_);
-
-  // Unblocking one decode request should unblock read even when demuxer is
-  // still blocked.
-  decoder1_->SatisfySingleDecode();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(pending_read_);
-
-  // Stream should still be blocked on the demuxer after unblocking the decoder.
-  decoder1_->SatisfyDecode();
-  ReadUntilPending();
-  EXPECT_TRUE(pending_read_);
-
-  // Verify that the stream has returned all frames that have been demuxed,
-  // accounting for the decoder delay.
-  EXPECT_EQ(demuxed_buffers - GetParam().decoding_delay, num_decoded_frames_);
-
-  // Unblocking the demuxer will unblock the stream.
-  demuxer_stream_->SatisfyRead();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(pending_read_);
-}
-
-TEST_P(VideoFrameStreamTest, Read_DuringEndOfStreamDecode) {
-  // Test applies only when the decoder allows multiple parallel requests, and
-  // they are not satisfied in a single batch.
-  if (GetParam().parallel_decoding == 1 || GetParam().decoding_delay != 0)
-    return;
-
-  Initialize();
-  decoder1_->HoldDecode();
-
-  // Read all of the frames up to end of stream. Since parallel decoding is
-  // enabled, the end of stream buffer will be sent to the decoder immediately,
-  // but we don't satisfy it yet.
-  for (int configuration = 0; configuration < kNumConfigs; configuration++) {
-    for (int frame = 0; frame < kNumBuffersInOneConfig; frame++) {
-      ReadOneFrame();
-      while (pending_read_) {
-        decoder1_->SatisfySingleDecode();
-        base::RunLoop().RunUntilIdle();
-      }
-    }
-  }
-
-  // Read() again. The callback must be delayed until the decode completes.
-  ReadOneFrame();
-  ASSERT_TRUE(pending_read_);
-
-  // Satisfy decoding of the end of stream buffer. The read should complete.
-  decoder1_->SatisfySingleDecode();
-  base::RunLoop().RunUntilIdle();
-  ASSERT_FALSE(pending_read_);
-  EXPECT_EQ(last_read_status_, VideoFrameStream::OK);
-
-  // The read output should indicate end of stream.
-  ASSERT_TRUE(frame_read_.get());
-  EXPECT_TRUE(
-      frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-}
-
-// No Reset() before initialization is successfully completed.
-TEST_P(VideoFrameStreamTest, Reset_AfterInitialization) {
-  Initialize();
-  Reset();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_DuringReinitialization) {
-  Initialize();
-  EnterPendingState(DECODER_REINIT);
-  // VideoDecoder::Reset() is not called when we reset during reinitialization.
-  pending_reset_ = true;
-  video_frame_stream_->Reset(
-      base::Bind(&VideoFrameStreamTest::OnReset, base::Unretained(this)));
-  SatisfyPendingCallback(DECODER_REINIT);
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_AfterReinitialization) {
-  Initialize();
-  EnterPendingState(DECODER_REINIT);
-  SatisfyPendingCallback(DECODER_REINIT);
-  Reset();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_DuringDemuxerRead_Normal) {
-  Initialize();
-  EnterPendingState(DEMUXER_READ_NORMAL);
-  EnterPendingState(DECODER_RESET);
-  SatisfyPendingCallback(DEMUXER_READ_NORMAL);
-  SatisfyPendingCallback(DECODER_RESET);
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_DuringDemuxerRead_ConfigChange) {
-  Initialize();
-  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
-  EnterPendingState(DECODER_RESET);
-  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
-  SatisfyPendingCallback(DECODER_RESET);
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_DuringNormalDecoderDecode) {
-  Initialize();
-  EnterPendingState(DECODER_DECODE);
-  EnterPendingState(DECODER_RESET);
-  SatisfyPendingCallback(DECODER_DECODE);
-  SatisfyPendingCallback(DECODER_RESET);
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_AfterNormalRead) {
-  Initialize();
-  Read();
-  Reset();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_AfterNormalReadWithActiveSplice) {
-  video_frame_stream_->set_splice_observer(base::Bind(
-      &VideoFrameStreamTest::OnNewSpliceBuffer, base::Unretained(this)));
-  Initialize();
-
-  // Send buffers with a splice timestamp, which sets the active splice flag.
-  const base::TimeDelta splice_timestamp = base::TimeDelta();
-  demuxer_stream_->set_splice_timestamp(splice_timestamp);
-  EXPECT_CALL(*this, OnNewSpliceBuffer(splice_timestamp)).Times(AnyNumber());
-  Read();
-
-  // Issue an explicit Reset() and clear the splice timestamp.
-  Reset();
-  demuxer_stream_->set_splice_timestamp(kNoTimestamp);
-
-  // Ensure none of the upcoming calls indicate they have a splice timestamp.
-  EXPECT_CALL(*this, OnNewSpliceBuffer(_)).Times(0);
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_AfterDemuxerRead_ConfigChange) {
-  Initialize();
-  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
-  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
-  Reset();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_AfterEndOfStream) {
-  Initialize();
-  ReadAllFrames();
-  Reset();
-  num_decoded_frames_ = 0;
-  demuxer_stream_->SeekToStart();
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, Reset_DuringNoKeyRead) {
-  Initialize();
-  EnterPendingState(DECRYPTOR_NO_KEY);
-  Reset();
-}
-
-// In the following Destroy_* tests, |video_frame_stream_| is destroyed in
-// VideoFrameStreamTest dtor.
-
-TEST_P(VideoFrameStreamTest, Destroy_BeforeInitialization) {}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringInitialization) {
-  EnterPendingState(DECODER_INIT);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterInitialization) { Initialize(); }
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringReinitialization) {
-  Initialize();
-  EnterPendingState(DECODER_REINIT);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterReinitialization) {
-  Initialize();
-  EnterPendingState(DECODER_REINIT);
-  SatisfyPendingCallback(DECODER_REINIT);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringDemuxerRead_Normal) {
-  Initialize();
-  EnterPendingState(DEMUXER_READ_NORMAL);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringDemuxerRead_ConfigChange) {
-  Initialize();
-  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringNormalDecoderDecode) {
-  Initialize();
-  EnterPendingState(DECODER_DECODE);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterNormalRead) {
-  Initialize();
-  Read();
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterConfigChangeRead) {
-  Initialize();
-  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
-  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringDecoderReinitialization) {
-  Initialize();
-  EnterPendingState(DECODER_REINIT);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringNoKeyRead) {
-  Initialize();
-  EnterPendingState(DECRYPTOR_NO_KEY);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringReset) {
-  Initialize();
-  EnterPendingState(DECODER_RESET);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterReset) {
-  Initialize();
-  Reset();
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringRead_DuringReset) {
-  Initialize();
-  EnterPendingState(DECODER_DECODE);
-  EnterPendingState(DECODER_RESET);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterRead_DuringReset) {
-  Initialize();
-  EnterPendingState(DECODER_DECODE);
-  EnterPendingState(DECODER_RESET);
-  SatisfyPendingCallback(DECODER_DECODE);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_AfterRead_AfterReset) {
-  Initialize();
-  Read();
-  Reset();
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_SelectedOnInitialDecodeError) {
-  Initialize();
-  decoder1_->SimulateError();
-  ReadOneFrame();
-
-  // |video_frame_stream_| should have fallen back to |decoder2_|.
-  ASSERT_FALSE(pending_read_);
-  ASSERT_EQ(VideoFrameStream::OK, last_read_status_);
-
-  // Can't check |decoder1_| right now, it might have been destroyed already.
-  ASSERT_GT(decoder2_->total_bytes_decoded(), 0);
-
-  // Verify no frame was dropped.
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_EndOfStreamReachedBeforeFallback) {
-  // Only consider cases where there is a decoder delay. For test simplicity,
-  // omit the parallel case.
-  if (GetParam().decoding_delay == 0 || GetParam().parallel_decoding > 1)
-    return;
-
-  Initialize();
-  decoder1_->HoldDecode();
-  ReadOneFrame();
-
-  // One buffer should have already pulled from the demuxer stream. Set the next
-  // one to be an EOS.
-  demuxer_stream_->SeekToEndOfStream();
-
-  decoder1_->SatisfySingleDecode();
-  base::RunLoop().RunUntilIdle();
-
-  // |video_frame_stream_| should not have emited a frame.
-  EXPECT_TRUE(pending_read_);
-
-  // Pending buffers should contain a regular buffer and an EOS buffer.
-  EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 2);
-
-  decoder1_->SimulateError();
-  base::RunLoop().RunUntilIdle();
-
-  //  A frame should have been emited
-  EXPECT_FALSE(pending_read_);
-  EXPECT_EQ(last_read_status_, VideoFrameStream::OK);
-  EXPECT_FALSE(
-      frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-  EXPECT_GT(decoder2_->total_bytes_decoded(), 0);
-
-  ReadOneFrame();
-
-  EXPECT_FALSE(pending_read_);
-  EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing());
-  EXPECT_TRUE(
-      frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_DoesReinitializeStompPendingRead) {
-  // Test only the case where there is no decoding delay and parallel decoding.
-  if (GetParam().decoding_delay != 0 || GetParam().parallel_decoding <= 1)
-    return;
-
-  Initialize();
-  decoder1_->HoldDecode();
-
-  // Queue one read, defer the second.
-  frame_read_ = NULL;
-  pending_read_ = true;
-  video_frame_stream_->Read(
-      base::Bind(&VideoFrameStreamTest::FrameReady, base::Unretained(this)));
-  demuxer_stream_->HoldNextRead();
-
-  // Force an error to occur on the first decode, but ensure it isn't propagated
-  // until after the next read has been started.
-  decoder1_->SimulateError();
-  decoder2_->HoldDecode();
-
-  // Complete the fallback to the second decoder with the read still pending.
-  base::RunLoop().RunUntilIdle();
-
-  // Can't check |decoder1_| right now, it might have been destroyed already.
-  // Verify that there was nothing decoded until we kicked the decoder.
-  EXPECT_EQ(decoder2_->total_bytes_decoded(), 0);
-  decoder2_->SatisfyDecode();
-  const int first_decoded_bytes = decoder2_->total_bytes_decoded();
-  ASSERT_GT(first_decoded_bytes, 0);
-
-  // Satisfy the previously pending read and ensure it is decoded.
-  demuxer_stream_->SatisfyRead();
-  base::RunLoop().RunUntilIdle();
-  ASSERT_GT(decoder2_->total_bytes_decoded(), first_decoded_bytes);
-}
-
-TEST_P(VideoFrameStreamTest,
-       FallbackDecoder_SelectedOnInitialDecodeError_Twice) {
-  Initialize();
-  decoder1_->SimulateError();
-  decoder2_->HoldNextInit();
-  ReadOneFrame();
-
-  decoder2_->SatisfyInit();
-  decoder2_->SimulateError();
-  base::RunLoop().RunUntilIdle();
-
-  // |video_frame_stream_| should have fallen back to |decoder3_|.
-  ASSERT_FALSE(pending_read_);
-  ASSERT_EQ(VideoFrameStream::OK, last_read_status_);
-
-  // Can't check |decoder1_| or |decoder2_| right now, they might have been
-  // destroyed already.
-  ASSERT_GT(decoder3_->total_bytes_decoded(), 0);
-
-  // Verify no frame was dropped.
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_ConfigChangeClearsPendingBuffers) {
-  // Test case is only interesting if the decoder can receive a config change
-  // before returning its first frame.
-  if (GetParam().decoding_delay < kNumBuffersInOneConfig) return;
-
-  Initialize();
-  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
-  ASSERT_GT(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
-
-  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
-  ASSERT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
-  EXPECT_FALSE(pending_read_);
-
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_ErrorDuringConfigChangeFlushing) {
-  // Test case is only interesting if the decoder can receive a config change
-  // before returning its first frame.
-  if (GetParam().decoding_delay < kNumBuffersInOneConfig) return;
-
-  Initialize();
-  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
-  EXPECT_GT(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
-
-  decoder1_->HoldDecode();
-  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
-
-  // The flush request should have been sent and held.
-  EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
-  EXPECT_TRUE(pending_read_);
-
-  // Triggering an error here will cause the frames in |decoder1_| to be lost.
-  // There are no pending buffers buffers to give to give to |decoder2_| due to
-  // crbug.com/603713.
-  decoder1_->SimulateError();
-  base::RunLoop().RunUntilIdle();
-
-  // We want to make sure that |decoder2_| can decode the rest of the frames
-  // in the demuxer stream.
-  ReadAllFrames(kNumBuffersInOneConfig * (kNumConfigs - 1));
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_PendingBuffersIsFilledAndCleared) {
-  // Test applies only when there is a decoder delay, and the decoder will not
-  // receive a config change before outputing its first frame. Parallel decoding
-  // is also disabled in this test case, for readability and simplicity of the
-  // unit test.
-  if (GetParam().decoding_delay == 0 ||
-      GetParam().decoding_delay > kNumBuffersInOneConfig ||
-      GetParam().parallel_decoding > 1) {
-    return;
-  }
-  Initialize();
-
-  // Block on demuxer read and decoder decode so we can step through.
-  demuxer_stream_->HoldNextRead();
-  decoder1_->HoldDecode();
-  ReadOneFrame();
-
-  int demuxer_reads_satisfied = 0;
-  // Send back and requests buffers until the next one would fill the decoder
-  // delay.
-  while (demuxer_reads_satisfied < GetParam().decoding_delay - 1) {
-    // Send a buffer back.
-    demuxer_stream_->SatisfyReadAndHoldNext();
-    base::RunLoop().RunUntilIdle();
-    ++demuxer_reads_satisfied;
-
-    // Decode one buffer.
-    decoder1_->SatisfySingleDecode();
-    base::RunLoop().RunUntilIdle();
-    EXPECT_TRUE(pending_read_);
-    EXPECT_EQ(demuxer_reads_satisfied,
-              video_frame_stream_->get_pending_buffers_size_for_testing());
-    // No fallback buffers should be queued up yet.
-    EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing());
-  }
-
-  // Hold the init before triggering the error, to verify internal state.
-  demuxer_stream_->SatisfyReadAndHoldNext();
-  ++demuxer_reads_satisfied;
-  decoder2_->HoldNextInit();
-  decoder1_->SimulateError();
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(pending_read_);
-  EXPECT_EQ(demuxer_reads_satisfied,
-            video_frame_stream_->get_pending_buffers_size_for_testing());
-
-  decoder2_->SatisfyInit();
-  decoder2_->HoldDecode();
-  base::RunLoop().RunUntilIdle();
-
-  // Make sure the pending buffers have been transfered to fallback buffers.
-  // One call to Decode() during the initialization process, so we expect one
-  // buffer to already have been consumed from the fallback buffers.
-  // Pending buffers should never go down (unless we encounter a config change)
-  EXPECT_EQ(demuxer_reads_satisfied - 1,
-            video_frame_stream_->get_fallback_buffers_size_for_testing());
-  EXPECT_EQ(demuxer_reads_satisfied,
-            video_frame_stream_->get_pending_buffers_size_for_testing());
-
-  decoder2_->SatisfyDecode();
-  base::RunLoop().RunUntilIdle();
-
-  // Make sure all buffers consumed by |decoder2_| have come from the fallback.
-  // Pending buffers should not have been cleared yet.
-  EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing());
-  EXPECT_EQ(demuxer_reads_satisfied,
-            video_frame_stream_->get_pending_buffers_size_for_testing());
-  EXPECT_EQ(video_frame_stream_->get_previous_decoder_for_testing(), decoder1_);
-  EXPECT_TRUE(pending_read_);
-
-  // Give the decoder one more buffer, enough to release a frame.
-  demuxer_stream_->SatisfyReadAndHoldNext();
-  base::RunLoop().RunUntilIdle();
-
-  // New buffers should not have been added after the frame was released.
-  EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
-  EXPECT_FALSE(pending_read_);
-
-  demuxer_stream_->SatisfyRead();
-
-  // Confirm no frames were dropped.
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_SelectedOnDecodeThenInitErrors) {
-  Initialize();
-  decoder1_->SimulateError();
-  decoder2_->SimulateFailureToInit();
-  ReadOneFrame();
-
-  // |video_frame_stream_| should have fallen back to |decoder3_|
-  ASSERT_FALSE(pending_read_);
-  ASSERT_EQ(VideoFrameStream::OK, last_read_status_);
-
-  // Can't check |decoder1_| or |decoder2_| right now, they might have been
-  // destroyed already.
-  ASSERT_GT(decoder3_->total_bytes_decoded(), 0);
-
-  // Verify no frame was dropped.
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoder_SelectedOnInitThenDecodeErrors) {
-  decoder1_->SimulateFailureToInit();
-  decoder2_->HoldDecode();
-  Initialize();
-  ReadOneFrame();
-  decoder2_->SimulateError();
-  base::RunLoop().RunUntilIdle();
-
-  // |video_frame_stream_| should have fallen back to |decoder3_|
-  ASSERT_FALSE(pending_read_);
-  ASSERT_EQ(VideoFrameStream::OK, last_read_status_);
-
-  // Can't check |decoder1_| or |decoder2_| right now, they might have been
-  // destroyed already.
-  ASSERT_GT(decoder3_->total_bytes_decoded(), 0);
-
-  // Verify no frame was dropped.
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest,
-       FallbackDecoder_NotSelectedOnMidstreamDecodeError) {
-  Initialize();
-  ReadOneFrame();
-
-  // Successfully received a frame.
-  EXPECT_FALSE(pending_read_);
-  ASSERT_GT(decoder1_->total_bytes_decoded(), 0);
-
-  decoder1_->SimulateError();
-
-  // The error must surface from Read() as DECODE_ERROR.
-  while (last_read_status_ == VideoFrameStream::OK) {
-    ReadOneFrame();
-    base::RunLoop().RunUntilIdle();
-    EXPECT_FALSE(pending_read_);
-  }
-
-  // Verify the error was surfaced, rather than falling back to |decoder2_|.
-  EXPECT_FALSE(pending_read_);
-  ASSERT_EQ(decoder2_->total_bytes_decoded(), 0);
-  ASSERT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
-}
-
-TEST_P(VideoFrameStreamTest, DecoderErrorWhenNotReading) {
-  Initialize();
-  decoder1_->HoldDecode();
-  ReadOneFrame();
-  EXPECT_TRUE(pending_read_);
-
-  // Satisfy decode requests until we get the first frame out.
-  while (pending_read_) {
-    decoder1_->SatisfySingleDecode();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Trigger an error in the decoding.
-  decoder1_->SimulateError();
-
-  // The error must surface from Read() as DECODE_ERROR.
-  while (last_read_status_ == VideoFrameStream::OK) {
-    ReadOneFrame();
-    base::RunLoop().RunUntilIdle();
-    EXPECT_FALSE(pending_read_);
-  }
-  EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
-}
-
-TEST_P(VideoFrameStreamTest, FallbackDecoderSelectedOnFailureToReinitialize) {
-  Initialize();
-  decoder1_->SimulateFailureToInit();
-  // Holding decode, because large decoder delays might cause us to get rid of
-  // |previous_decoder_| before we are in a pending state again.
-  decoder2_->HoldDecode();
-  ReadUntilDecoderReinitialized(decoder1_);
-  ASSERT_TRUE(video_frame_stream_->get_previous_decoder_for_testing());
-  decoder2_->SatisfyDecode();
-  base::RunLoop().RunUntilIdle();
-  ReadAllFrames();
-  ASSERT_FALSE(video_frame_stream_->get_previous_decoder_for_testing());
-}
-
-TEST_P(VideoFrameStreamTest,
-       FallbackDecoderSelectedOnFailureToReinitialize_Twice) {
-  Initialize();
-  decoder1_->SimulateFailureToInit();
-  ReadUntilDecoderReinitialized(decoder1_);
-  ReadOneFrame();
-  decoder2_->SimulateFailureToInit();
-  ReadUntilDecoderReinitialized(decoder2_);
-  ReadAllFrames();
-}
-
-TEST_P(VideoFrameStreamTest, DecodeErrorAfterFallbackDecoderSelectionFails) {
-  Initialize();
-  decoder1_->SimulateFailureToInit();
-  decoder2_->SimulateFailureToInit();
-  decoder3_->SimulateFailureToInit();
-  ReadUntilDecoderReinitialized(decoder1_);
-  // The error will surface from Read() as DECODE_ERROR.
-  while (last_read_status_ == VideoFrameStream::OK) {
-    ReadOneFrame();
-    base::RunLoop().RunUntilIdle();
-    EXPECT_FALSE(pending_read_);
-  }
-  EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
-}
-
-TEST_P(VideoFrameStreamTest, Destroy_DuringFallbackDecoderSelection) {
-  Initialize();
-  decoder1_->SimulateFailureToInit();
-  EnterPendingState(DECODER_REINIT);
-  decoder2_->HoldNextInit();
-  SatisfyPendingCallback(DECODER_REINIT);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/src/cobalt/network/persistent_cookie_store.cc b/src/cobalt/network/persistent_cookie_store.cc
index 19aa978..5c2ae8c 100644
--- a/src/cobalt/network/persistent_cookie_store.cc
+++ b/src/cobalt/network/persistent_cookie_store.cc
@@ -32,8 +32,6 @@
 const base::TimeDelta kMaxCookieLifetime = base::TimeDelta::FromDays(365 * 2);
 
 std::vector<net::CanonicalCookie*> GetAllCookies(sql::Connection* conn) {
-  base::Time maximum_expiry = base::Time::Now() + kMaxCookieLifetime;
-
   std::vector<net::CanonicalCookie*> actual_cookies;
   sql::Statement get_all(conn->GetCachedStatement(
       SQL_FROM_HERE,
@@ -41,25 +39,20 @@
       "creation, expiration, last_access, secure, http_only "
       "FROM CookieTable"));
   while (get_all.Step()) {
-    base::Time expiry = base::Time::FromInternalValue(get_all.ColumnInt64(8));
-    if (expiry > maximum_expiry) {
-      expiry = maximum_expiry;
-    }
-
-    net::CanonicalCookie* cookie = net::CanonicalCookie::Create(
+    // We create a CanonicalCookie directly through its constructor instead of
+    // through CanonicalCookie::Create() and its sanitization because these
+    // values are just serialized from a former instance of a CanonicalCookie
+    // object that *was* created through CanonicalCookie::Create().
+    net::CanonicalCookie* cookie = new net::CanonicalCookie(
         GURL(get_all.ColumnString(0)), get_all.ColumnString(1),
         get_all.ColumnString(2), get_all.ColumnString(3),
         get_all.ColumnString(4), get_all.ColumnString(5),
         get_all.ColumnString(6),
-        base::Time::FromInternalValue(get_all.ColumnInt64(7)), expiry,
+        base::Time::FromInternalValue(get_all.ColumnInt64(7)),
+        base::Time::FromInternalValue(get_all.ColumnInt64(8)),
+        base::Time::FromInternalValue(get_all.ColumnInt64(9)),
         get_all.ColumnBool(10), get_all.ColumnBool(11));
-    if (cookie) {
-      cookie->SetLastAccessDate(
-          base::Time::FromInternalValue(get_all.ColumnInt64(9)));
-      actual_cookies.push_back(cookie);
-    } else {
-      DLOG(ERROR) << "Failed to create cookie.";
-    }
+    actual_cookies.push_back(cookie);
   }
 
   return actual_cookies;
diff --git a/src/cobalt/script/fake_global_environment.h b/src/cobalt/script/fake_global_environment.h
index 391c5e7..68349e7 100644
--- a/src/cobalt/script/fake_global_environment.h
+++ b/src/cobalt/script/fake_global_environment.h
@@ -25,15 +25,17 @@
 
 class FakeGlobalEnvironment : public GlobalEnvironment {
  public:
-  void CreateGlobalObject() OVERRIDE {};
+  void CreateGlobalObject() OVERRIDE {}
   bool EvaluateScript(const scoped_refptr<SourceCode>& /*script_utf8*/,
-                      std::string* /*out_result*/) OVERRIDE {
+                      std::string* /*out_result*/,
+                      bool /*mute_script_erros_report*/) OVERRIDE {
     return false;
   }
-  bool EvaluateScript(const scoped_refptr<SourceCode>& /*script_utf8*/,
-                      const scoped_refptr<Wrappable>& /*owning_object*/,
-                      base::optional<OpaqueHandleHolder::Reference>*
-                          out_opaque_handle) OVERRIDE {
+  bool EvaluateScript(
+      const scoped_refptr<SourceCode>& /*script_utf8*/,
+      const scoped_refptr<Wrappable>& /*owning_object*/,
+      base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle,
+      bool /*mute_errors*/) OVERRIDE {
     return false;
   }
   // False positive lint error.
diff --git a/src/cobalt/script/fake_script_runner.h b/src/cobalt/script/fake_script_runner.h
index 1a6bf9e..cb304ed 100644
--- a/src/cobalt/script/fake_script_runner.h
+++ b/src/cobalt/script/fake_script_runner.h
@@ -27,10 +27,10 @@
 class FakeScriptRunner : public ScriptRunner {
  public:
   FakeScriptRunner() : fake_global_environment_(new FakeGlobalEnvironment()) {}
-  std::string Execute(
-      const std::string& /*script_utf8*/,
-      const base::SourceLocation& /*script_location*/,
-      bool* out_succeeded) OVERRIDE {
+  std::string Execute(const std::string& /*script_utf8*/,
+                      const base::SourceLocation& /*script_location*/,
+                      bool* out_succeeded,
+                      bool /*mute_script_erros_report*/) OVERRIDE {
     if (out_succeeded) {
       *out_succeeded = true;
     }
diff --git a/src/cobalt/script/global_environment.h b/src/cobalt/script/global_environment.h
index 9676f73..daf1e38 100644
--- a/src/cobalt/script/global_environment.h
+++ b/src/cobalt/script/global_environment.h
@@ -58,7 +58,8 @@
   // If out_result is non-NULL, it will be set to hold the result of the script
   // evaluation if the script succeeds, or an exception message if it fails.
   virtual bool EvaluateScript(const scoped_refptr<SourceCode>& script_utf8,
-                              std::string* out_result_utf8) = 0;
+                              std::string* out_result_utf8,
+                              bool mute_errors) = 0;
 
   // Evaluate the JavaScript source code. Returns true on success,
   // false if there is an exception.
@@ -67,7 +68,8 @@
   virtual bool EvaluateScript(
       const scoped_refptr<SourceCode>& script_utf8,
       const scoped_refptr<Wrappable>& owning_object,
-      base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle) = 0;
+      base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle,
+      bool mute_errors) = 0;
 
   // Returns the stack trace as a vector of individual frames.
   // Set |max_frames| to 0 to retrieve all available frames. Otherwise
diff --git a/src/cobalt/script/mozjs-45/mozjs-45.gyp b/src/cobalt/script/mozjs-45/mozjs-45.gyp
index fb0b0da..2ce1ff4 100644
--- a/src/cobalt/script/mozjs-45/mozjs-45.gyp
+++ b/src/cobalt/script/mozjs-45/mozjs-45.gyp
@@ -20,7 +20,6 @@
       'sources': [
         'conversion_helpers.cc',
         'mozjs_callback_interface.cc',
-        'mozjs_debugger.cc',
         'mozjs_engine.cc',
         'mozjs_exception_state.cc',
         'mozjs_global_environment.cc',
@@ -40,6 +39,7 @@
         'weak_heap_object_manager.h',
         'wrapper_factory.cc',
         'wrapper_private.cc',
+        '<(DEPTH)/cobalt/script/shared/stub_script_debugger.cc',
       ],
       'dependencies': [
         '<(DEPTH)/cobalt/script/script.gyp:script',
diff --git a/src/cobalt/script/mozjs-45/mozjs.cc b/src/cobalt/script/mozjs-45/mozjs.cc
index b17937f..dc8e290 100644
--- a/src/cobalt/script/mozjs-45/mozjs.cc
+++ b/src/cobalt/script/mozjs-45/mozjs.cc
@@ -60,7 +60,7 @@
 }
 
 int MozjsMain(int argc, char** argv) {
-  cobalt::script::StandaloneJavascriptRunner standalone_runner();
+  cobalt::script::StandaloneJavascriptRunner standalone_runner;
   MozjsGlobalEnvironment* global_environment =
       static_cast<MozjsGlobalEnvironment*>(
           standalone_runner.global_environment().get());
@@ -88,7 +88,8 @@
 
         // Execute the script and get the results of execution.
         std::string result;
-        bool success = global_environment->EvaluateScript(source, &result);
+        bool success = global_environment->EvaluateScript(
+            source, &result, false /*mute_errors*/);
         // Echo the results to stdout.
         if (!success) {
           std::cout << "Exception: ";
diff --git a/src/cobalt/script/mozjs-45/mozjs_debugger.cc b/src/cobalt/script/mozjs-45/mozjs_debugger.cc
deleted file mode 100644
index 90a1d76..0000000
--- a/src/cobalt/script/mozjs-45/mozjs_debugger.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-#include "cobalt/script/mozjs-45/mozjs_debugger.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace script {
-
-// Static factory method declared in public interface.
-scoped_ptr<ScriptDebugger> ScriptDebugger::CreateDebugger(
-    GlobalEnvironment* global_environment, Delegate* delegate) {
-  return scoped_ptr<ScriptDebugger>(
-      new mozjs::MozjsDebugger(global_environment, delegate));
-}
-
-namespace mozjs {
-
-MozjsDebugger::MozjsDebugger(GlobalEnvironment* global_environment,
-                             Delegate* delegate) {
-  NOTIMPLEMENTED();
-}
-
-MozjsDebugger::~MozjsDebugger() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::Attach() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::Detach() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::Pause() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::Resume() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::SetBreakpoint(const std::string& script_id, int line_number,
-                                  int column_number) {
-  NOTIMPLEMENTED();
-}
-
-script::ScriptDebugger::PauseOnExceptionsState
-MozjsDebugger::SetPauseOnExceptions(PauseOnExceptionsState state) {
-  NOTIMPLEMENTED();
-  return kNone;
-}
-
-void MozjsDebugger::StepInto() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::StepOut() { NOTIMPLEMENTED(); }
-
-void MozjsDebugger::StepOver() { NOTIMPLEMENTED(); }
-
-}  // namespace mozjs
-}  // namespace script
-}  // namespace cobalt
diff --git a/src/cobalt/script/mozjs-45/mozjs_debugger.h b/src/cobalt/script/mozjs-45/mozjs_debugger.h
deleted file mode 100644
index 3bb37ac..0000000
--- a/src/cobalt/script/mozjs-45/mozjs_debugger.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-#ifndef COBALT_SCRIPT_MOZJS_45_MOZJS_DEBUGGER_H_
-#define COBALT_SCRIPT_MOZJS_45_MOZJS_DEBUGGER_H_
-
-#include <string>
-
-#include "cobalt/script/script_debugger.h"
-
-namespace cobalt {
-namespace script {
-namespace mozjs {
-
-class MozjsDebugger : public ScriptDebugger {
- public:
-  MozjsDebugger(GlobalEnvironment* global_environment, Delegate* delegate);
-  ~MozjsDebugger() OVERRIDE;
-
-  // Implementation of ScriptDebugger.
-  void Attach() OVERRIDE;
-  void Detach() OVERRIDE;
-  void Pause() OVERRIDE;
-  void Resume() OVERRIDE;
-  void SetBreakpoint(const std::string& script_id, int line_number,
-                     int column_number) OVERRIDE;
-  PauseOnExceptionsState SetPauseOnExceptions(
-      PauseOnExceptionsState state) OVERRIDE;
-  void StepInto() OVERRIDE;
-  void StepOut() OVERRIDE;
-  void StepOver() OVERRIDE;
-};
-
-}  // namespace mozjs
-}  // namespace script
-}  // namespace cobalt
-
-#endif  // COBALT_SCRIPT_MOZJS_45_MOZJS_DEBUGGER_H_
diff --git a/src/cobalt/script/mozjs-45/mozjs_global_environment.cc b/src/cobalt/script/mozjs-45/mozjs_global_environment.cc
index ee6dcd4..bf451ff 100644
--- a/src/cobalt/script/mozjs-45/mozjs_global_environment.cc
+++ b/src/cobalt/script/mozjs-45/mozjs_global_environment.cc
@@ -188,8 +188,8 @@
 }
 
 bool MozjsGlobalEnvironment::EvaluateScript(
-    const scoped_refptr<SourceCode>& source_code,
-    std::string* out_result_utf8) {
+    const scoped_refptr<SourceCode>& source_code, std::string* out_result_utf8,
+    bool mute_errors) {
   TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(thread_checker_.CalledOnValidThread());
 
@@ -201,7 +201,8 @@
   std::string error_message;
   last_error_message_ = &error_message;
 
-  bool success = EvaluateScriptInternal(source_code, &result_value);
+  bool success =
+      EvaluateScriptInternal(source_code, &result_value, mute_errors);
   if (out_result_utf8) {
     if (success) {
       MozjsExceptionState exception_state(context_);
@@ -220,14 +221,16 @@
 bool MozjsGlobalEnvironment::EvaluateScript(
     const scoped_refptr<SourceCode>& source_code,
     const scoped_refptr<Wrappable>& owning_object,
-    base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle) {
+    base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle,
+    bool mute_errors) {
   TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(thread_checker_.CalledOnValidThread());
   JSAutoRequest auto_request(context_);
   JSAutoCompartment auto_compartment(context_, global_object_proxy_);
   JS::AutoSaveExceptionState auto_save_exception_state(context_);
   JS::RootedValue result_value(context_);
-  bool success = EvaluateScriptInternal(source_code, &result_value);
+  bool success =
+      EvaluateScriptInternal(source_code, &result_value, mute_errors);
   if (success && out_opaque_handle) {
     JS::RootedObject js_object(context_);
     JS_ValueToObject(context_, result_value, &js_object);
@@ -240,7 +243,7 @@
 
 bool MozjsGlobalEnvironment::EvaluateScriptInternal(
     const scoped_refptr<SourceCode>& source_code,
-    JS::MutableHandleValue out_result) {
+    JS::MutableHandleValue out_result, bool mute_errors) {
   TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(global_object_proxy_);
@@ -266,6 +269,7 @@
 
   JS::CompileOptions options(context_);
   options.setFileAndLine(location.file_path.c_str(), location.line_number);
+  options.setMutedErrors(mute_errors);
   bool success =
       JS::Evaluate(context_, options, inflated_buffer, length, out_result);
   if (!success && context_->isExceptionPending()) {
@@ -283,7 +287,7 @@
   scoped_refptr<SourceCode> source_code =
       new MozjsSourceCode(source, base::SourceLocation(filename, 1, 1));
   std::string result;
-  bool success = EvaluateScript(source_code, &result);
+  bool success = EvaluateScript(source_code, &result, false /*mute_errors*/);
   if (!success) {
     DLOG(FATAL) << result;
   }
diff --git a/src/cobalt/script/mozjs-45/mozjs_global_environment.h b/src/cobalt/script/mozjs-45/mozjs_global_environment.h
index ad99d14..5a11a63 100644
--- a/src/cobalt/script/mozjs-45/mozjs_global_environment.h
+++ b/src/cobalt/script/mozjs-45/mozjs_global_environment.h
@@ -51,12 +51,13 @@
   void CreateGlobalObject() OVERRIDE;
 
   bool EvaluateScript(const scoped_refptr<SourceCode>& script,
-                      std::string* out_result_utf8) OVERRIDE;
+                      std::string* out_result_utf8, bool mute_errors) OVERRIDE;
 
-  bool EvaluateScript(const scoped_refptr<SourceCode>& script_utf8,
-                      const scoped_refptr<Wrappable>& owning_object,
-                      base::optional<OpaqueHandleHolder::Reference>*
-                          out_opaque_handle) OVERRIDE;
+  bool EvaluateScript(
+      const scoped_refptr<SourceCode>& script_utf8,
+      const scoped_refptr<Wrappable>& owning_object,
+      base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle,
+      bool mute_errors) OVERRIDE;
 
   std::vector<StackFrame> GetStackTrace(int max_frames = 0) OVERRIDE;
 
@@ -143,7 +144,8 @@
 
  private:
   bool EvaluateScriptInternal(const scoped_refptr<SourceCode>& source_code,
-                              JS::MutableHandleValue out_result);
+                              JS::MutableHandleValue out_result,
+                              bool mute_errors);
 
   void EvaluateEmbeddedScript(const unsigned char* data, size_t size,
                               const char* filename);
diff --git a/src/cobalt/script/script_runner.cc b/src/cobalt/script/script_runner.cc
index 0768705..1da3b56 100644
--- a/src/cobalt/script/script_runner.cc
+++ b/src/cobalt/script/script_runner.cc
@@ -70,7 +70,7 @@
 
   std::string Execute(const std::string& script_utf8,
                       const base::SourceLocation& script_location,
-                      bool* out_succeeded) OVERRIDE;
+                      bool* out_succeeded, bool mute_errors) OVERRIDE;
   GlobalEnvironment* GetGlobalEnvironment() const OVERRIDE {
     return global_environment_;
   }
@@ -80,9 +80,8 @@
 };
 
 std::string ScriptRunnerImpl::Execute(
-    const std::string& script_utf8,
-    const base::SourceLocation& script_location,
-    bool* out_succeeded) {
+    const std::string& script_utf8, const base::SourceLocation& script_location,
+    bool* out_succeeded, bool mute_errors) {
   scoped_refptr<SourceCode> source_code =
       SourceCode::CreateSourceCode(script_utf8, script_location);
   if (out_succeeded) {
@@ -93,7 +92,7 @@
     return "";
   }
   std::string result;
-  if (!global_environment_->EvaluateScript(source_code, &result)) {
+  if (!global_environment_->EvaluateScript(source_code, &result, mute_errors)) {
     DLOG(WARNING) << "Failed to execute JavaScript: " << result;
 #if defined(HANDLE_CORE_DUMP)
     script_runner_log.Get().IncrementFailCount();
diff --git a/src/cobalt/script/script_runner.h b/src/cobalt/script/script_runner.h
index 142c136..5f399d4 100644
--- a/src/cobalt/script/script_runner.h
+++ b/src/cobalt/script/script_runner.h
@@ -36,7 +36,7 @@
   //   script executed without errors.
   virtual std::string Execute(const std::string& script_utf8,
                               const base::SourceLocation& script_location,
-                              bool* out_succeeded) = 0;
+                              bool* out_succeeded, bool mute_errors) = 0;
   virtual GlobalEnvironment* GetGlobalEnvironment() const { return NULL; }
   virtual ~ScriptRunner() {}
 };
diff --git a/src/cobalt/script/shared/stub_script_debugger.cc b/src/cobalt/script/shared/stub_script_debugger.cc
new file mode 100644
index 0000000..a839e83
--- /dev/null
+++ b/src/cobalt/script/shared/stub_script_debugger.cc
@@ -0,0 +1,56 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// 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.
+
+#include "cobalt/script/script_debugger.h"
+
+#include "base/logging.h"
+
+namespace cobalt {
+namespace script {
+
+class StubScriptDebugger : public ScriptDebugger {
+ public:
+  StubScriptDebugger(GlobalEnvironment* global_environment,
+                     Delegate* delegate) {
+    NOTIMPLEMENTED();
+  }
+  ~StubScriptDebugger() override { NOTIMPLEMENTED(); }
+
+  void Attach() override { NOTIMPLEMENTED(); }
+  void Detach() override { NOTIMPLEMENTED(); }
+  void Pause() override { NOTIMPLEMENTED(); }
+  void Resume() override { NOTIMPLEMENTED(); }
+  void SetBreakpoint(const std::string& script_id, int line_number,
+                     int column_number) override {
+    NOTIMPLEMENTED();
+  }
+  PauseOnExceptionsState SetPauseOnExceptions(
+      PauseOnExceptionsState state) override {
+    NOTIMPLEMENTED();
+    return kNone;
+  }
+  void StepInto() override { NOTIMPLEMENTED(); }
+  void StepOut() override { NOTIMPLEMENTED(); }
+  void StepOver() override { NOTIMPLEMENTED(); }
+};
+
+// Static factory method declared in public interface.
+scoped_ptr<ScriptDebugger> ScriptDebugger::CreateDebugger(
+    GlobalEnvironment* global_environment, Delegate* delegate) {
+  return scoped_ptr<ScriptDebugger>(
+      new StubScriptDebugger(global_environment, delegate));
+}
+
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/standalone_javascript_runner.cc b/src/cobalt/script/standalone_javascript_runner.cc
index a71d2d1..aca3084 100644
--- a/src/cobalt/script/standalone_javascript_runner.cc
+++ b/src/cobalt/script/standalone_javascript_runner.cc
@@ -69,7 +69,8 @@
 
   // Execute the script and get the results of execution.
   std::string result;
-  bool success = global_environment_->EvaluateScript(source, &result);
+  bool success = global_environment_->EvaluateScript(source, &result,
+                                                     false /*mute_errors*/);
   // Echo the results to stdout.
   if (!success) {
     std::cout << "Exception: ";
diff --git a/src/cobalt/script/v8c/v8c.gyp b/src/cobalt/script/v8c/v8c.gyp
index dc9b560..d1deb54 100644
--- a/src/cobalt/script/v8c/v8c.gyp
+++ b/src/cobalt/script/v8c/v8c.gyp
@@ -24,6 +24,7 @@
         'v8c_global_environment.h',
         'v8c_source_code.cc',
         'v8c_source_code.h',
+        '<(DEPTH)/cobalt/script/shared/stub_script_debugger.cc',
       ],
       'dependencies': [
         '<(DEPTH)/v8/src/v8.gyp:v8',
diff --git a/src/cobalt/webdriver/script_executor.cc b/src/cobalt/webdriver/script_executor.cc
index 508448a..1bbcaf3 100644
--- a/src/cobalt/webdriver/script_executor.cc
+++ b/src/cobalt/webdriver/script_executor.cc
@@ -81,7 +81,8 @@
 
   // Evaluate the harness initialization script.
   std::string result;
-  if (!global_environment->EvaluateScript(source, &result)) {
+  if (!global_environment->EvaluateScript(source, &result,
+                                          false /*mute_errors*/)) {
     return NULL;
   }
 
diff --git a/src/cobalt/webdriver/script_executor_params.cc b/src/cobalt/webdriver/script_executor_params.cc
index 1bafe8f..262ecc7 100644
--- a/src/cobalt/webdriver/script_executor_params.cc
+++ b/src/cobalt/webdriver/script_executor_params.cc
@@ -40,7 +40,8 @@
           function.c_str(), base::SourceLocation("[webdriver]", 1, 1));
 
   if (!global_environment->EvaluateScript(function_source, params.get(),
-                                          &params->function_object_)) {
+                                          &params->function_object_,
+                                          false /*mute_errors*/)) {
     DLOG(ERROR) << "Failed to create Function object";
   }
   return {params, global_environment.get()};
diff --git a/src/cobalt/webdriver/window_driver.cc b/src/cobalt/webdriver/window_driver.cc
index fac224c..f750fb3 100644
--- a/src/cobalt/webdriver/window_driver.cc
+++ b/src/cobalt/webdriver/window_driver.cc
@@ -24,6 +24,7 @@
 #include "cobalt/dom/pointer_event_init.h"
 #include "cobalt/math/clamp.h"
 #include "cobalt/script/global_environment.h"
+#include "cobalt/script/logging_exception_state.h"
 #include "cobalt/webdriver/keyboard.h"
 #include "cobalt/webdriver/search.h"
 #include "cobalt/webdriver/util/call_on_message_loop.h"
@@ -147,8 +148,9 @@
     DCHECK(thread_checker_.CalledOnValidThread());
     ElementDriver* result;
     bool success = util::TryCallOnMessageLoop(
-        window_message_loop_, base::Bind(&WindowDriver::GetElementDriver,
-                                         base::Unretained(this), element_id),
+        window_message_loop_,
+        base::Bind(&WindowDriver::GetElementDriver, base::Unretained(this),
+                   element_id),
         &result);
     return success ? result : NULL;
   }
@@ -292,8 +294,9 @@
 
 util::CommandResult<protocol::ElementId> WindowDriver::GetActiveElement() {
   return util::CallOnMessageLoop(
-      window_message_loop_, base::Bind(&WindowDriver::GetActiveElementInternal,
-                                       base::Unretained(this)),
+      window_message_loop_,
+      base::Bind(&WindowDriver::GetActiveElementInternal,
+                 base::Unretained(this)),
       protocol::Response::kNoSuchWindow);
 }
 
diff --git a/src/cobalt/xhr/xml_http_request.cc b/src/cobalt/xhr/xml_http_request.cc
index 3bdc99b..7b7d15e 100644
--- a/src/cobalt/xhr/xml_http_request.cc
+++ b/src/cobalt/xhr/xml_http_request.cc
@@ -831,7 +831,7 @@
   // 8. If CORS flag is set and actualResponse’s location URL includes
   // credentials, then return a network error.
   if (new_url.has_username() || new_url.has_password()) {
-    if (dom::URLUtils::Origin(new_url) != dom::URLUtils::Origin(request_url_)) {
+    if (loader::Origin(new_url) != loader::Origin(request_url_)) {
       DLOG(INFO) << "XHR is redirected to cross-origin url with credentials, "
                     "aborting request for security reasons.";
       HandleRequestError(kNetworkError);
@@ -865,11 +865,11 @@
   // If CORS flag is set and actualResponse’s location URL’s origin is not
   // same origin with request’s current url’s origin, then set request’s
   // origin to a unique opaque origin.
-  if (dom::URLUtils::Origin(new_url) != dom::URLUtils::Origin(request_url_)) {
+  if (loader::Origin(new_url) != loader::Origin(request_url_)) {
     if (is_cross_origin_) {
-      origin_ = dom::URLUtils::Origin();
+      origin_ = loader::Origin();
     } else {
-      origin_ = dom::URLUtils::Origin(request_url_);
+      origin_ = loader::Origin(request_url_);
       is_cross_origin_ = true;
     }
   }
@@ -1087,9 +1087,8 @@
 
   // We let data url fetch resources freely but with no response headers.
   is_data_url_ = is_data_url_ || request_url_.SchemeIs("data");
-  is_cross_origin_ =
-      (is_redirect_ && is_cross_origin_) ||
-      (origin_ != dom::URLUtils::Origin(request_url_) && !is_data_url_);
+  is_cross_origin_ = (is_redirect_ && is_cross_origin_) ||
+                     (origin_ != loader::Origin(request_url_) && !is_data_url_);
   is_redirect_ = false;
   // If the CORS flag is set, httpRequest’s method is neither `GET` nor `HEAD`
   // or httpRequest’s mode is "websocket", then append `Origin`/httpRequest’s
@@ -1106,7 +1105,8 @@
                    base::Unretained(this)),
         origin_.SerializedOrigin(),
         base::Bind(&XMLHttpRequest::CORSPreflightErrorCallback,
-                   base::Unretained(this))));
+                   base::Unretained(this)),
+        settings_->window()->get_preflight_cache()));
     corspreflight_->set_headers(request_headers_);
     // For cross-origin requests, don't send or save auth data / cookies unless
     // withCredentials was set.
@@ -1136,8 +1136,12 @@
 }
 
 void XMLHttpRequest::CORSPreflightSuccessCallback() {
-  DCHECK(url_fetcher_);
-  url_fetcher_->Start();
+  if (!url_fetcher_) {
+    HandleRequestError(XMLHttpRequest::kNetworkError);
+  } else {
+    DCHECK(url_fetcher_);
+    url_fetcher_->Start();
+  }
 }
 
 std::ostream& operator<<(std::ostream& out, const XMLHttpRequest& xhr) {
diff --git a/src/cobalt/xhr/xml_http_request.h b/src/cobalt/xhr/xml_http_request.h
index b8f4c41..abf96a1 100644
--- a/src/cobalt/xhr/xml_http_request.h
+++ b/src/cobalt/xhr/xml_http_request.h
@@ -304,7 +304,7 @@
   bool is_cross_origin_;
   // net::URLReuqest does not have origin variable so we can only store it here.
   // https://fetch.spec.whatwg.org/#concept-request-origin
-  dom::URLUtils::Origin origin_;
+  loader::Origin origin_;
   bool is_redirect_;
   std::string response_mime_type_;
   std::string request_body_text_;
diff --git a/src/starboard/shared/uwp/application_uwp.cc b/src/starboard/shared/uwp/application_uwp.cc
index 3609033..8087ee5 100644
--- a/src/starboard/shared/uwp/application_uwp.cc
+++ b/src/starboard/shared/uwp/application_uwp.cc
@@ -33,13 +33,14 @@
 #include "starboard/shared/starboard/player/video_frame_internal.h"
 #include "starboard/shared/uwp/analog_thumbstick_input_thread.h"
 #include "starboard/shared/uwp/async_utils.h"
+#include "starboard/shared/uwp/log_file_impl.h"
 #include "starboard/shared/uwp/window_internal.h"
-#include "starboard/shared/win32/log_file_impl.h"
 #include "starboard/shared/win32/thread_private.h"
 #include "starboard/shared/win32/wchar_utils.h"
 #include "starboard/string.h"
 #include "starboard/system.h"
 
+namespace sbuwp = starboard::shared::uwp;
 namespace sbwin32 = starboard::shared::win32;
 
 using Microsoft::WRL::ComPtr;
@@ -60,11 +61,13 @@
 using Windows::ApplicationModel::Core::IFrameworkView;
 using Windows::ApplicationModel::Core::IFrameworkViewSource;
 using Windows::ApplicationModel::SuspendingEventArgs;
+using Windows::Foundation::Collections::IVectorView;
 using Windows::Foundation::EventHandler;
 using Windows::Foundation::IAsyncOperation;
 using Windows::Foundation::TimeSpan;
 using Windows::Foundation::TypedEventHandler;
 using Windows::Foundation::Uri;
+using Windows::Globalization::Calendar;
 using Windows::Media::Protection::HdcpProtection;
 using Windows::Media::Protection::HdcpSession;
 using Windows::Media::Protection::HdcpSetProtectionResult;
@@ -72,6 +75,8 @@
 using Windows::Networking::Connectivity::NetworkConnectivityLevel;
 using Windows::Networking::Connectivity::NetworkInformation;
 using Windows::Networking::Connectivity::NetworkStatusChangedEventHandler;
+using Windows::Storage::KnownFolders;
+using Windows::Storage::StorageFolder;
 using Windows::System::Threading::ThreadPoolTimer;
 using Windows::System::Threading::TimerElapsedHandler;
 using Windows::System::UserAuthenticationStatus;
@@ -410,8 +415,35 @@
           ::starboard::shared::uwp::GetCommandLinePointer(application_uwp);
       if (command_line->HasSwitch(kLogPathSwitch)) {
         std::string switch_val = command_line->GetSwitchValue(kLogPathSwitch);
-        sbwin32::OpenLogInCacheDirectory(switch_val.c_str(),
-                                         kSbFileCreateAlways);
+        sbuwp::OpenLogFile(
+            Windows::Storage::ApplicationData::Current->LocalCacheFolder,
+            switch_val.c_str());
+      } else {
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+        // Log to a file on the last removable device available (probably the
+        // most recently added removable device).
+        try {
+          if (KnownFolders::RemovableDevices != nullptr) {
+            concurrency::create_task(
+                KnownFolders::RemovableDevices->GetFoldersAsync()).then(
+                [](IVectorView<StorageFolder^>^ results) {
+                  if (results->Size > 0) {
+                    StorageFolder^ folder = results->GetAt(results->Size - 1);
+                    Calendar^ now = ref new Calendar();
+                    char filename[128];
+                    SbStringFormatF(filename, sizeof(filename),
+                        "cobalt_log_%04d%02d%02d_%02d%02d%02d.txt",
+                        now->Year, now->Month, now->Day,
+                        now->Hour + now->FirstHourInThisPeriod,
+                        now->Minute, now->Second);
+                    sbuwp::OpenLogFile(folder, filename);
+                  }
+                });
+          }
+        } catch(Platform::Exception^) {
+          SB_LOG(ERROR) << "Unable to open log file in RemovableDevices";
+        }
+#endif
       }
       SB_LOG(INFO) << "Starting " << GetBinaryName();
 
diff --git a/src/starboard/shared/uwp/log_file_impl.cc b/src/starboard/shared/uwp/log_file_impl.cc
new file mode 100644
index 0000000..fbcebc9
--- /dev/null
+++ b/src/starboard/shared/uwp/log_file_impl.cc
@@ -0,0 +1,122 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// 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.
+
+#include "starboard/shared/uwp/log_file_impl.h"
+
+#include <string>
+
+#include "starboard/log.h"
+#include "starboard/mutex.h"
+#include "starboard/once.h"
+#include "starboard/shared/win32/wchar_utils.h"
+#include "starboard/string.h"
+
+using Windows::Foundation::AsyncOperationCompletedHandler;
+using Windows::Foundation::AsyncStatus;
+using Windows::Foundation::IAsyncOperation;
+using Windows::Storage::FileAccessMode;
+using Windows::Storage::StorageFile;
+using Windows::Storage::StorageFolder;
+using Windows::Storage::Streams::DataWriter;
+using Windows::Storage::Streams::IRandomAccessStream;
+using Windows::Storage::Streams::IOutputStream;
+
+namespace {
+
+SbMutex log_mutex_ = SB_MUTEX_INITIALIZER;
+
+// The Windows Storage API must be used in order to access files in priviledged
+// areas (e.g. KnownFolders::RemovableDevices). The win32 file API used by
+// SbFile returns access denied errors in these situations.
+DataWriter^ log_writer_ = nullptr;
+
+// SbMutex is not reentrant, so factor out close log file functionality for use
+// by other functions.
+void CloseLogFileWithoutLock() {
+  log_writer_ = nullptr;
+}
+
+}  // namespace
+
+namespace starboard {
+namespace shared {
+namespace uwp {
+
+void CloseLogFile() {
+  SbMutexAcquire(&log_mutex_);
+  CloseLogFileWithoutLock();
+  SbMutexRelease(&log_mutex_);
+}
+
+void OpenLogFile(StorageFolder^ folder, const char* filename) {
+  std::wstring wfilename = win32::CStringToWString(filename);
+
+  SbMutexAcquire(&log_mutex_);
+  CloseLogFileWithoutLock();
+
+  // Manually set the completion callback function instead of using
+  // concurrency::create_task() since those tasks may not execute before the
+  // UI thread wants the log_mutex_ to output another log.
+  auto task = folder->CreateFileAsync(
+      ref new Platform::String(wfilename.c_str()),
+      Windows::Storage::CreationCollisionOption::ReplaceExisting);
+  task->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(
+      [folder](IAsyncOperation<StorageFile^>^ op, AsyncStatus) {
+      try {
+        auto task = op->GetResults()->OpenAsync(FileAccessMode::ReadWrite);
+        task->Completed = ref new
+            AsyncOperationCompletedHandler<IRandomAccessStream^>(
+            [](IAsyncOperation<IRandomAccessStream^>^ op, AsyncStatus) {
+              log_writer_ = ref new DataWriter(
+                  op->GetResults()->GetOutputStreamAt(0));
+              SbMutexRelease(&log_mutex_);
+            });
+      } catch(Platform::Exception^) {
+        SbMutexRelease(&log_mutex_);
+        SB_LOG(ERROR) << "Unable to open log file in folder "
+                      << win32::platformStringToString(folder->Name);
+      }
+    });
+}
+
+void WriteToLogFile(const char* text, int text_length) {
+  if (text_length <= 0) {
+    return;
+  }
+
+  SbMutexAcquire(&log_mutex_);
+  if (log_writer_) {
+    log_writer_->WriteBytes(ref new Platform::Array<unsigned char>(
+        (unsigned char*) text, text_length));
+
+    // Manually set the completion callback function instead of using
+    // concurrency::create_task() since those tasks may not execute before the
+    // UI thread wants the log_mutex_ to output another log.
+    auto task = log_writer_->StoreAsync();
+    task->Completed = ref new AsyncOperationCompletedHandler<unsigned int>(
+        [](IAsyncOperation<unsigned int>^, AsyncStatus) {
+          auto task = log_writer_->FlushAsync();
+          task->Completed = ref new AsyncOperationCompletedHandler<bool>(
+              [](IAsyncOperation<bool>^, AsyncStatus) {
+                SbMutexRelease(&log_mutex_);
+              });
+        });
+  } else {
+    SbMutexRelease(&log_mutex_);
+  }
+}
+
+}  // namespace uwp
+}  // namespace shared
+}  // namespace starboard
diff --git a/src/starboard/shared/uwp/log_file_impl.h b/src/starboard/shared/uwp/log_file_impl.h
new file mode 100644
index 0000000..6f24f53
--- /dev/null
+++ b/src/starboard/shared/uwp/log_file_impl.h
@@ -0,0 +1,36 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// 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.
+
+// This header provides a mechanism for multiple Android logging
+// formats to share a single log file handle.
+
+#ifndef STARBOARD_SHARED_UWP_LOG_FILE_IMPL_H_
+#define STARBOARD_SHARED_UWP_LOG_FILE_IMPL_H_
+
+namespace starboard {
+namespace shared {
+namespace uwp {
+
+void CloseLogFile();
+
+void OpenLogFile(Windows::Storage::StorageFolder^ folder,
+                 const char* filename);
+
+void WriteToLogFile(const char* text, int text_length);
+
+}  // namespace uwp
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_UWP_LOG_FILE_IMPL_H_
diff --git a/src/starboard/shared/uwp/log_raw.cc b/src/starboard/shared/uwp/log_raw.cc
new file mode 100644
index 0000000..da8ca37
--- /dev/null
+++ b/src/starboard/shared/uwp/log_raw.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// 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.
+
+#include "starboard/log.h"
+
+#include <stdio.h>
+#include <windows.h>
+
+#include "starboard/shared/uwp/log_file_impl.h"
+#include "starboard/string.h"
+
+namespace sbuwp = starboard::shared::uwp;
+
+void SbLogRaw(const char* message) {
+  fprintf(stderr, "%s", message);
+  OutputDebugStringA(message);
+  sbuwp::WriteToLogFile(
+      message, static_cast<int>(SbStringGetLength(message)));
+}
diff --git a/src/starboard/shared/uwp/log_raw_format.cc b/src/starboard/shared/uwp/log_raw_format.cc
new file mode 100644
index 0000000..40354bf
--- /dev/null
+++ b/src/starboard/shared/uwp/log_raw_format.cc
@@ -0,0 +1,36 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// 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.
+
+#include "starboard/log.h"
+
+#include <stdio.h>
+#include <windows.h>
+
+#include "starboard/shared/uwp/log_file_impl.h"
+
+static const int kMaxLogLineChars = 16 * 1024;
+
+namespace sbuwp = starboard::shared::uwp;
+
+void SbLogRawFormat(const char* format, va_list arguments) {
+  vfprintf(stderr, format, arguments);
+  char log_buffer[kMaxLogLineChars];
+  int result = vsprintf_s(log_buffer, kMaxLogLineChars, format, arguments);
+  if (result > 0) {
+    OutputDebugStringA(log_buffer);
+    sbuwp::WriteToLogFile(log_buffer, result);
+  } else {
+    OutputDebugStringA("[log line too long]");
+  }
+}
diff --git a/src/starboard/shared/uwp/starboard_platform.gypi b/src/starboard/shared/uwp/starboard_platform.gypi
index bb3a5d5..7b0c645 100644
--- a/src/starboard/shared/uwp/starboard_platform.gypi
+++ b/src/starboard/shared/uwp/starboard_platform.gypi
@@ -24,6 +24,10 @@
       'application_uwp.h',
       'async_utils.h',
       'get_home_directory.cc',
+      'log_file_impl.cc',
+      'log_file_impl.h',
+      'log_raw.cc',
+      'log_raw_format.cc',
       'media_is_output_protected.cc',
       'media_set_output_protection.cc',
       'system_clear_platform_error.cc',
diff --git a/src/starboard/shared/win32/log_file_impl.cc b/src/starboard/shared/win32/log_file_impl.cc
index 1d258ae..89371cd 100644
--- a/src/starboard/shared/win32/log_file_impl.cc
+++ b/src/starboard/shared/win32/log_file_impl.cc
@@ -28,6 +28,16 @@
 SbMutex log_mutex = SB_MUTEX_INITIALIZER;
 SbFile log_file = kSbFileInvalid;
 
+// SbMutex is not reentrant, so factor out close log file functionality for use
+// by other functions.
+void CloseLogFileWithoutLock() {
+  if (SbFileIsValid(log_file)) {
+    SbFileFlush(log_file);
+    SbFileClose(log_file);
+    log_file = kSbFileInvalid;
+  }
+}
+
 }  // namespace
 
 namespace starboard {
@@ -36,13 +46,7 @@
 
 void CloseLogFile() {
   SbMutexAcquire(&log_mutex);
-
-  if (SbFileIsValid(log_file)) {
-    SbFileFlush(log_file);
-    SbFileClose(log_file);
-    log_file = kSbFileInvalid;
-  }
-
+  CloseLogFileWithoutLock();
   SbMutexRelease(&log_mutex);
 }
 
@@ -73,12 +77,12 @@
 void OpenLogFile(const char* path, const int creation_flags) {
   SB_DCHECK((creation_flags & kSbFileOpenAlways) ||
             (creation_flags & kSbFileCreateAlways));
-  CloseLogFile();
   SB_DLOG(INFO) << "Logging to [" << path << "]";
 
   int flags = creation_flags | kSbFileWrite;
 
   SbMutexAcquire(&log_mutex);
+  CloseLogFileWithoutLock();
   if ((path != nullptr) && (path != '\0')) {
     log_file = SbFileOpen(path, flags, nullptr, nullptr);
     SB_DCHECK(SbFileIsValid(log_file));
diff --git a/src/starboard/win/shared/starboard_platform.gypi b/src/starboard/win/shared/starboard_platform.gypi
index 9302e9c..260f790 100644
--- a/src/starboard/win/shared/starboard_platform.gypi
+++ b/src/starboard/win/shared/starboard_platform.gypi
@@ -22,6 +22,10 @@
       '<(DEPTH)/starboard/shared/win32/application_win32.cc',
       '<(DEPTH)/starboard/shared/win32/dialog.cc',
       '<(DEPTH)/starboard/shared/win32/get_home_directory.cc',
+      '<(DEPTH)/starboard/shared/win32/log_file_impl.cc',
+      '<(DEPTH)/starboard/shared/win32/log_file_impl.h',
+      '<(DEPTH)/starboard/shared/win32/log_raw.cc',
+      '<(DEPTH)/starboard/shared/win32/log_raw_format.cc',
       '<(DEPTH)/starboard/shared/win32/media_is_video_supported.cc',
       '<(DEPTH)/starboard/shared/win32/playready_license.cc',
       '<(DEPTH)/starboard/shared/win32/starboard_main.cc',
@@ -302,14 +306,10 @@
         '<(DEPTH)/starboard/shared/win32/file_truncate.cc',
         '<(DEPTH)/starboard/shared/win32/file_write.cc',
         '<(DEPTH)/starboard/shared/win32/log.cc',
-        '<(DEPTH)/starboard/shared/win32/log_file_impl.cc',
-        '<(DEPTH)/starboard/shared/win32/log_file_impl.h',
         '<(DEPTH)/starboard/shared/win32/log_flush.cc',
         '<(DEPTH)/starboard/shared/win32/log_format.cc',
         '<(DEPTH)/starboard/shared/win32/log_is_tty.cc',
-        '<(DEPTH)/starboard/shared/win32/log_raw.cc',
         '<(DEPTH)/starboard/shared/win32/log_raw_dump_stack.cc',
-        '<(DEPTH)/starboard/shared/win32/log_raw_format.cc',
         '<(DEPTH)/starboard/shared/win32/memory_allocate_aligned_unchecked.cc',
         '<(DEPTH)/starboard/shared/win32/memory_allocate_unchecked.cc',
         '<(DEPTH)/starboard/shared/win32/memory_free.cc',
diff --git a/src/v8/src/d8.gyp b/src/v8/src/d8.gyp
index e6a4021..780a833 100644
--- a/src/v8/src/d8.gyp
+++ b/src/v8/src/d8.gyp
@@ -31,7 +31,22 @@
     # Enable support for Intel VTune. Supported on ia32/x64 only
     'v8_enable_vtunejit%': 0,
     'v8_enable_i18n_support%': 1,
+
+    'test_isolation_mode': 'noop',
+    'v8_use_snapshot': 0,
+    'v8_optimized_debug': 0,
+    'v8_use_external_startup_data': 0,
+    # TODO: Enable i18n support.
+    'v8_enable_i18n_support': 0,
   },
+  # TODO: Remove after starboardization.
+  'target_defaults': {
+    'defines': [
+      'V8_OS_POSIX=1',
+      'V8_OS_LINUX=1',
+      'V8_TRAP_HANDLER_SUPPORTED=1',
+    ],
+   },
   'includes': ['../gypfiles/toolchain.gypi', '../gypfiles/features.gypi'],
   'targets': [
     {
@@ -65,9 +80,11 @@
             'd8_js2c',
           ],
         }],
+        # TODO: Remove OS=="starboard" after starboardization.
         ['(OS=="linux" or OS=="mac" or OS=="freebsd" or OS=="netbsd" \
            or OS=="openbsd" or OS=="solaris" or OS=="android" \
-           or OS=="qnx" or OS=="aix")', {
+           or OS=="qnx" or OS=="aix" \
+           or OS=="starboard")', {
              'sources': [ 'd8-posix.cc', ]
            }],
         [ 'OS=="win"', {
diff --git a/src/v8/src/libplatform/tracing/trace-object.cc b/src/v8/src/libplatform/tracing/trace-object.cc
index bb4bf71..54a785f 100644
--- a/src/v8/src/libplatform/tracing/trace-object.cc
+++ b/src/v8/src/libplatform/tracing/trace-object.cc
@@ -4,7 +4,7 @@
 
 #include "include/libplatform/v8-tracing.h"
 
-#include "base/trace_event/common/trace_event_common.h"
+#include "v8/src/tracing/trace_event_common.h"
 #include "include/v8-platform.h"
 #include "src/base/platform/platform.h"
 #include "src/base/platform/time.h"
diff --git a/src/v8/src/libplatform/tracing/trace-writer.cc b/src/v8/src/libplatform/tracing/trace-writer.cc
index 7445087..86e69ef 100644
--- a/src/v8/src/libplatform/tracing/trace-writer.cc
+++ b/src/v8/src/libplatform/tracing/trace-writer.cc
@@ -6,7 +6,7 @@
 
 #include <cmath>
 
-#include "base/trace_event/common/trace_event_common.h"
+#include "v8/src/tracing/trace_event_common.h"
 #include "include/v8-platform.h"
 #include "src/base/platform/platform.h"
 
diff --git a/src/v8/src/tracing/trace-event.h b/src/v8/src/tracing/trace-event.h
index 6ca3950..4cb4275 100644
--- a/src/v8/src/tracing/trace-event.h
+++ b/src/v8/src/tracing/trace-event.h
@@ -8,7 +8,7 @@
 #include <stddef.h>
 #include <memory>
 
-#include "base/trace_event/common/trace_event_common.h"
+#include "v8/src/tracing/trace_event_common.h"
 #include "include/v8-platform.h"
 #include "src/base/atomicops.h"
 #include "src/base/macros.h"
diff --git a/src/v8/src/tracing/trace_event_common.h b/src/v8/src/tracing/trace_event_common.h
new file mode 100644
index 0000000..5866d41
--- /dev/null
+++ b/src/v8/src/tracing/trace_event_common.h
@@ -0,0 +1,1085 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This header file defines the set of trace_event macros without specifying
+// how the events actually get collected and stored. If you need to expose trace
+// events to some other universe, you can copy-and-paste this file as well as
+// trace_event.h, modifying the macros contained there as necessary for the
+// target platform. The end result is that multiple libraries can funnel events
+// through to a shared trace event collector.
+
+// IMPORTANT: To avoid conflicts, if you need to modify this file for a library,
+// land your change in base/ first, and then copy-and-paste it.
+
+// Trace events are for tracking application performance and resource usage.
+// Macros are provided to track:
+//    Begin and end of function calls
+//    Counters
+//
+// Events are issued against categories. Whereas LOG's
+// categories are statically defined, TRACE categories are created
+// implicitly with a string. For example:
+//   TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent",
+//                        TRACE_EVENT_SCOPE_THREAD)
+//
+// It is often the case that one trace may belong in multiple categories at the
+// same time. The first argument to the trace can be a comma-separated list of
+// categories, forming a category group, like:
+//
+// TRACE_EVENT_INSTANT0("input,views", "OnMouseOver", TRACE_EVENT_SCOPE_THREAD)
+//
+// We can enable/disable tracing of OnMouseOver by enabling/disabling either
+// category.
+//
+// Events can be INSTANT, or can be pairs of BEGIN and END in the same scope:
+//   TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly")
+//   doSomethingCostly()
+//   TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly")
+// Note: our tools can't always determine the correct BEGIN/END pairs unless
+// these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you
+// need them to be in separate scopes.
+//
+// A common use case is to trace entire function scopes. This
+// issues a trace BEGIN and END automatically:
+//   void doSomethingCostly() {
+//     TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly");
+//     ...
+//   }
+//
+// Additional parameters can be associated with an event:
+//   void doSomethingCostly2(int howMuch) {
+//     TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly",
+//         "howMuch", howMuch);
+//     ...
+//   }
+//
+// The trace system will automatically add to this information the
+// current process id, thread id, and a timestamp in microseconds.
+//
+// To trace an asynchronous procedure such as an IPC send/receive, use
+// ASYNC_BEGIN and ASYNC_END:
+//   [single threaded sender code]
+//     static int send_count = 0;
+//     ++send_count;
+//     TRACE_EVENT_ASYNC_BEGIN0("ipc", "message", send_count);
+//     Send(new MyMessage(send_count));
+//   [receive code]
+//     void OnMyMessage(send_count) {
+//       TRACE_EVENT_ASYNC_END0("ipc", "message", send_count);
+//     }
+// The third parameter is a unique ID to match ASYNC_BEGIN/ASYNC_END pairs.
+// ASYNC_BEGIN and ASYNC_END can occur on any thread of any traced process.
+// Pointers can be used for the ID parameter, and they will be mangled
+// internally so that the same pointer on two different processes will not
+// match. For example:
+//   class MyTracedClass {
+//    public:
+//     MyTracedClass() {
+//       TRACE_EVENT_ASYNC_BEGIN0("category", "MyTracedClass", this);
+//     }
+//     ~MyTracedClass() {
+//       TRACE_EVENT_ASYNC_END0("category", "MyTracedClass", this);
+//     }
+//   }
+//
+// Trace event also supports counters, which is a way to track a quantity
+// as it varies over time. Counters are created with the following macro:
+//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue);
+//
+// Counters are process-specific. The macro itself can be issued from any
+// thread, however.
+//
+// Sometimes, you want to track two counters at once. You can do this with two
+// counter macros:
+//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]);
+//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]);
+// Or you can do it with a combined macro:
+//   TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter",
+//       "bytesPinned", g_myCounterValue[0],
+//       "bytesAllocated", g_myCounterValue[1]);
+// This indicates to the tracing UI that these counters should be displayed
+// in a single graph, as a summed area chart.
+//
+// Since counters are in a global namespace, you may want to disambiguate with a
+// unique ID, by using the TRACE_COUNTER_ID* variations.
+//
+// By default, trace collection is compiled in, but turned off at runtime.
+// Collecting trace data is the responsibility of the embedding
+// application. In Chrome's case, navigating to about:tracing will turn on
+// tracing and display data collected across all active processes.
+//
+//
+// Memory scoping note:
+// Tracing copies the pointers, not the string content, of the strings passed
+// in for category_group, name, and arg_names.  Thus, the following code will
+// cause problems:
+//     char* str = strdup("importantName");
+//     TRACE_EVENT_INSTANT0("SUBSYSTEM", str);  // BAD!
+//     free(str);                   // Trace system now has dangling pointer
+//
+// To avoid this issue with the |name| and |arg_name| parameters, use the
+// TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead.
+// Notes: The category must always be in a long-lived char* (i.e. static const).
+//        The |arg_values|, when used, are always deep copied with the _COPY
+//        macros.
+//
+// When are string argument values copied:
+// const char* arg_values are only referenced by default:
+//     TRACE_EVENT1("category", "name",
+//                  "arg1", "literal string is only referenced");
+// Use TRACE_STR_COPY to force copying of a const char*:
+//     TRACE_EVENT1("category", "name",
+//                  "arg1", TRACE_STR_COPY("string will be copied"));
+// std::string arg_values are always copied:
+//     TRACE_EVENT1("category", "name",
+//                  "arg1", std::string("string will be copied"));
+//
+//
+// Convertable notes:
+// Converting a large data type to a string can be costly. To help with this,
+// the trace framework provides an interface ConvertableToTraceFormat. If you
+// inherit from it and implement the AppendAsTraceFormat method the trace
+// framework will call back to your object to convert a trace output time. This
+// means, if the category for the event is disabled, the conversion will not
+// happen.
+//
+//   class MyData : public base::trace_event::ConvertableToTraceFormat {
+//    public:
+//     MyData() {}
+//     void AppendAsTraceFormat(std::string* out) const override {
+//       out->append("{\"foo\":1}");
+//     }
+//    private:
+//     ~MyData() override {}
+//     DISALLOW_COPY_AND_ASSIGN(MyData);
+//   };
+//
+//   TRACE_EVENT1("foo", "bar", "data",
+//                std::unique_ptr<ConvertableToTraceFormat>(new MyData()));
+//
+// The trace framework will take ownership if the passed pointer and it will
+// be free'd when the trace buffer is flushed.
+//
+// Note, we only do the conversion when the buffer is flushed, so the provided
+// data object should not be modified after it's passed to the trace framework.
+//
+//
+// Thread Safety:
+// A thread safe singleton and mutex are used for thread safety. Category
+// enabled flags are used to limit the performance impact when the system
+// is not enabled.
+//
+// TRACE_EVENT macros first cache a pointer to a category. The categories are
+// statically allocated and safe at all times, even after exit. Fetching a
+// category is protected by the TraceLog::lock_. Multiple threads initializing
+// the static variable is safe, as they will be serialized by the lock and
+// multiple calls will return the same pointer to the category.
+//
+// Then the category_group_enabled flag is checked. This is a unsigned char, and
+// not intended to be multithread safe. It optimizes access to AddTraceEvent
+// which is threadsafe internally via TraceLog::lock_. The enabled flag may
+// cause some threads to incorrectly call or skip calling AddTraceEvent near
+// the time of the system being enabled or disabled. This is acceptable as
+// we tolerate some data loss while the system is being enabled/disabled and
+// because AddTraceEvent is threadsafe internally and checks the enabled state
+// again under lock.
+//
+// Without the use of these static category pointers and enabled flags all
+// trace points would carry a significant performance cost of acquiring a lock
+// and resolving the category.
+
+#if defined(TRACE_EVENT0)
+#error "Another copy of this file has already been included."
+#endif
+
+// This will mark the trace event as disabled by default. The user will need
+// to explicitly enable the event.
+#define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name
+
+// Records a pair of begin and end events called "name" for the current
+// scope, with 0, 1 or 2 associated arguments. If the category is not
+// enabled, then this does nothing.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+#define TRACE_EVENT0(category_group, name)    \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name)
+#define TRACE_EVENT_WITH_FLOW0(category_group, name, bind_id, flow_flags)  \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \
+                                            flow_flags)
+#define TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, arg1_name, arg1_val)
+#define TRACE_EVENT_WITH_FLOW1(category_group, name, bind_id, flow_flags,  \
+                               arg1_name, arg1_val)                        \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \
+                                            flow_flags, arg1_name, arg1_val)
+#define TRACE_EVENT2(category_group, name, arg1_name, arg1_val, arg2_name,   \
+                     arg2_val)                                               \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, arg1_name, arg1_val, \
+                                  arg2_name, arg2_val)
+#define TRACE_EVENT_WITH_FLOW2(category_group, name, bind_id, flow_flags,    \
+                               arg1_name, arg1_val, arg2_name, arg2_val)     \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id,   \
+                                            flow_flags, arg1_name, arg1_val, \
+                                            arg2_name, arg2_val)
+
+// Records a single event called "name" immediately, with 0, 1 or 2
+// associated arguments. If the category is not enabled, then this
+// does nothing.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+#define TRACE_EVENT_INSTANT0(category_group, name, scope)                   \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE | scope)
+#define TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
+                           TRACE_EVENT_FLAG_NONE | scope, arg1_name, arg1_val)
+#define TRACE_EVENT_INSTANT2(category_group, name, scope, arg1_name, arg1_val, \
+                             arg2_name, arg2_val)                              \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
+                           TRACE_EVENT_FLAG_NONE | scope, arg1_name, arg1_val, \
+                           arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_INSTANT0(category_group, name, scope)              \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY | scope)
+#define TRACE_EVENT_COPY_INSTANT1(category_group, name, scope, arg1_name,   \
+                                  arg1_val)                                 \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY | scope, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_INSTANT2(category_group, name, scope, arg1_name,      \
+                                  arg1_val, arg2_name, arg2_val)               \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
+                           TRACE_EVENT_FLAG_COPY | scope, arg1_name, arg1_val, \
+                           arg2_name, arg2_val)
+
+#define TRACE_EVENT_INSTANT_WITH_TIMESTAMP0(category_group, name, scope, \
+                                            timestamp)                   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                               \
+      TRACE_EVENT_PHASE_INSTANT, category_group, name, timestamp,        \
+      TRACE_EVENT_FLAG_NONE | scope)
+
+#define TRACE_EVENT_INSTANT_WITH_TIMESTAMP1(category_group, name, scope,  \
+                                            timestamp, arg_name, arg_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                \
+      TRACE_EVENT_PHASE_INSTANT, category_group, name, timestamp,         \
+      TRACE_EVENT_FLAG_NONE | scope, arg_name, arg_val)
+
+// Records a single BEGIN event called "name" immediately, with 0, 1 or 2
+// associated arguments. If the category is not enabled, then this
+// does nothing.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+#define TRACE_EVENT_BEGIN0(category_group, name)                          \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_BEGIN1(category_group, name, arg1_name, arg1_val)     \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_BEGIN2(category_group, name, arg1_name, arg1_val,     \
+                           arg2_name, arg2_val)                           \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val,    \
+                           arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_BEGIN0(category_group, name)                     \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_BEGIN1(category_group, name, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name,  \
+                           TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_BEGIN2(category_group, name, arg1_name, arg1_val, \
+                                arg2_name, arg2_val)                       \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name,  \
+                           TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val,     \
+                           arg2_name, arg2_val)
+
+// Similar to TRACE_EVENT_BEGINx but with a custom |at| timestamp provided.
+// - |id| is used to match the _BEGIN event with the _END event.
+//   Events are considered to match if their category_group, name and id values
+//   all match. |id| must either be a pointer or an integer value up to 64 bits.
+//   If it's a pointer, the bits will be xored with a hash of the process ID so
+//   that the same pointer on two different processes will not collide.
+#define TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \
+                                                     thread_id, timestamp)     \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id,      \
+      timestamp, TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(                \
+    category_group, name, id, thread_id, timestamp)                       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \
+      timestamp, TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP1(                \
+    category_group, name, id, thread_id, timestamp, arg1_name, arg1_val)  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \
+      timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP2(                \
+    category_group, name, id, thread_id, timestamp, arg1_name, arg1_val,  \
+    arg2_name, arg2_val)                                                  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \
+      timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name,   \
+      arg2_val)
+
+// Records a single END event for "name" immediately. If the category
+// is not enabled, then this does nothing.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+#define TRACE_EVENT_END0(category_group, name)                          \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_END1(category_group, name, arg1_name, arg1_val)     \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_END2(category_group, name, arg1_name, arg1_val, arg2_name, \
+                         arg2_val)                                             \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name,        \
+                           TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val,         \
+                           arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_END0(category_group, name)                     \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_END1(category_group, name, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name,  \
+                           TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_END2(category_group, name, arg1_name, arg1_val, \
+                              arg2_name, arg2_val)                       \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name,  \
+                           TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val,   \
+                           arg2_name, arg2_val)
+
+#define TRACE_EVENT_MARK_WITH_TIMESTAMP0(category_group, name, timestamp) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                \
+      TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,            \
+      TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_MARK_WITH_TIMESTAMP1(category_group, name, timestamp, \
+                                         arg1_name, arg1_val)             \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                \
+      TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,            \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+
+#define TRACE_EVENT_MARK_WITH_TIMESTAMP2(                                      \
+    category_group, name, timestamp, arg1_name, arg1_val, arg2_name, arg2_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                     \
+      TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,                 \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+
+#define TRACE_EVENT_COPY_MARK(category_group, name)                      \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY)
+
+#define TRACE_EVENT_COPY_MARK_WITH_TIMESTAMP(category_group, name, timestamp) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                    \
+      TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,                \
+      TRACE_EVENT_FLAG_COPY)
+
+// Similar to TRACE_EVENT_ENDx but with a custom |at| timestamp provided.
+// - |id| is used to match the _BEGIN event with the _END event.
+//   Events are considered to match if their category_group, name and id values
+//   all match. |id| must either be a pointer or an integer value up to 64 bits.
+//   If it's a pointer, the bits will be xored with a hash of the process ID so
+//   that the same pointer on two different processes will not collide.
+#define TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \
+                                                   thread_id, timestamp)     \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                        \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id,      \
+      timestamp, TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0(                \
+    category_group, name, id, thread_id, timestamp)                     \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id, \
+      timestamp, TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP1(                 \
+    category_group, name, id, thread_id, timestamp, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                    \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id,  \
+      timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP2(                 \
+    category_group, name, id, thread_id, timestamp, arg1_name, arg1_val, \
+    arg2_name, arg2_val)                                                 \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                    \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id,  \
+      timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name,  \
+      arg2_val)
+
+// Records the value of a counter called "name" immediately. Value
+// must be representable as a 32 bit integer.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+#define TRACE_COUNTER1(category_group, name, value)                         \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE, "value",                  \
+                           static_cast<int>(value))
+#define TRACE_COPY_COUNTER1(category_group, name, value)                    \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY, "value",                  \
+                           static_cast<int>(value))
+
+// Records the values of a multi-parted counter called "name" immediately.
+// The UI will treat value1 and value2 as parts of a whole, displaying their
+// values as a stacked-bar chart.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+#define TRACE_COUNTER2(category_group, name, value1_name, value1_val,       \
+                       value2_name, value2_val)                             \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
+                           TRACE_EVENT_FLAG_NONE, value1_name,              \
+                           static_cast<int>(value1_val), value2_name,       \
+                           static_cast<int>(value2_val))
+#define TRACE_COPY_COUNTER2(category_group, name, value1_name, value1_val,  \
+                            value2_name, value2_val)                        \
+  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
+                           TRACE_EVENT_FLAG_COPY, value1_name,              \
+                           static_cast<int>(value1_val), value2_name,       \
+                           static_cast<int>(value2_val))
+
+// Similar to TRACE_COUNTERx, but with a custom |timestamp| provided.
+#define TRACE_COUNTER_WITH_TIMESTAMP1(category_group, name, timestamp, value) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                    \
+      TRACE_EVENT_PHASE_COUNTER, category_group, name, timestamp,             \
+      TRACE_EVENT_FLAG_NONE, "value", static_cast<int>(value))
+
+#define TRACE_COUNTER_WITH_TIMESTAMP2(category_group, name, timestamp,      \
+                                      value1_name, value1_val, value2_name, \
+                                      value2_val)                           \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                  \
+      TRACE_EVENT_PHASE_COUNTER, category_group, name, timestamp,           \
+      TRACE_EVENT_FLAG_NONE, value1_name, static_cast<int>(value1_val),     \
+      value2_name, static_cast<int>(value2_val))
+
+// Records the value of a counter called "name" immediately. Value
+// must be representable as a 32 bit integer.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+// - |id| is used to disambiguate counters with the same name. It must either
+//   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
+//   will be xored with a hash of the process ID so that the same pointer on
+//   two different processes will not collide.
+#define TRACE_COUNTER_ID1(category_group, name, id, value)                    \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_NONE, "value",  \
+                                   static_cast<int>(value))
+#define TRACE_COPY_COUNTER_ID1(category_group, name, id, value)               \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_COPY, "value",  \
+                                   static_cast<int>(value))
+
+// Records the values of a multi-parted counter called "name" immediately.
+// The UI will treat value1 and value2 as parts of a whole, displaying their
+// values as a stacked-bar chart.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+// - |id| is used to disambiguate counters with the same name. It must either
+//   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
+//   will be xored with a hash of the process ID so that the same pointer on
+//   two different processes will not collide.
+#define TRACE_COUNTER_ID2(category_group, name, id, value1_name, value1_val,  \
+                          value2_name, value2_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_NONE,           \
+                                   value1_name, static_cast<int>(value1_val), \
+                                   value2_name, static_cast<int>(value2_val))
+#define TRACE_COPY_COUNTER_ID2(category_group, name, id, value1_name,         \
+                               value1_val, value2_name, value2_val)           \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_COPY,           \
+                                   value1_name, static_cast<int>(value1_val), \
+                                   value2_name, static_cast<int>(value2_val))
+
+// TRACE_EVENT_SAMPLE_* events are injected by the sampling profiler.
+#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP0(category_group, name,       \
+                                                   thread_id, timestamp)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \
+      TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP1(                            \
+    category_group, name, thread_id, timestamp, arg1_name, arg1_val)           \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+
+#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP2(category_group, name,       \
+                                                   thread_id, timestamp,       \
+                                                   arg1_name, arg1_val,        \
+                                                   arg2_name, arg2_val)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+
+#define TRACE_EVENT_SAMPLE_WITH_ID1(category_group, name, id, arg1_name,       \
+                                    arg1_val)                                  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_SAMPLE, category_group,   \
+                                   name, id, TRACE_EVENT_FLAG_NONE, arg1_name, \
+                                   arg1_val)
+
+// ASYNC_STEP_* APIs should be only used by legacy code. New code should
+// consider using NESTABLE_ASYNC_* APIs to describe substeps within an async
+// event.
+// Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2
+// associated arguments. If the category is not enabled, then this
+// does nothing.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+// - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event. ASYNC
+//   events are considered to match if their category_group, name and id values
+//   all match. |id| must either be a pointer or an integer value up to 64 bits.
+//   If it's a pointer, the bits will be xored with a hash of the process ID so
+//   that the same pointer on two different processes will not collide.
+//
+// An asynchronous operation can consist of multiple phases. The first phase is
+// defined by the ASYNC_BEGIN calls. Additional phases can be defined using the
+// ASYNC_STEP_INTO or ASYNC_STEP_PAST macros. The ASYNC_STEP_INTO macro will
+// annotate the block following the call. The ASYNC_STEP_PAST macro will
+// annotate the block prior to the call. Note that any particular event must use
+// only STEP_INTO or STEP_PAST macros; they can not mix and match. When the
+// operation completes, call ASYNC_END.
+//
+// An ASYNC trace typically occurs on a single thread (if not, they will only be
+// drawn on the thread defined in the ASYNC_BEGIN event), but all events in that
+// operation must use the same |name| and |id|. Each step can have its own
+// args.
+#define TRACE_EVENT_ASYNC_BEGIN0(category_group, name, id)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
+                                   category_group, name, id,      \
+                                   TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_ASYNC_BEGIN1(category_group, name, id, arg1_name, \
+                                 arg1_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN,     \
+                                   category_group, name, id,          \
+                                   TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_ASYNC_BEGIN2(category_group, name, id, arg1_name, \
+                                 arg1_val, arg2_name, arg2_val)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                   \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,        \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_ASYNC_BEGIN0(category_group, name, id)   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
+                                   category_group, name, id,      \
+                                   TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_ASYNC_BEGIN1(category_group, name, id, arg1_name, \
+                                      arg1_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN,          \
+                                   category_group, name, id,               \
+                                   TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_ASYNC_BEGIN2(category_group, name, id, arg1_name, \
+                                      arg1_val, arg2_name, arg2_val)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                        \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,             \
+      TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val)
+
+// Similar to TRACE_EVENT_ASYNC_BEGINx but with a custom |at| timestamp
+// provided.
+#define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, \
+                                                timestamp)                \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,            \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1(                           \
+    category_group, name, id, timestamp, arg1_name, arg1_val)              \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                      \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,             \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
+      arg1_name, arg1_val)
+#define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP2(category_group, name, id,      \
+                                                timestamp, arg1_name,          \
+                                                arg1_val, arg2_name, arg2_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,                 \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,     \
+      arg1_name, arg1_val, arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, \
+                                                     timestamp)                \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,                 \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
+
+// Records a single ASYNC_STEP_INTO event for |step| immediately. If the
+// category is not enabled, then this does nothing. The |name| and |id| must
+// match the ASYNC_BEGIN event above. The |step| param identifies this step
+// within the async event. This should be called at the beginning of the next
+// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
+// ASYNC_STEP_PAST events.
+#define TRACE_EVENT_ASYNC_STEP_INTO0(category_group, name, id, step)  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, \
+                                   category_group, name, id,          \
+                                   TRACE_EVENT_FLAG_NONE, "step", step)
+#define TRACE_EVENT_ASYNC_STEP_INTO1(category_group, name, id, step, \
+                                     arg1_name, arg1_val)            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
+      TRACE_EVENT_PHASE_ASYNC_STEP_INTO, category_group, name, id,   \
+      TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val)
+
+// Similar to TRACE_EVENT_ASYNC_STEP_INTOx but with a custom |at| timestamp
+// provided.
+#define TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0(category_group, name, id, \
+                                                    step, timestamp)          \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
+      TRACE_EVENT_PHASE_ASYNC_STEP_INTO, category_group, name, id,            \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
+      "step", step)
+
+// Records a single ASYNC_STEP_PAST event for |step| immediately. If the
+// category is not enabled, then this does nothing. The |name| and |id| must
+// match the ASYNC_BEGIN event above. The |step| param identifies this step
+// within the async event. This should be called at the beginning of the next
+// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
+// ASYNC_STEP_INTO events.
+#define TRACE_EVENT_ASYNC_STEP_PAST0(category_group, name, id, step)  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, \
+                                   category_group, name, id,          \
+                                   TRACE_EVENT_FLAG_NONE, "step", step)
+#define TRACE_EVENT_ASYNC_STEP_PAST1(category_group, name, id, step, \
+                                     arg1_name, arg1_val)            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
+      TRACE_EVENT_PHASE_ASYNC_STEP_PAST, category_group, name, id,   \
+      TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val)
+
+// Records a single ASYNC_END event for "name" immediately. If the category
+// is not enabled, then this does nothing.
+#define TRACE_EVENT_ASYNC_END0(category_group, name, id)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
+                                   category_group, name, id,    \
+                                   TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_ASYNC_END1(category_group, name, id, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END,               \
+                                   category_group, name, id,                  \
+                                   TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_ASYNC_END2(category_group, name, id, arg1_name, arg1_val, \
+                               arg2_name, arg2_val)                           \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                           \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_ASYNC_END0(category_group, name, id)   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
+                                   category_group, name, id,    \
+                                   TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_ASYNC_END1(category_group, name, id, arg1_name, \
+                                    arg1_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END,          \
+                                   category_group, name, id,             \
+                                   TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_ASYNC_END2(category_group, name, id, arg1_name, \
+                                    arg1_val, arg2_name, arg2_val)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                      \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,             \
+      TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val)
+
+// Similar to TRACE_EVENT_ASYNC_ENDx but with a custom |at| timestamp provided.
+#define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0(category_group, name, id, \
+                                              timestamp)                \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,            \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP1(category_group, name, id,       \
+                                              timestamp, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
+      arg1_name, arg1_val)
+#define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP2(category_group, name, id,       \
+                                              timestamp, arg1_name, arg1_val, \
+                                              arg2_name, arg2_val)            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
+      TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
+      arg1_name, arg1_val, arg2_name, arg2_val)
+
+// NESTABLE_ASYNC_* APIs are used to describe an async operation, which can
+// be nested within a NESTABLE_ASYNC event and/or have inner NESTABLE_ASYNC
+// events.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+// - A pair of NESTABLE_ASYNC_BEGIN event and NESTABLE_ASYNC_END event is
+//   considered as a match if their category_group, name and id all match.
+// - |id| must either be a pointer or an integer value up to 64 bits.
+//   If it's a pointer, the bits will be xored with a hash of the process ID so
+//   that the same pointer on two different processes will not collide.
+// - |id| is used to match a child NESTABLE_ASYNC event with its parent
+//   NESTABLE_ASYNC event. Therefore, events in the same nested event tree must
+//   be logged using the same id and category_group.
+//
+// Unmatched NESTABLE_ASYNC_END event will be parsed as an event that starts
+// at the first NESTABLE_ASYNC event of that id, and unmatched
+// NESTABLE_ASYNC_BEGIN event will be parsed as an event that ends at the last
+// NESTABLE_ASYNC event of that id. Corresponding warning messages for
+// unmatched events will be shown in the analysis view.
+
+// Records a single NESTABLE_ASYNC_BEGIN event called "name" immediately, with
+// 0, 1 or 2 associated arguments. If the category is not enabled, then this
+// does nothing.
+#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(category_group, name, id)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, \
+                                   category_group, name, id,               \
+                                   TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(category_group, name, id, arg1_name, \
+                                          arg1_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN,     \
+                                   category_group, name, id,                   \
+                                   TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(category_group, name, id, arg1_name, \
+                                          arg1_val, arg2_name, arg2_val)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,        \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+// Records a single NESTABLE_ASYNC_END event called "name" immediately, with 0
+// or 2 associated arguments. If the category is not enabled, then this does
+// nothing.
+#define TRACE_EVENT_NESTABLE_ASYNC_END0(category_group, name, id)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, \
+                                   category_group, name, id,             \
+                                   TRACE_EVENT_FLAG_NONE)
+// Records a single NESTABLE_ASYNC_END event called "name" immediately, with 1
+// associated argument. If the category is not enabled, then this does nothing.
+#define TRACE_EVENT_NESTABLE_ASYNC_END1(category_group, name, id, arg1_name, \
+                                        arg1_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END,     \
+                                   category_group, name, id,                 \
+                                   TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_NESTABLE_ASYNC_END2(category_group, name, id, arg1_name, \
+                                        arg1_val, arg2_name, arg2_val)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                          \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,        \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+
+// Records a single NESTABLE_ASYNC_INSTANT event called "name" immediately,
+// with none, one or two associated argument. If the category is not enabled,
+// then this does nothing.
+#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT0(category_group, name, id)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, \
+                                   category_group, name, id,                 \
+                                   TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(category_group, name, id,        \
+                                            arg1_name, arg1_val)             \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, \
+                                   category_group, name, id,                 \
+                                   TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+
+#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT2(                              \
+    category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val)   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                       \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, category_group, name, id, \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+
+#define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TTS2(                       \
+    category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,        \
+      TRACE_EVENT_FLAG_ASYNC_TTS | TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
+      arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TTS2(                         \
+    category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,          \
+      TRACE_EVENT_FLAG_ASYNC_TTS | TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
+      arg2_name, arg2_val)
+
+// Similar to TRACE_EVENT_NESTABLE_ASYNC_{BEGIN,END}x but with a custom
+// |timestamp| provided.
+#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, \
+                                                         id, timestamp)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,        \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(category_group, name, \
+                                                       id, timestamp)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                        \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,        \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(          \
+    category_group, name, id, timestamp)                                \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(          \
+    category_group, name, id, timestamp)                              \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                 \
+      TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \
+      TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
+
+// Records a single FLOW_BEGIN event called "name" immediately, with 0, 1 or 2
+// associated arguments. If the category is not enabled, then this
+// does nothing.
+// - category and name strings must have application lifetime (statics or
+//   literals). They may not include " chars.
+// - |id| is used to match the FLOW_BEGIN event with the FLOW_END event. FLOW
+//   events are considered to match if their category_group, name and id values
+//   all match. |id| must either be a pointer or an integer value up to 64 bits.
+//   If it's a pointer, the bits will be xored with a hash of the process ID so
+//   that the same pointer on two different processes will not collide.
+// FLOW events are different from ASYNC events in how they are drawn by the
+// tracing UI. A FLOW defines asynchronous data flow, such as posting a task
+// (FLOW_BEGIN) and later executing that task (FLOW_END). Expect FLOWs to be
+// drawn as lines or arrows from FLOW_BEGIN scopes to FLOW_END scopes. Similar
+// to ASYNC, a FLOW can consist of multiple phases. The first phase is defined
+// by the FLOW_BEGIN calls. Additional phases can be defined using the FLOW_STEP
+// macros. When the operation completes, call FLOW_END. An async operation can
+// span threads and processes, but all events in that operation must use the
+// same |name| and |id|. Each event can have its own args.
+#define TRACE_EVENT_FLOW_BEGIN0(category_group, name, id)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
+                                   category_group, name, id,     \
+                                   TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_FLOW_BEGIN1(category_group, name, id, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN,               \
+                                   category_group, name, id,                   \
+                                   TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+#define TRACE_EVENT_FLOW_BEGIN2(category_group, name, id, arg1_name, arg1_val, \
+                                arg2_name, arg2_val)                           \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
+      TRACE_EVENT_PHASE_FLOW_BEGIN, category_group, name, id,                  \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_FLOW_BEGIN0(category_group, name, id)   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
+                                   category_group, name, id,     \
+                                   TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_FLOW_BEGIN1(category_group, name, id, arg1_name, \
+                                     arg1_val)                            \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN,          \
+                                   category_group, name, id,              \
+                                   TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_FLOW_BEGIN2(category_group, name, id, arg1_name, \
+                                     arg1_val, arg2_name, arg2_val)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                       \
+      TRACE_EVENT_PHASE_FLOW_BEGIN, category_group, name, id,             \
+      TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val)
+
+// Records a single FLOW_STEP event for |step| immediately. If the category
+// is not enabled, then this does nothing. The |name| and |id| must match the
+// FLOW_BEGIN event above. The |step| param identifies this step within the
+// async event. This should be called at the beginning of the next phase of an
+// asynchronous operation.
+#define TRACE_EVENT_FLOW_STEP0(category_group, name, id, step)  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
+                                   category_group, name, id,    \
+                                   TRACE_EVENT_FLAG_NONE, "step", step)
+#define TRACE_EVENT_FLOW_STEP1(category_group, name, id, step, arg1_name, \
+                               arg1_val)                                  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                       \
+      TRACE_EVENT_PHASE_FLOW_STEP, category_group, name, id,              \
+      TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val)
+#define TRACE_EVENT_COPY_FLOW_STEP0(category_group, name, id, step) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP,     \
+                                   category_group, name, id,        \
+                                   TRACE_EVENT_FLAG_COPY, "step", step)
+#define TRACE_EVENT_COPY_FLOW_STEP1(category_group, name, id, step, arg1_name, \
+                                    arg1_val)                                  \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
+      TRACE_EVENT_PHASE_FLOW_STEP, category_group, name, id,                   \
+      TRACE_EVENT_FLAG_COPY, "step", step, arg1_name, arg1_val)
+
+// Records a single FLOW_END event for "name" immediately. If the category
+// is not enabled, then this does nothing.
+#define TRACE_EVENT_FLOW_END0(category_group, name, id)                        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0(category_group, name, id)      \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id,                                   \
+                                   TRACE_EVENT_FLAG_BIND_TO_ENCLOSING)
+#define TRACE_EVENT_FLOW_END1(category_group, name, id, arg1_name, arg1_val)   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_NONE, arg1_name, \
+                                   arg1_val)
+#define TRACE_EVENT_FLOW_END2(category_group, name, id, arg1_name, arg1_val,   \
+                              arg2_name, arg2_val)                             \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_NONE, arg1_name, \
+                                   arg1_val, arg2_name, arg2_val)
+#define TRACE_EVENT_COPY_FLOW_END0(category_group, name, id)                   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_COPY)
+#define TRACE_EVENT_COPY_FLOW_END1(category_group, name, id, arg1_name,        \
+                                   arg1_val)                                   \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_COPY, arg1_name, \
+                                   arg1_val)
+#define TRACE_EVENT_COPY_FLOW_END2(category_group, name, id, arg1_name,        \
+                                   arg1_val, arg2_name, arg2_val)              \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \
+                                   name, id, TRACE_EVENT_FLAG_COPY, arg1_name, \
+                                   arg1_val, arg2_name, arg2_val)
+
+// Special trace event macro to trace task execution with the location where it
+// was posted from.
+#define TRACE_TASK_EXECUTION(run_function, task) \
+  INTERNAL_TRACE_TASK_EXECUTION(run_function, task)
+
+// TRACE_EVENT_METADATA* events are information related to other
+// injected events, not events in their own right.
+#define TRACE_EVENT_METADATA1(category_group, name, arg1_name, arg1_val) \
+  INTERNAL_TRACE_EVENT_METADATA_ADD(category_group, name, arg1_name, arg1_val)
+
+// Records a clock sync event.
+#define TRACE_EVENT_CLOCK_SYNC_RECEIVER(sync_id)                               \
+  INTERNAL_TRACE_EVENT_ADD(                                                    \
+      TRACE_EVENT_PHASE_CLOCK_SYNC, "__metadata", "clock_sync",                \
+      TRACE_EVENT_FLAG_NONE, "sync_id", sync_id)
+#define TRACE_EVENT_CLOCK_SYNC_ISSUER(sync_id, issue_ts, issue_end_ts)         \
+  INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                     \
+      TRACE_EVENT_PHASE_CLOCK_SYNC, "__metadata", "clock_sync",                \
+      issue_end_ts, TRACE_EVENT_FLAG_NONE,                                     \
+      "sync_id", sync_id, "issue_ts", issue_ts)
+
+// Macros to track the life time and value of arbitrary client objects.
+// See also TraceTrackableObject.
+#define TRACE_EVENT_OBJECT_CREATED_WITH_ID(category_group, name, id) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
+      TRACE_EVENT_PHASE_CREATE_OBJECT, category_group, name, id,     \
+      TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(category_group, name, id, \
+                                            snapshot)                 \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                   \
+      TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name,        \
+      id, TRACE_EVENT_FLAG_NONE, "snapshot", snapshot)
+
+#define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID_AND_TIMESTAMP(                     \
+    category_group, name, id, timestamp, snapshot)                             \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name,                 \
+      id, TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
+      "snapshot", snapshot)
+
+#define TRACE_EVENT_OBJECT_DELETED_WITH_ID(category_group, name, id) \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
+      TRACE_EVENT_PHASE_DELETE_OBJECT, category_group, name, id,     \
+      TRACE_EVENT_FLAG_NONE)
+
+// Records entering and leaving trace event contexts. |category_group| and
+// |name| specify the context category and type. |context| is a
+// snapshotted context object id.
+#define TRACE_EVENT_ENTER_CONTEXT(category_group, name, context)      \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                   \
+      TRACE_EVENT_PHASE_ENTER_CONTEXT, category_group, name, context, \
+      TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_LEAVE_CONTEXT(category_group, name, context)      \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                   \
+      TRACE_EVENT_PHASE_LEAVE_CONTEXT, category_group, name, context, \
+      TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_SCOPED_CONTEXT(category_group, name, context) \
+  INTERNAL_TRACE_EVENT_SCOPED_CONTEXT(category_group, name, context)
+
+// Macro to specify that two trace IDs are identical. For example,
+// TRACE_LINK_IDS(
+//     "category", "name",
+//     TRACE_ID_WITH_SCOPE("net::URLRequest", 0x1000),
+//     TRACE_ID_WITH_SCOPE("blink::ResourceFetcher::FetchRequest", 0x2000))
+// tells the trace consumer that events with ID ("net::URLRequest", 0x1000) from
+// the current process have the same ID as events with ID
+// ("blink::ResourceFetcher::FetchRequest", 0x2000).
+#define TRACE_LINK_IDS(category_group, name, id, linked_id) \
+  INTERNAL_TRACE_EVENT_ADD_LINK_IDS(category_group, name, id, linked_id);
+
+// Macro to efficiently determine if a given category group is enabled.
+#define TRACE_EVENT_CATEGORY_GROUP_ENABLED(category_group, ret)             \
+  do {                                                                      \
+    INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group);                 \
+    if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
+      *ret = true;                                                          \
+    } else {                                                                \
+      *ret = false;                                                         \
+    }                                                                       \
+  } while (0)
+
+// Macro to explicitly warm up a given category group. This could be useful in
+// cases where we want to initialize a category group before any trace events
+// for that category group is reported. For example, to have a category group
+// always show up in the "record categories" list for manually selecting
+// settings in about://tracing.
+#define TRACE_EVENT_WARMUP_CATEGORY(category_group) \
+  INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group)
+
+// Macro to efficiently determine, through polling, if a new trace has begun.
+#define TRACE_EVENT_IS_NEW_TRACE(ret)                                      \
+  do {                                                                     \
+    static int INTERNAL_TRACE_EVENT_UID(lastRecordingNumber) = 0;          \
+    int num_traces_recorded = TRACE_EVENT_API_GET_NUM_TRACES_RECORDED();   \
+    if (num_traces_recorded != -1 &&                                       \
+        num_traces_recorded !=                                             \
+            INTERNAL_TRACE_EVENT_UID(lastRecordingNumber)) {               \
+      INTERNAL_TRACE_EVENT_UID(lastRecordingNumber) = num_traces_recorded; \
+      *ret = true;                                                         \
+    } else {                                                               \
+      *ret = false;                                                        \
+    }                                                                      \
+  } while (0)
+
+// Notes regarding the following definitions:
+// New values can be added and propagated to third party libraries, but existing
+// definitions must never be changed, because third party libraries may use old
+// definitions.
+
+// Phase indicates the nature of an event entry. E.g. part of a begin/end pair.
+#define TRACE_EVENT_PHASE_BEGIN ('B')
+#define TRACE_EVENT_PHASE_END ('E')
+#define TRACE_EVENT_PHASE_COMPLETE ('X')
+#define TRACE_EVENT_PHASE_INSTANT ('I')
+#define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S')
+#define TRACE_EVENT_PHASE_ASYNC_STEP_INTO ('T')
+#define TRACE_EVENT_PHASE_ASYNC_STEP_PAST ('p')
+#define TRACE_EVENT_PHASE_ASYNC_END ('F')
+#define TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN ('b')
+#define TRACE_EVENT_PHASE_NESTABLE_ASYNC_END ('e')
+#define TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT ('n')
+#define TRACE_EVENT_PHASE_FLOW_BEGIN ('s')
+#define TRACE_EVENT_PHASE_FLOW_STEP ('t')
+#define TRACE_EVENT_PHASE_FLOW_END ('f')
+#define TRACE_EVENT_PHASE_METADATA ('M')
+#define TRACE_EVENT_PHASE_COUNTER ('C')
+#define TRACE_EVENT_PHASE_SAMPLE ('P')
+#define TRACE_EVENT_PHASE_CREATE_OBJECT ('N')
+#define TRACE_EVENT_PHASE_SNAPSHOT_OBJECT ('O')
+#define TRACE_EVENT_PHASE_DELETE_OBJECT ('D')
+#define TRACE_EVENT_PHASE_MEMORY_DUMP ('v')
+#define TRACE_EVENT_PHASE_MARK ('R')
+#define TRACE_EVENT_PHASE_CLOCK_SYNC ('c')
+#define TRACE_EVENT_PHASE_ENTER_CONTEXT ('(')
+#define TRACE_EVENT_PHASE_LEAVE_CONTEXT (')')
+#define TRACE_EVENT_PHASE_LINK_IDS ('=')
+
+// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
+#define TRACE_EVENT_FLAG_NONE (static_cast<unsigned int>(0))
+#define TRACE_EVENT_FLAG_COPY (static_cast<unsigned int>(1 << 0))
+#define TRACE_EVENT_FLAG_HAS_ID (static_cast<unsigned int>(1 << 1))
+// TODO(crbug.com/639003): Free this bit after ID mangling is deprecated.
+#define TRACE_EVENT_FLAG_MANGLE_ID (static_cast<unsigned int>(1 << 2))
+#define TRACE_EVENT_FLAG_SCOPE_OFFSET (static_cast<unsigned int>(1 << 3))
+#define TRACE_EVENT_FLAG_SCOPE_EXTRA (static_cast<unsigned int>(1 << 4))
+#define TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP (static_cast<unsigned int>(1 << 5))
+#define TRACE_EVENT_FLAG_ASYNC_TTS (static_cast<unsigned int>(1 << 6))
+#define TRACE_EVENT_FLAG_BIND_TO_ENCLOSING (static_cast<unsigned int>(1 << 7))
+#define TRACE_EVENT_FLAG_FLOW_IN (static_cast<unsigned int>(1 << 8))
+#define TRACE_EVENT_FLAG_FLOW_OUT (static_cast<unsigned int>(1 << 9))
+#define TRACE_EVENT_FLAG_HAS_CONTEXT_ID (static_cast<unsigned int>(1 << 10))
+#define TRACE_EVENT_FLAG_HAS_PROCESS_ID (static_cast<unsigned int>(1 << 11))
+#define TRACE_EVENT_FLAG_HAS_LOCAL_ID (static_cast<unsigned int>(1 << 12))
+#define TRACE_EVENT_FLAG_HAS_GLOBAL_ID (static_cast<unsigned int>(1 << 13))
+
+#define TRACE_EVENT_FLAG_SCOPE_MASK                          \
+  (static_cast<unsigned int>(TRACE_EVENT_FLAG_SCOPE_OFFSET | \
+                             TRACE_EVENT_FLAG_SCOPE_EXTRA))
+
+// Type values for identifying types in the TraceValue union.
+#define TRACE_VALUE_TYPE_BOOL (static_cast<unsigned char>(1))
+#define TRACE_VALUE_TYPE_UINT (static_cast<unsigned char>(2))
+#define TRACE_VALUE_TYPE_INT (static_cast<unsigned char>(3))
+#define TRACE_VALUE_TYPE_DOUBLE (static_cast<unsigned char>(4))
+#define TRACE_VALUE_TYPE_POINTER (static_cast<unsigned char>(5))
+#define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6))
+#define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7))
+#define TRACE_VALUE_TYPE_CONVERTABLE (static_cast<unsigned char>(8))
+
+// Enum reflecting the scope of an INSTANT event. Must fit within
+// TRACE_EVENT_FLAG_SCOPE_MASK.
+#define TRACE_EVENT_SCOPE_GLOBAL (static_cast<unsigned char>(0 << 3))
+#define TRACE_EVENT_SCOPE_PROCESS (static_cast<unsigned char>(1 << 3))
+#define TRACE_EVENT_SCOPE_THREAD (static_cast<unsigned char>(2 << 3))
+
+#define TRACE_EVENT_SCOPE_NAME_GLOBAL ('g')
+#define TRACE_EVENT_SCOPE_NAME_PROCESS ('p')
+#define TRACE_EVENT_SCOPE_NAME_THREAD ('t')
\ No newline at end of file
diff --git a/src/v8/src/v8.gyp b/src/v8/src/v8.gyp
index ef55e7c..6f9b36f 100644
--- a/src/v8/src/v8.gyp
+++ b/src/v8/src/v8.gyp
@@ -36,7 +36,21 @@
     'v8_experimental_extra_library_files%': [],
     'mksnapshot_exec': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)mksnapshot<(EXECUTABLE_SUFFIX)',
     'v8_os_page_size%': 0,
+
+    'v8_use_snapshot': 0,
+    'v8_optimized_debug': 0,
+    'v8_use_external_startup_data': 0,
+    # TODO: Enable i18n support.
+    'v8_enable_i18n_support': 0,
   },
+  # TODO: Remove after starboardization.
+  'target_defaults': {
+    'defines': [
+      'V8_OS_POSIX=1',
+      'V8_OS_LINUX=1',
+      'V8_TRAP_HANDLER_SUPPORTED=1',
+    ],
+   },
   'includes': ['../gypfiles/toolchain.gypi', '../gypfiles/features.gypi', 'inspector/inspector.gypi'],
   'targets': [
     {
@@ -1708,7 +1722,8 @@
             'third_party/valgrind/valgrind.h',
           ],
         }],
-        ['v8_target_arch=="x64" and OS=="linux"', {
+        # TODO: Remove after starboardization.
+        ['v8_target_arch=="x64" and (OS=="linux" or OS=="starboard")', {
             'sources': ['trap-handler/handler-inside.cc']
         }],
         ['v8_target_arch=="ppc" or v8_target_arch=="ppc64"', {
@@ -1935,7 +1950,8 @@
             ],
           },
         }],
-        ['OS=="linux"', {
+        # TODO: Remove after starboardization.
+        ['OS=="linux" or OS=="starboard"', {
             'link_settings': {
               'libraries': [
                 '-ldl',
diff --git a/src/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template b/src/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template
index 81dd7f2..f6264b8 100644
--- a/src/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template
+++ b/src/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template
@@ -113,7 +113,8 @@
     {% set count = 0 %}
     {% for property in type.properties %}
       {% if not(property.optional) %}
-        {% set count = count + 1 %}
+        {# "count = count + 1" does not work with our version of jinja, use the loop index instead. #}
+        {% set count = loop.index + 1 %}
           {{property.name | to_title_case}}Set = 1 << {{count}},
       {% endif %}
     {% endfor %}
