11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project
31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License.
61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at
71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software
111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and
141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License.
151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1748dadb49248271b01997862e1335912a4f2e189fYoungsang Chopackage com.android.usbtuner.exoplayer.cache;
181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
191abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.google.android.exoplayer.SampleHolder;
201abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.google.android.exoplayer.SampleSource;
211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
221abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport java.util.LinkedList;
231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/**
251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * A sample queue which reads from the cache and passes to player pipeline.
261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
271abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic class SampleQueue {
281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private final LinkedList<SampleHolder> mQueue = new LinkedList<>();
291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private final SamplePool mSamplePool;
301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public SampleQueue(SamplePool samplePool) {
321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        mSamplePool = samplePool;
331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public void queueSample(SampleHolder sample) {
361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        mQueue.offer(sample);
371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public int dequeueSample(SampleHolder sample) {
401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        SampleHolder sampleFromQueue = mQueue.poll();
411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (sampleFromQueue == null) {
421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            return SampleSource.NOTHING_READ;
431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sample.size = sampleFromQueue.size;
451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sample.flags = sampleFromQueue.flags;
461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sample.timeUs = sampleFromQueue.timeUs;
471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sample.clearData();
481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sampleFromQueue.data.position(0).limit(sample.size);
491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sample.data.put(sampleFromQueue.data);
501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        mSamplePool.releaseSample(sampleFromQueue);
511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return SampleSource.SAMPLE_READ;
521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public void clear() {
551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        while (!mQueue.isEmpty()) {
561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            mSamplePool.releaseSample(mQueue.poll());
571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
60ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public Long getEndPositionUs() {
611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (mQueue.isEmpty()) {
621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            return null;
631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
64ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return mQueue.getLast().timeUs;
651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
661abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
67ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public boolean isDurationGreaterThan(long durationUs) {
681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (mQueue.isEmpty()) {
69ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return false;
701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
71ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return mQueue.getLast().timeUs - mQueue.getFirst().timeUs > durationUs;
721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public boolean isEmpty() {
751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return mQueue.isEmpty();
761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
78