/* * 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.nio.ByteBuffer; import org.apache.log4j.Logger; import com.ttProject.container.Container; import com.ttProject.container.mpegts.field.AdaptationField; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.unit.extra.BitConnector; import com.ttProject.unit.extra.bit.Bit1; import com.ttProject.unit.extra.bit.Bit13; import com.ttProject.unit.extra.bit.Bit2; import com.ttProject.unit.extra.bit.Bit4; import com.ttProject.unit.extra.bit.Bit8; import com.ttProject.util.BufferUtil; /** * mpegtsPacket unit. * @author taktod */ public abstract class MpegtsPacket extends Container { /** logger */ @SuppressWarnings("unused") private Logger logger = Logger.getLogger(MpegtsPacket.class); private final Bit8 syncByte; private final Bit1 transportErrorIndicator; private final Bit1 payloadUnitStartIndicator; private final Bit1 transportPriority; private final Bit13 pid; private final Bit2 scramblingControl; private final Bit1 adaptationFieldExist; private final Bit1 payloadFieldExist; private final Bit4 continuityCounter; private AdaptationField adaptationField = new AdaptationField(); public MpegtsPacket(Bit8 syncByte, Bit1 transportErrorIndicator, Bit1 payloadUnitStartIndicator, Bit1 transportPriority, Bit13 pid, Bit2 scramblingControl, Bit1 adaptationFieldExist, Bit1 payloadFieldExist, Bit4 continuityCounter) { this.syncByte = syncByte; this.transportErrorIndicator = transportErrorIndicator; this.payloadUnitStartIndicator = payloadUnitStartIndicator; this.transportPriority = transportPriority; this.pid = pid; this.scramblingControl = scramblingControl; this.adaptationFieldExist = adaptationFieldExist; this.payloadFieldExist = payloadFieldExist; this.continuityCounter = continuityCounter; } @Override public void minimumLoad(IReadChannel channel) throws Exception { if(adaptationFieldExist.get() != 0x00) { adaptationField.load(channel); } } protected ByteBuffer getHeaderBuffer() { BitConnector connector = new BitConnector(); if(adaptationFieldExist.get() == 1) { return BufferUtil.connect( connector.connect( syncByte, transportErrorIndicator, payloadUnitStartIndicator, transportPriority, pid, scramblingControl, adaptationFieldExist, payloadFieldExist, continuityCounter), connector.connect(adaptationField.getBits()) ); } else { return connector.connect( syncByte, transportErrorIndicator, payloadUnitStartIndicator, transportPriority, pid, scramblingControl, adaptationFieldExist, payloadFieldExist, continuityCounter); } } protected boolean isPayloadUnitStart() { return payloadUnitStartIndicator.get() == 1; } protected void setPayloadUnitStart(int flag) { payloadUnitStartIndicator.set(flag); } public void setContinuityCounter(int counter) { continuityCounter.set(counter); super.update(); } public int getContinuityCounter() { return continuityCounter.get(); } protected void setAdaptationFieldExist(int flag) { adaptationFieldExist.set(flag); } protected boolean isAdaptationFieldExist() { return adaptationFieldExist.get() == 1; } protected AdaptationField getAdaptationField() { return adaptationField; } public int getPid() { return pid.get(); } }