SubtitleController.java revision 87399fc21b642688a690be5869f14a7ba020afdb
103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar/* 203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Copyright (C) 2013 The Android Open Source Project 303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * you may not use this file except in compliance with the License. 603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * You may obtain a copy of the License at 703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 1003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Unless required by applicable law or agreed to in writing, software 1103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * See the License for the specific language governing permissions and 1403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * limitations under the License. 1503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 1603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 1703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarpackage android.media; 1803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 1903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport java.util.Locale; 2003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport java.util.Vector; 2103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 2203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.content.Context; 2303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.media.MediaPlayer.OnSubtitleDataListener; 2403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.view.View; 2503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarimport android.view.accessibility.CaptioningManager; 2603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 2703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar/** 2803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * The subtitle controller provides the architecture to display subtitles for a 2903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * media source. It allows specifying which tracks to display, on which anchor 3003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * to display them, and also allows adding external, out-of-band subtitle tracks. 3103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 3203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @hide 3303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 3403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnarpublic class SubtitleController { 3503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private Context mContext; 3603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private MediaTimeProvider mTimeProvider; 3703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private Vector<Renderer> mRenderers; 3803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private Vector<SubtitleTrack> mTracks; 3903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private SubtitleTrack mSelectedTrack; 4003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private boolean mShowing; 4187399fc21b642688a690be5869f14a7ba020afdbLajos Molnar private CaptioningManager mCaptioningManager; 4203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 4303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 4403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Creates a subtitle controller for a media playback object that implements 4503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * the MediaTimeProvider interface. 4603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 4703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param timeProvider 4803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 4903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public SubtitleController( 5003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar Context context, 5103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar MediaTimeProvider timeProvider, 5203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar Listener listener) { 5303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mContext = context; 5403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTimeProvider = timeProvider; 5503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mListener = listener; 5603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 5703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mRenderers = new Vector<Renderer>(); 5803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mShowing = false; 5903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTracks = new Vector<SubtitleTrack>(); 6087399fc21b642688a690be5869f14a7ba020afdbLajos Molnar mCaptioningManager = 6187399fc21b642688a690be5869f14a7ba020afdbLajos Molnar (CaptioningManager)context.getSystemService(Context.CAPTIONING_SERVICE); 6203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 6303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 6403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 6503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return the available subtitle tracks for this media. These include 6603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * the tracks found by {@link MediaPlayer} as well as any tracks added 6703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * manually via {@link #addTrack}. 6803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 6903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public SubtitleTrack[] getTracks() { 7003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar SubtitleTrack[] tracks = new SubtitleTrack[mTracks.size()]; 7103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTracks.toArray(tracks); 7203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return tracks; 7303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 7403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 7503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 7603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return the currently selected subtitle track 7703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 7803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public SubtitleTrack getSelectedTrack() { 7903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return mSelectedTrack; 8003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 8103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 8203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private View getSubtitleView() { 8303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mSelectedTrack == null) { 8403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return null; 8503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 8603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return mSelectedTrack.getView(); 8703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 8803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 8903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 9003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Selects a subtitle track. As a result, this track will receive 9103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * in-band data from the {@link MediaPlayer}. However, this does 9203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * not change the subtitle visibility. 9303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 9403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param track The subtitle track to select. This must be one of the 9503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * tracks in {@link #getTracks}. 9603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return true if the track was successfully selected. 9703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 9803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public boolean selectTrack(SubtitleTrack track) { 9903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (track != null && !mTracks.contains(track)) { 10003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return false; 10103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 10203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTrackIsExplicit = true; 10303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mSelectedTrack == track) { 10403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return true; 10503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 10603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 10703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mSelectedTrack != null) { 10803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack.hide(); 10903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack.setTimeProvider(null); 11003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 11103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 11203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack = track; 11303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mAnchor.setSubtitleView(getSubtitleView()); 11403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 11503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mSelectedTrack != null) { 11603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack.setTimeProvider(mTimeProvider); 11703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack.show(); 11803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 11903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 12003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mListener != null) { 12103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mListener.onSubtitleTrackSelected(track); 12203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 12303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return true; 12403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 12503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 12603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 12703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return the default subtitle track based on system preferences, or null, 12803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * if no such track exists in this manager. 12903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 13003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public SubtitleTrack getDefaultTrack() { 13187399fc21b642688a690be5869f14a7ba020afdbLajos Molnar Locale locale = mCaptioningManager.getLocale(); 13203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 13303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar for (SubtitleTrack track: mTracks) { 13403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar MediaFormat format = track.getFormat(); 13503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar String language = format.getString(MediaFormat.KEY_LANGUAGE); 13603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar // TODO: select track with best renderer. For now, we select first 13703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar // track with local's language or first track if locale has none 13803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (locale == null || 13903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar locale.getLanguage().equals("") || 14003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar locale.getISO3Language().equals(language) || 14103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar locale.getLanguage().equals(language)) { 14203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return track; 14303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 14403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 14503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return null; 14603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 14703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 14803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private boolean mTrackIsExplicit = false; 14903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private boolean mVisibilityIsExplicit = false; 15003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 15103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** @hide */ 15203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void selectDefaultTrack() { 15303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mTrackIsExplicit) { 15403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return; 15503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 15603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 15703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar SubtitleTrack track = getDefaultTrack(); 15803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (track != null) { 15903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar selectTrack(track); 16003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTrackIsExplicit = false; 16103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (!mVisibilityIsExplicit) { 16287399fc21b642688a690be5869f14a7ba020afdbLajos Molnar if (mCaptioningManager.isEnabled()) { 16303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar show(); 16403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } else { 16503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar hide(); 16603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 16703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mVisibilityIsExplicit = false; 16803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 16903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 17003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 17103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 17203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** @hide */ 17303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void reset() { 17403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar hide(); 17503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar selectTrack(null); 17603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTracks.clear(); 17703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTrackIsExplicit = false; 17803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mVisibilityIsExplicit = false; 17903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 18003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 18103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 18203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Adds a new, external subtitle track to the manager. 18303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 18403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param format the format of the track that will include at least 18503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * the MIME type {@link MediaFormat@KEY_MIME}. 18603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return the created {@link SubtitleTrack} object 18703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 18803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public SubtitleTrack addTrack(MediaFormat format) { 18903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar for (Renderer renderer: mRenderers) { 19003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (renderer.supports(format)) { 19103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar SubtitleTrack track = renderer.createTrack(format); 19203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (track != null) { 19303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mTracks.add(track); 19403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return track; 19503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 19603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 19703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 19803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return null; 19903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 20003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 20103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 20203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Show the selected (or default) subtitle track. 20303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 20403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void show() { 20503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mShowing = true; 20603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mVisibilityIsExplicit = true; 20703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mSelectedTrack != null) { 20803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack.show(); 20903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 21003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 21103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 21203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 21303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Hide the selected (or default) subtitle track. 21403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 21503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void hide() { 21603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mVisibilityIsExplicit = true; 21703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mSelectedTrack != null) { 21803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mSelectedTrack.hide(); 21903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 22003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mShowing = false; 22103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 22203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 22303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 22403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Interface for supporting a single or multiple subtitle types in {@link 22503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * MediaPlayer}. 22603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 22703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public abstract static class Renderer { 22803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 22903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Called by {@link MediaPlayer}'s {@link SubtitleController} when a new 23003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * subtitle track is detected, to see if it should use this object to 23103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * parse and display this subtitle track. 23203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 23303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param format the format of the track that will include at least 23403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * the MIME type {@link MediaFormat@KEY_MIME}. 23503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 23603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return true if and only if the track format is supported by this 23703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * renderer 23803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 23903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public abstract boolean supports(MediaFormat format); 24003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 24103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 24203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Called by {@link MediaPlayer}'s {@link SubtitleController} for each 24303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * subtitle track that was detected and is supported by this object to 24403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * create a {@link SubtitleTrack} object. This object will be created 24503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * for each track that was found. If the track is selected for display, 24603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * this object will be used to parse and display the track data. 24703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 24803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param format the format of the track that will include at least 24903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * the MIME type {@link MediaFormat@KEY_MIME}. 25003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @return a {@link SubtitleTrack} object that will be used to parse 25103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * and render the subtitle track. 25203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 25303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public abstract SubtitleTrack createTrack(MediaFormat format); 25403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 25503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 25603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 25703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Add support for a subtitle format in {@link MediaPlayer}. 25803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 25903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param renderer a {@link SubtitleController.Renderer} object that adds 26003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * support for a subtitle format. 26103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 26203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void registerRenderer(Renderer renderer) { 26303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar // TODO how to get available renderers in the system 26403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (!mRenderers.contains(renderer)) { 26503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar // TODO should added renderers override existing ones (to allow replacing?) 26603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mRenderers.add(renderer); 26703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 26803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 26903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 27003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 27103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Subtitle anchor, an object that is able to display a subtitle view, 27203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * e.g. a VideoView. 27303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 27403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public interface Anchor { 27503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 27603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Anchor should set the subtitle view to the supplied view, 27703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * or none, if the supplied view is null. 27803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 27903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param view subtitle view, or null 28003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 28103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void setSubtitleView(View view); 28203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 28303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 28403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private Anchor mAnchor; 28503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 28603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** @hide */ 28703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void setAnchor(Anchor anchor) { 28803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mAnchor == anchor) { 28903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar return; 29003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 29103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 29203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mAnchor != null) { 29303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mAnchor.setSubtitleView(null); 29403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 29503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mAnchor = anchor; 29603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar if (mAnchor != null) { 29703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar mAnchor.setSubtitleView(getSubtitleView()); 29803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 29903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 30003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 30103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public interface Listener { 30203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar /** 30303c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * Called when a subtitle track has been selected. 30403c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * 30503c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @param track selected subtitle track or null 30603c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar * @hide 30703c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar */ 30803c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar public void onSubtitleTrackSelected(SubtitleTrack track); 30903c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar } 31003c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar 31103c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar private Listener mListener; 31203c25794b66b0d01e0e850042713f8009c787dc2Lajos Molnar} 313