/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.container.mkv; import java.util.Map; 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.mkv.type.Cluster; import com.ttProject.container.mkv.type.Segment; import com.ttProject.container.mkv.type.Timecode; import com.ttProject.container.mkv.type.TimecodeScale; import com.ttProject.container.mkv.type.TrackEntry; import com.ttProject.nio.channels.IReadChannel; /** * mkvTagReader * @author taktod */ public class MkvTagReader extends Reader { /** logger */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(MkvTagReader.class); private Map<Integer, TrackEntry> trackEntryMap = new ConcurrentHashMap<Integer, TrackEntry>(); private long defaultTimebase = 1000; private long clusterTime = 0; /** * constructor */ public MkvTagReader() { super(new MkvTagSelector()); } /** * {@inheritDoc} */ @Override public IContainer read(IReadChannel channel) throws Exception { IContainer container = (IContainer)getSelector().select(channel); MkvTag tag = null; if(container != null) { if(container instanceof NullContainer) { return container; } tag = (MkvTag)container; tag.setMkvTagReader(this); if(!(tag instanceof Cluster) && !(tag instanceof Segment)) { // clusterとsegmentの読み込みをスキップすることで、simpleBlockのデータを応答するようにしておく tag.load(channel); } // logger.info(container); } if(tag instanceof TimecodeScale) { defaultTimebase = ((TimecodeScale) tag).getTimebaseValue(); } if(tag instanceof TrackEntry) { TrackEntry trackEntry = (TrackEntry)tag; int id = trackEntry.setupEntry(defaultTimebase); trackEntryMap.put(id, trackEntry); } if(tag instanceof Timecode) { clusterTime = ((Timecode)tag).getValue(); } return tag; } public TrackEntry getTrackEntry(int trackId) { return trackEntryMap.get(trackId); } public long getClusterTime() { return clusterTime; } }