/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.container.mpegts;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
import com.ttProject.container.IContainer;
import com.ttProject.container.NullContainer;
import com.ttProject.container.Reader;
import com.ttProject.container.mpegts.type.Pes;
import com.ttProject.nio.channels.IReadChannel;
import com.ttProject.unit.IUnit;
/**
* mpegtsPacketReader
* @author taktod
*/
public class MpegtsPacketReader extends Reader {
/** logger */
@SuppressWarnings("unused")
private Logger logger = Logger.getLogger(MpegtsPacketReader.class);
/** hold the unitStart Pes object for reference. */
private Map<Integer, Pes> pesMap = new ConcurrentHashMap<Integer, Pes>();
/**
* constructor
*/
public MpegtsPacketReader() {
super(new MpegtsPacketSelector());
}
/**
* {@inheritDoc}
*/
@Override
public IContainer read(IReadChannel channel) throws Exception {
IUnit unit = getSelector().select(channel);
if(unit != null && !(unit instanceof NullContainer)) {
unit.load(channel);
}
/*
* if pes is not completed yet. reply nullContainer.
*/
if(unit instanceof Pes) {
Pes pes = (Pes) unit;
if(pes.isPayloadUnitStart()) {
Pes prevPes = pesMap.get(pes.getPid());
pesMap.put(pes.getPid(), pes);
if(prevPes != null) {
prevPes.analyzeFrame();
return prevPes;
}
}
return NullContainer.getInstance();
}
return (IContainer) unit;
}
/**
* {@inheritDoc}
*/
@Override
public List<IContainer> getRemainData() throws Exception {
List<IContainer> result = new ArrayList<IContainer>();
for(Entry<Integer, Pes> entry : pesMap.entrySet()) {
Pes pes = entry.getValue();
if(pes != null) {
pes.analyzeFrame();
result.add(pes);
}
}
return result;
}
}