/**
*
*/
package com.exovlc;
import java.io.IOException;
import com.google.android.exoplayer.MediaFormatHolder;
import com.google.android.exoplayer.SampleHolder;
import com.google.android.exoplayer.SampleSource;
import com.google.android.exoplayer.TrackInfo;
import com.google.android.exoplayer.util.Assertions;
/**
* Source of media sample handled by VLCLib.
*
* @author tyazid
*
*/
public class VLCSampleSource implements SampleSource {
private boolean prepared;
private VLCSampleExtractor extractor;
public VLCSampleSource(VLCSampleExtractor extractor) {
this.extractor = Assertions.checkNotNull(extractor);
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#prepare()
*/
@Override
public synchronized boolean prepare() throws IOException {
System.out.println(">> VLCSampleSource.prepare() is prepared = " + prepared);
if (!prepared) {
extractor.prepare();
prepared = true;
}
return prepared;
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#getTrackCount()
*/
@Override
public int getTrackCount() {
Assertions.checkState(prepared);
return extractor.getTrackCount();
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#getTrackInfo(int)
*/
@Override
public TrackInfo getTrackInfo(int track) {
Assertions.checkState(prepared);
TrackInfo[] infos = extractor.getTrackInfos();
if (track >= 0 && track < infos.length)
return infos[track];
ExoVlcUtil.log(this, " getTrackInfo : track=" + track + " is out of range [strat:0,lenght:" + infos.length
+ "] => ret NULL");
return null;
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#enable(int, long)
*/
@Override
public void enable(int track, long positionUs) {
Assertions.checkState(prepared);
if (!extractor.isActiveTrack(track))
extractor.selectTrack(track);
extractor.seekTo(positionUs);
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#disable(int)
*/
@Override
public void disable(int track) {
// do nothing
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#continueBuffering(long)
*/
@Override
public boolean continueBuffering(long positionUs) throws IOException {
// do nothing
return true;
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#readData(int, long,
* com.google.android.exoplayer.MediaFormatHolder,
* com.google.android.exoplayer.SampleHolder, boolean)
*/
@Override
public int readData(int track, long positionUs, MediaFormatHolder formatHolder, SampleHolder sampleHolder,
boolean onlyReadDiscontinuity) throws IOException {
Assertions.checkState(prepared);
return extractor.readSample(track, sampleHolder);
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#seekToUs(long)
*/
@Override
public void seekToUs(long positionUs) {
Assertions.checkState(prepared);
extractor.seekTo(positionUs);
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#getBufferedPositionUs()
*/
@Override
public long getBufferedPositionUs() {
Assertions.checkState(prepared);
return extractor.getBufferedPositionUs();
}
/*
* (non-Javadoc)
*
* @see com.google.android.exoplayer.SampleSource#release()
*/
@Override
public synchronized void release() {
Assertions.checkState(prepared);
if (extractor != null)
extractor.release();
prepared = false;
extractor = null;
}
public synchronized boolean isPrepared() {
return prepared;
}
String getUri() {
return extractor.getUri();
}
boolean hasVideo() {
return extractor.hasVideo();
}
}