diff --git a/core_settings.gradle b/core_settings.gradle
index 06a4327aa7..8224ac9588 100644
--- a/core_settings.gradle
+++ b/core_settings.gradle
@@ -42,6 +42,8 @@ project(modulePrefix + 'library-transformer').projectDir = new File(rootDir, 'li
include modulePrefix + 'library-ui'
project(modulePrefix + 'library-ui').projectDir = new File(rootDir, 'library/ui')
+include modulePrefix + 'library-decoder'
+project(modulePrefix + 'library-decoder').projectDir = new File(rootDir, 'library/decoder')
include modulePrefix + 'extension-av1'
project(modulePrefix + 'extension-av1').projectDir = new File(rootDir, 'extensions/av1')
include modulePrefix + 'extension-ffmpeg'
diff --git a/extensions/av1/build.gradle b/extensions/av1/build.gradle
index d7c6243c3b..9378f08d3f 100644
--- a/extensions/av1/build.gradle
+++ b/extensions/av1/build.gradle
@@ -44,6 +44,8 @@ if (project.file('src/main/jni/libgav1').exists()) {
}
dependencies {
+ implementation project(modulePrefix + 'library-decoder')
+ // TODO(b/203752526): Remove this dependency.
implementation project(modulePrefix + 'library-core')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion
diff --git a/extensions/ffmpeg/build.gradle b/extensions/ffmpeg/build.gradle
index a9edeaff6b..3bdf0a7600 100644
--- a/extensions/ffmpeg/build.gradle
+++ b/extensions/ffmpeg/build.gradle
@@ -21,6 +21,8 @@ if (project.file('src/main/jni/ffmpeg').exists()) {
}
dependencies {
+ implementation project(modulePrefix + 'library-decoder')
+ // TODO(b/203752526): Remove this dependency.
implementation project(modulePrefix + 'library-core')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
diff --git a/extensions/flac/build.gradle b/extensions/flac/build.gradle
index 9aeeb83eb3..4f20bd24ee 100644
--- a/extensions/flac/build.gradle
+++ b/extensions/flac/build.gradle
@@ -24,6 +24,8 @@ android {
}
dependencies {
+ implementation project(modulePrefix + 'library-decoder')
+ // TODO(b/203752526): Remove this dependency.
implementation project(modulePrefix + 'library-core')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
diff --git a/extensions/opus/build.gradle b/extensions/opus/build.gradle
index ba670037f6..7939292938 100644
--- a/extensions/opus/build.gradle
+++ b/extensions/opus/build.gradle
@@ -24,6 +24,8 @@ android {
}
dependencies {
+ implementation project(modulePrefix + 'library-decoder')
+ // TODO(b/203752526): Remove this dependency.
implementation project(modulePrefix + 'library-core')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion
diff --git a/extensions/vp9/build.gradle b/extensions/vp9/build.gradle
index 79d85a6ac5..4d5629837c 100644
--- a/extensions/vp9/build.gradle
+++ b/extensions/vp9/build.gradle
@@ -24,6 +24,8 @@ android {
}
dependencies {
+ implementation project(modulePrefix + 'library-decoder')
+ // TODO(b/203752526): Remove this dependency.
implementation project(modulePrefix + 'library-core')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion
diff --git a/library/all/build.gradle b/library/all/build.gradle
index 4ec8373e2f..965cdc11c4 100644
--- a/library/all/build.gradle
+++ b/library/all/build.gradle
@@ -14,6 +14,9 @@
apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle"
dependencies {
+ api project(modulePrefix + 'library-common')
+ api project(modulePrefix + 'library-decoder')
+ api project(modulePrefix + 'library-extractor')
api project(modulePrefix + 'library-core')
api project(modulePrefix + 'library-dash')
api project(modulePrefix + 'library-hls')
diff --git a/library/core/build.gradle b/library/core/build.gradle
index 4aa74cc439..7d848f9ab5 100644
--- a/library/core/build.gradle
+++ b/library/core/build.gradle
@@ -36,6 +36,8 @@ android {
dependencies {
api project(modulePrefix + 'library-common')
+ // TODO(b/203754886): Revisit which modules are exported as API dependencies.
+ api project(modulePrefix + 'library-decoder')
api project(modulePrefix + 'library-extractor')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
implementation 'androidx.core:core:' + androidxCoreVersion
diff --git a/library/decoder/README.md b/library/decoder/README.md
new file mode 100644
index 0000000000..7524b959d4
--- /dev/null
+++ b/library/decoder/README.md
@@ -0,0 +1,11 @@
+# Decoder module
+
+Provides a decoder abstraction. Application code will not normally need to
+depend on this module directly.
+
+## Links
+
+* [Javadoc][]: Classes matching `com.google.android.exoplayer2.decoder.*` belong to this
+ module.
+
+[Javadoc]: https://exoplayer.dev/doc/reference/index.html
diff --git a/library/decoder/build.gradle b/library/decoder/build.gradle
new file mode 100644
index 0000000000..48d8054c22
--- /dev/null
+++ b/library/decoder/build.gradle
@@ -0,0 +1,47 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle"
+
+android {
+ defaultConfig {
+ multiDexEnabled true
+ }
+
+ buildTypes {
+ debug {
+ testCoverageEnabled = true
+ }
+ }
+}
+
+dependencies {
+ implementation project(modulePrefix + 'library-common')
+ implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
+ compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
+ testImplementation 'androidx.test:core:' + androidxTestCoreVersion
+ testImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion
+ testImplementation 'com.google.truth:truth:' + truthVersion
+ testImplementation 'org.robolectric:robolectric:' + robolectricVersion
+}
+
+ext {
+ javadocTitle = 'Decoder module'
+}
+apply from: '../../javadoc_library.gradle'
+
+ext {
+ releaseArtifactId = 'exoplayer-decoder'
+ releaseDescription = 'The ExoPlayer library decoder module.'
+}
+apply from: '../../publish.gradle'
diff --git a/library/decoder/src/main/AndroidManifest.xml b/library/decoder/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..66cfd433a3
--- /dev/null
+++ b/library/decoder/src/main/AndroidManifest.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/package-info.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/package-info.java
similarity index 100%
rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/package-info.java
rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/package-info.java
diff --git a/library/decoder/src/test/AndroidManifest.xml b/library/decoder/src/test/AndroidManifest.xml
new file mode 100644
index 0000000000..66cfd433a3
--- /dev/null
+++ b/library/decoder/src/test/AndroidManifest.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/library/common/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java b/library/decoder/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java
similarity index 100%
rename from library/common/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java
rename to library/decoder/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java
diff --git a/library/common/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java b/library/decoder/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java
similarity index 100%
rename from library/common/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java
rename to library/decoder/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java
diff --git a/library/extractor/build.gradle b/library/extractor/build.gradle
index a82da78c2d..839d13c38a 100644
--- a/library/extractor/build.gradle
+++ b/library/extractor/build.gradle
@@ -26,6 +26,8 @@ android {
dependencies {
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
implementation project(modulePrefix + 'library-common')
+ // TODO(b/203752187): Remove this dependency.
+ implementation project(modulePrefix + 'library-decoder')
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion