package com.castlabs.dash.helpers; import com.castlabs.dash.dashfragmenter.representation.Mp4RepresentationBuilder; import com.castlabs.dash.dashfragmenter.representation.RawFileRepresentationBuilder; import com.castlabs.dash.dashfragmenter.representation.RepresentationBuilder; import com.coremedia.iso.boxes.Container; import mpegDashSchemaMpd2011.RepresentationType; import mpegDashSchemaMpd2011.SegmentTimelineType; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import java.util.Iterator; import java.util.logging.Logger; import static com.castlabs.dash.helpers.ManifestHelper.templateReplace; public class RepresentationBuilderToFile { private static Logger LOG = Logger.getLogger(RepresentationBuilderToFile.class.getName()); public static void writeOnDemand(RepresentationBuilder representationBuilder, RepresentationType representation, File outputDir) throws IOException { assert representation.getBaseURLArray().length == 1; assert representation.getBaseURLArray()[0].getStringValue() != null && !"".equals(representation.getBaseURLArray()[0].getStringValue()); File outFile = new File(outputDir, representation.getBaseURLArray()[0].getStringValue()); if (representationBuilder instanceof Mp4RepresentationBuilder) { Mp4RepresentationBuilder mp4RepresentationBuilder = (Mp4RepresentationBuilder)representationBuilder; LOG.info("Writing " + outFile.getAbsolutePath()); WritableByteChannel wbc = Channels.newChannel(new FileOutputStream(outFile)); LOG.fine("Writing init segment"); mp4RepresentationBuilder.getInitSegment().writeContainer(wbc); LOG.fine("Writing index segment"); mp4RepresentationBuilder.getIndexSegment().writeContainer(wbc); LOG.fine("Writing segments"); for (Container fragment : mp4RepresentationBuilder) { fragment.writeContainer(wbc); } wbc.close(); } else if (representationBuilder instanceof RawFileRepresentationBuilder) { FileUtils.copyFile(((RawFileRepresentationBuilder) representationBuilder).getFile(), outFile); } } public static void writeLive(RepresentationBuilder representationBuilder, RepresentationType representation, File outputDirectory) throws IOException { if (representationBuilder instanceof Mp4RepresentationBuilder) { Mp4RepresentationBuilder mp4RepresentationBuilder = (Mp4RepresentationBuilder)representationBuilder; String initPattern = representation.getSegmentTemplate().getInitialization2(); initPattern = templateReplace(initPattern, representation.getId(), 0, representation.getBandwidth(), 0); File initFile = new File(outputDirectory, initPattern); FileUtils.forceMkdir(initFile.getParentFile()); LOG.info("Writing init file " + initFile.getAbsolutePath()); WritableByteChannel wbc = Channels.newChannel(new FileOutputStream(initFile)); mp4RepresentationBuilder.getInitSegment().writeContainer(wbc); wbc.close(); long time = 0; long number = representation.getSegmentTemplate().getStartNumber(); Iterator<Container> segments = mp4RepresentationBuilder.iterator(); LOG.info("Writing segment files " + representation.getSegmentTemplate().getMedia().replace("$RepresentationID$", representation.getId())); for (SegmentTimelineType.S s : representation.getSegmentTemplate().getSegmentTimeline().getSArray()) { if (s.isSetT()) { time = s.getT().longValue(); } String segmentFilename = templateReplace( representation.getSegmentTemplate().getMedia(), representation.getId(), number, representation.getBandwidth(), time); Container segment = segments.next(); File segmentFile = new File(outputDirectory, segmentFilename); FileUtils.forceMkdir(segmentFile.getParentFile()); WritableByteChannel swbc = new FileOutputStream(segmentFile).getChannel(); segment.writeContainer(swbc); swbc.close(); time += s.getD().longValue(); number += 1; if (s.isSetR()) { long r = s.getR().longValue(); while (r > 0) { String segmentFilenameRepeater = templateReplace( representation.getSegmentTemplate().getMedia(), representation.getId(), number, representation.getBandwidth(), time); Container segmentRepeater = segments.next(); File segmentFileRepeater = new File(outputDirectory, segmentFilenameRepeater); FileUtils.forceMkdir(segmentFileRepeater.getParentFile()); WritableByteChannel swbcRepeater = new FileOutputStream(segmentFileRepeater).getChannel(); segmentRepeater.writeContainer(swbcRepeater); swbcRepeater.close(); time += s.getD().longValue(); number += 1; r -= 1; } } } } else if (representation instanceof RawFileRepresentationBuilder) { throw new RuntimeException("No implemented"); } } }