1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.usbtuner.exoplayer; 18 19 import com.google.android.exoplayer.MediaFormat; 20 import com.google.android.exoplayer.MediaFormatHolder; 21 import com.google.android.exoplayer.MediaFormatUtil; 22 import com.google.android.exoplayer.SampleHolder; 23 import com.android.usbtuner.exoplayer.cache.CacheManager; 24 import com.android.usbtuner.exoplayer.cache.RecordingSampleBuffer; 25 import com.android.usbtuner.tvinput.PlaybackCacheListener; 26 27 import android.util.Pair; 28 29 import java.io.IOException; 30 import java.util.ArrayList; 31 import java.util.List; 32 33 /** 34 * A class that plays a recorded stream without using {@link MediaExtractor}, 35 * since all samples are extracted and stored to the permanent storage already. 36 */ 37 public class ReplaySampleSourceExtractor implements SampleExtractor{ 38 private static final String TAG = "ReplaySampleSourceExt"; 39 private static final boolean DEBUG = false; 40 41 private int mTrackCount; 42 private android.media.MediaFormat[] mMediaFormats; 43 private MediaFormat[] mTrackFormats; 44 45 private boolean mReleased; 46 47 48 private final CacheManager mCacheManager; 49 private final PlaybackCacheListener mCacheListener; 50 private CacheManager.SampleBuffer mSampleBuffer; 51 ReplaySampleSourceExtractor( CacheManager cacheManager, PlaybackCacheListener cacheListener)52 public ReplaySampleSourceExtractor( 53 CacheManager cacheManager, PlaybackCacheListener cacheListener) { 54 mCacheManager = cacheManager; 55 mCacheListener = cacheListener; 56 mTrackCount = -1; 57 } 58 59 @Override prepare()60 public boolean prepare() throws IOException { 61 ArrayList<Pair<String, android.media.MediaFormat>> trackInfos = 62 mCacheManager.readTrackInfoFiles(); 63 if (trackInfos == null || trackInfos.size() <= 0) { 64 return false; 65 } 66 mTrackCount = trackInfos.size(); 67 List<String> ids = new ArrayList<>(); 68 mMediaFormats = new android.media.MediaFormat[mTrackCount]; 69 mTrackFormats = new MediaFormat[mTrackCount]; 70 for (int i = 0; i < mTrackCount; ++i) { 71 Pair<String, android.media.MediaFormat> pair = trackInfos.get(i); 72 ids.add(pair.first); 73 mMediaFormats[i] = pair.second; 74 mTrackFormats[i] = MediaFormatUtil.createMediaFormat(mMediaFormats[i]); 75 } 76 mSampleBuffer = new RecordingSampleBuffer(mCacheManager, mCacheListener, true, 77 RecordingSampleBuffer.CACHE_REASON_RECORDED_PLAYBACK); 78 mSampleBuffer.init(ids, null); 79 return true; 80 } 81 82 @Override getTrackFormats()83 public MediaFormat[] getTrackFormats() { 84 return mTrackFormats; 85 } 86 87 @Override getTrackMediaFormat(int track, MediaFormatHolder outMediaFormatHolder)88 public void getTrackMediaFormat(int track, MediaFormatHolder outMediaFormatHolder) { 89 outMediaFormatHolder.format = mTrackFormats[track]; 90 outMediaFormatHolder.drmInitData = null; 91 } 92 93 @Override release()94 public void release() { 95 if (!mReleased) { 96 mSampleBuffer.release(); 97 } 98 mReleased = true; 99 } 100 101 @Override selectTrack(int index)102 public void selectTrack(int index) { 103 mSampleBuffer.selectTrack(index); 104 } 105 106 @Override deselectTrack(int index)107 public void deselectTrack(int index) { 108 mSampleBuffer.deselectTrack(index); 109 } 110 111 @Override getBufferedPositionUs()112 public long getBufferedPositionUs() { 113 return mSampleBuffer.getBufferedPositionUs(); 114 } 115 116 @Override seekTo(long positionUs)117 public void seekTo(long positionUs) { 118 mSampleBuffer.seekTo(positionUs); 119 } 120 121 @Override readSample(int track, SampleHolder sampleHolder)122 public int readSample(int track, SampleHolder sampleHolder) { 123 return mSampleBuffer.readSample(track, sampleHolder); 124 } 125 126 127 @Override continueBuffering(long positionUs)128 public boolean continueBuffering(long positionUs) { 129 return mSampleBuffer.continueBuffering(positionUs); 130 } 131 } 132