/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.container.mpegts.field; import java.util.ArrayList; import java.util.List; import com.ttProject.container.mpegts.descriptor.Descriptor; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.unit.extra.Bit; import com.ttProject.unit.extra.BitLoader; import com.ttProject.unit.extra.bit.Bit1; import com.ttProject.unit.extra.bit.Bit12; import com.ttProject.unit.extra.bit.Bit16; import com.ttProject.unit.extra.bit.Bit3; import com.ttProject.unit.extra.bit.Bit6; /** * data field in sdt. * @author taktod */ public class SdtServiceField implements IDescriptorHolder { private Bit16 serviceId = new Bit16(1); private Bit6 reservedFutureUse = new Bit6(0x3F); private Bit1 eitScheduleFlag = new Bit1(); private Bit1 eitPresentFollowingFlag = new Bit1(); private Bit3 runningStatus = new Bit3(4); private Bit1 freeCAMode = new Bit1(); private Bit12 descriptorsLoopLength = new Bit12(); private List<Descriptor> descriptors = new ArrayList<Descriptor>(); /** * @param id */ public void setServiceId(short id) { this.serviceId.set(id); } public short getServiceId() { return (short)serviceId.get(); } /** * ref the descriptors. * @return */ public List<Descriptor> getDescriptors() { return new ArrayList<Descriptor>(descriptors); } public void addDescriptor(Descriptor descriptor) { // no duplicate. if(!descriptors.contains(descriptor)) { descriptors.add(descriptor); } updateSize(); } public boolean removeDescripor(Descriptor descriptor) { boolean result = descriptors.remove(descriptor); for(Descriptor desc : descriptors) { descriptorsLoopLength.set(descriptorsLoopLength.get() + desc.getSize()); } return result; } /** * {@inheritDoc} */ @Override public void updateSize() { descriptorsLoopLength.set(0); for(Descriptor desc : descriptors) { descriptorsLoopLength.set(descriptorsLoopLength.get() + desc.getSize()); } } /** * ref the size * @return */ public int getSize() { return descriptorsLoopLength.get() + 5; } /** * analyze data. * @param ch * @throws Exception */ public void load(IReadChannel ch) throws Exception { BitLoader bitLoader = new BitLoader(ch); bitLoader.load(serviceId, reservedFutureUse, eitScheduleFlag, eitPresentFollowingFlag, runningStatus, freeCAMode, descriptorsLoopLength); int size = descriptorsLoopLength.get(); while(size > 0) { // need to load descriptor Descriptor descriptor = Descriptor.getDescriptor(ch, this); size -= descriptor.getDescriptorLength().get() + 2; // dataType, lengthByte, Length descriptors.add(descriptor); } } public List<Bit> getBits() { List<Bit> list = new ArrayList<Bit>(); list.add(serviceId); list.add(reservedFutureUse); list.add(eitScheduleFlag); list.add(eitPresentFollowingFlag); list.add(runningStatus); list.add(freeCAMode); list.add(descriptorsLoopLength); for(Descriptor descriptor : descriptors) { list.addAll(descriptor.getBits()); } return list; } @Override public String toString() { StringBuilder data = new StringBuilder(); data.append(" "); data.append("sdtServiceField:"); data.append(" si:").append(Integer.toHexString(serviceId.get())); data.append(" rfu:").append(reservedFutureUse); data.append(" esf:").append(eitScheduleFlag); data.append(" epff:").append(eitPresentFollowingFlag); data.append(" rs:").append(runningStatus); data.append(" fcam:").append(freeCAMode); data.append(" dll:").append(Integer.toHexString(descriptorsLoopLength.get())); for(Descriptor descriptor : descriptors) { data.append("\n"); data.append(descriptor); } return data.toString(); } }