diff --git a/RELEASENOTES.md b/RELEASENOTES.md index eff30b74d2..6bb1b08cd7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,6 +24,11 @@ * Extractors: * Fix inconsistency with spec in H.265 SPS nal units parsing ((#9719)[https://github.com/google/ExoPlayer/issues/9719]). +* Text: + * Add a `MediaItem.SubtitleConfiguration#id` field which is propagated to + the `Format#id` field of the subtitle track created from the + configuration + ((#9673)[https://github.com/google/ExoPlayer/issues/9673]). * DRM: * Remove `playbackLooper` from `DrmSessionManager.(pre)acquireSession`. When a `DrmSessionManager` is used by an app in a custom `MediaSource`, diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index b18c52018e..883b68f603 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -1238,6 +1238,7 @@ public final class MediaItem implements Bundleable { private @C.SelectionFlags int selectionFlags; private @C.RoleFlags int roleFlags; @Nullable private String label; + @Nullable private String id; /** * Constructs an instance. @@ -1255,6 +1256,7 @@ public final class MediaItem implements Bundleable { this.selectionFlags = subtitleConfiguration.selectionFlags; this.roleFlags = subtitleConfiguration.roleFlags; this.label = subtitleConfiguration.label; + this.id = subtitleConfiguration.id; } /** Sets the {@link Uri} to the subtitle file. */ @@ -1293,6 +1295,12 @@ public final class MediaItem implements Bundleable { return this; } + /** Sets the optional ID for this subtitle track. */ + public Builder setId(@Nullable String id) { + this.id = id; + return this; + } + /** Creates a {@link SubtitleConfiguration} from the values of this builder. */ public SubtitleConfiguration build() { return new SubtitleConfiguration(this); @@ -1315,20 +1323,27 @@ public final class MediaItem implements Bundleable { public final @C.RoleFlags int roleFlags; /** The label. */ @Nullable public final String label; + /** + * The ID of the subtitles. This will be propagated to the {@link Format#id} of the subtitle + * track created from this configuration. + */ + @Nullable public final String id; private SubtitleConfiguration( Uri uri, String mimeType, @Nullable String language, - @C.SelectionFlags int selectionFlags, - @C.RoleFlags int roleFlags, - @Nullable String label) { + int selectionFlags, + int roleFlags, + @Nullable String label, + @Nullable String id) { this.uri = uri; this.mimeType = mimeType; this.language = language; this.selectionFlags = selectionFlags; this.roleFlags = roleFlags; this.label = label; + this.id = id; } private SubtitleConfiguration(Builder builder) { @@ -1338,6 +1353,7 @@ public final class MediaItem implements Bundleable { this.selectionFlags = builder.selectionFlags; this.roleFlags = builder.roleFlags; this.label = builder.label; + this.id = builder.id; } /** Returns a {@link Builder} initialized with the values of this instance. */ @@ -1361,7 +1377,8 @@ public final class MediaItem implements Bundleable { && Util.areEqual(language, other.language) && selectionFlags == other.selectionFlags && roleFlags == other.roleFlags - && Util.areEqual(label, other.label); + && Util.areEqual(label, other.label) + && Util.areEqual(id, other.id); } @Override @@ -1372,6 +1389,7 @@ public final class MediaItem implements Bundleable { result = 31 * result + selectionFlags; result = 31 * result + roleFlags; result = 31 * result + (label == null ? 0 : label.hashCode()); + result = 31 * result + (id == null ? 0 : id.hashCode()); return result; } } @@ -1402,7 +1420,7 @@ public final class MediaItem implements Bundleable { @C.SelectionFlags int selectionFlags, @C.RoleFlags int roleFlags, @Nullable String label) { - super(uri, mimeType, language, selectionFlags, roleFlags, label); + super(uri, mimeType, language, selectionFlags, roleFlags, label, /* id= */ null); } private Subtitle(Builder builder) { diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 340f346a3e..457162d744 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -278,6 +278,7 @@ public class MediaItemTest { .setSelectionFlags(C.SELECTION_FLAG_FORCED) .setRoleFlags(C.ROLE_FLAG_ALTERNATE) .setLabel("label") + .setId("id") .build()); MediaItem mediaItem = @@ -619,6 +620,7 @@ public class MediaItemTest { .setSelectionFlags(C.SELECTION_FLAG_FORCED) .setRoleFlags(C.ROLE_FLAG_ALTERNATE) .setLabel("label") + .setId("id") .build())) .setTag(new Object()) .build(); @@ -675,6 +677,7 @@ public class MediaItemTest { .setSelectionFlags(C.SELECTION_FLAG_FORCED) .setRoleFlags(C.ROLE_FLAG_ALTERNATE) .setLabel("label") + .setId("id") .build())) .setTag(new Object()) .build(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 548a252aba..a34f1023a0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -404,6 +404,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { .setSelectionFlags(subtitleConfigurations.get(i).selectionFlags) .setRoleFlags(subtitleConfigurations.get(i).roleFlags) .setLabel(subtitleConfigurations.get(i).label) + .setId(subtitleConfigurations.get(i).id) .build(); ExtractorsFactory extractorsFactory = () -> diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index e5cb2bb976..af72496e5e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -170,6 +170,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource { .setSelectionFlags(subtitleConfiguration.selectionFlags) .setRoleFlags(subtitleConfiguration.roleFlags) .setLabel(subtitleConfiguration.label) + .setId(subtitleConfiguration.id) .build(); dataSpec = new DataSpec.Builder()