package org.jcodec.player.filters.audio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import org.jcodec.common.AudioDecoder;
import org.jcodec.common.model.AudioFrame;
import org.jcodec.common.model.Packet;
import org.jcodec.common.model.RationalLarge;
import org.jcodec.common.tools.Debug;
import org.jcodec.player.PlayerUtils;
import org.jcodec.player.filters.MediaInfo;
import org.jcodec.player.filters.PacketSource;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class JCodecAudioSource implements AudioSource {
private PacketSource pkt;
private AudioDecoder decoder;
private MediaInfo.AudioInfo mediaInfo;
private List<ByteBuffer> drain = new ArrayList<ByteBuffer>();
public JCodecAudioSource(PacketSource pkt) throws IOException {
Debug.println("Creating audio source");
this.pkt = pkt;
mediaInfo = (MediaInfo.AudioInfo) pkt.getMediaInfo();
decoder = PlayerUtils.getAudioDecoder(mediaInfo.getFourcc(), mediaInfo);
Debug.println("Created audio source");
}
@Override
public AudioFrame getFrame(ByteBuffer out) throws IOException {
ByteBuffer buffer;
synchronized (drain) {
if (drain.size() == 0) {
drain.add(allocateBuffer());
}
buffer = drain.remove(0);
}
buffer.rewind();
Packet packet = pkt.getPacket(buffer);
if (packet == null)
return null;
return new AudioFrame(decoder.decodeFrame(packet.getData(), out), packet.getPts(), packet.getDuration(),
packet.getTimescale(), (int) packet.getFrameNo());
}
private ByteBuffer allocateBuffer() {
return ByteBuffer.allocate(96000 * mediaInfo.getFormat().getFrameSize() * 10);
}
public boolean drySeek(RationalLarge second) throws IOException {
return pkt.drySeek(second);
}
public void seek(RationalLarge second) throws IOException {
pkt.seek(second);
}
@Override
public MediaInfo.AudioInfo getAudioInfo() throws IOException {
return (MediaInfo.AudioInfo) pkt.getMediaInfo();
}
public void close() throws IOException {
pkt.close();
}
}