• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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