package org.mconf.bbb.bot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.flazr.io.flv.FlvAtom; import com.flazr.rtmp.RtmpMessage; import com.flazr.rtmp.RtmpReader; import com.flazr.rtmp.message.Metadata; public class GlobalFlvReader implements RtmpReader { private static final Logger logger = LoggerFactory.getLogger(GlobalFlvReader.class); private int frameIndex = 0; private final FlvPreLoader loader; public GlobalFlvReader(FlvPreLoader loader) { this.loader = loader; } @Override public Metadata getMetadata() { return loader.getReader().getMetadata(); } @Override public RtmpMessage[] getStartMessages() { return loader.getReader().getStartMessages(); } @Override public void setAggregateDuration(int targetDuration) { } @Override public long getTimePosition() { RtmpMessage message = loader.getMessages().get(frameIndex); return message.getHeader().getTime(); } @Override public long seek(long timePosition) { logger.debug("trying to seek to: {}", timePosition); if(timePosition == 0) { // special case frameIndex = 0; return 0; } final long start = getTimePosition(); if(timePosition > start) { while(hasNext()) { final RtmpMessage cursor = next(); if(cursor.getHeader().getTime() >= timePosition) { break; } } } else { while(hasPrev()) { final RtmpMessage cursor = prev(); if(cursor.getHeader().getTime() <= timePosition) { next(); break; } } } return getTimePosition(); } @Override public void close() { } @Override public boolean hasNext() { return frameIndex < loader.getMessages().size(); } private boolean hasPrev() { return frameIndex > 0; } @Override public RtmpMessage next() { RtmpMessage message = loader.getMessages().get(frameIndex); frameIndex++; return new FlvAtom(message.getHeader().getMessageType(), message.getHeader().getTime(), message.encode().copy()); } private RtmpMessage prev() { frameIndex--; RtmpMessage message = loader.getMessages().get(frameIndex); return new FlvAtom(message.getHeader().getMessageType(), message.getHeader().getTime(), message.encode().copy()); } @Override public int getWidth() { return loader.getReader().getWidth(); } @Override public int getHeight() { return loader.getReader().getHeight(); } }