/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.media.mpegts.packet;
import java.nio.ByteBuffer;
import java.util.List;
import com.ttProject.media.extra.Bit;
import com.ttProject.media.extra.Bit3;
import com.ttProject.media.extra.Bit5;
import com.ttProject.media.extra.Bit8;
import com.ttProject.media.extra.BitLoader;
import com.ttProject.media.mpegts.ProgramPacket;
import com.ttProject.nio.channels.ByteReadChannel;
import com.ttProject.nio.channels.IReadChannel;
/**
* Pat(Program Association Table)
* 474000100000B00D0001C100000001F0002AB104B2
* @author taktod
*/
public class Pat extends ProgramPacket {
/** 巡回データカウンター */
private static byte counter = 0;
private short programNum; // 16bit // 1
private Bit3 reserved; // 111
private short programPid; // 13bit // 4096(0x1000)
public Pat() throws Exception {
super(0);
setupDefault();
}
public Pat(ByteBuffer buffer) throws Exception {
this(0, buffer);
}
public Pat(int position, ByteBuffer buffer) throws Exception {
super(position);
// bufferがある場合はそのまま読み込むものとします。
analyze(new ByteReadChannel(buffer));
}
@Override
public void setupDefault() throws Exception {
analyzeHeader(new ByteReadChannel(new byte[]{
0x47, 0x40, 0x00, 0x10, 0x00, 0x00, (byte)0xB0, 0x0D, 0x00, 0x01, (byte)0xC1, 0x00, 0x00
}));
programNum = 1;
reserved = new Bit3(0x07);
programPid = (short)0x1000;
short length = 0;
length += 5; // programPacket残り
length += 4; // pat独自データ
length += 4; // crc32
setSectionLength(length);
}
@Override
public List<Bit> getBits() {
List<Bit> list = super.getBits();
list.add(new Bit8(programNum >>> 8));
list.add(new Bit8(programNum));
list.add(reserved);
list.add(new Bit5(programPid >>> 8));
list.add(new Bit8(programPid));
return list;
}
@Override
public void analyze(IReadChannel ch) throws Exception {
// 先頭の部分を解析しておく。
analyzeHeader(ch);
Bit8 programNum_1 = new Bit8();
Bit8 programNum_2 = new Bit8();
reserved = new Bit3();
Bit5 programPid_1 = new Bit5();
Bit8 programPid_2 = new Bit8();
BitLoader bitLoader = new BitLoader(ch);
bitLoader.load(programNum_1, programNum_2,
reserved, programPid_1, programPid_2);
programNum = (short)((programNum_1.get() << 8) | programNum_2.get());
programPid = (short)((programPid_1.get() << 8) | programPid_2.get());
}
/**
* 対応しているpmtのpidを応答します。
* @return
*/
public short getProgramPid() {
return programPid;
}
@Override
public ByteBuffer getBuffer() throws Exception {
setContinuityCounter(counter ++);
return super.getBuffer();
}
/**
* 巡回cc値を設定して動作するgetBuffer
* @param counter
* @return
* @throws Exception
*/
public ByteBuffer getBuffer(int counter) throws Exception {
setContinuityCounter(counter);
return super.getBuffer();
}
@Override
public String toString() {
StringBuilder data = new StringBuilder();
data.append("Pat:");
data.append("\n").append(super.toString());
data.append(" pn:").append(Integer.toHexString(programNum));
data.append(" r:").append(reserved);
data.append(" pp:").append(Integer.toHexString(programPid));
return data.toString();
}
}