/* * 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.MpegtsCodecType; 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.Bit12; import com.ttProject.unit.extra.bit.Bit13; import com.ttProject.unit.extra.bit.Bit3; import com.ttProject.unit.extra.bit.Bit4; import com.ttProject.unit.extra.bit.Bit8; /** * pmtELementaryStream information. * @author taktod */ public class PmtElementaryField implements IDescriptorHolder { private Bit8 streamType = new Bit8(); private Bit3 reserved1 = new Bit3(); private Bit13 pid = new Bit13(); private Bit4 reserved2 = new Bit4(); private Bit12 esInfoLength = new Bit12(); // ESDescriptor /* * * vlcで作成したmpegtsのデータにこのdescriptorの定義がありましたが、情報がみつからない・・・ * とりあえず・・・ * type:0x05 4 AC-3と書いてあった * type:0x0A 4 00 00 00 00で埋まってた。 * の2種類だけ見つかりました。なんだろうねぇこれ・・・ * @see http://www.etherguidesystems.com/help/sdos/mpeg/semantics/mpeg-2/descriptors/Default.aspx * 情報めっけ */ private List<Descriptor> descriptors = new ArrayList<Descriptor>(); // private Descriptor esDescriptor; // format is unknown, temporary leave. // suggested streamId. private int suggestStreamId; public int getSuggestStreamId() { return suggestStreamId; } public void setSuggestStreamId(int suggestStreamId) { this.suggestStreamId = suggestStreamId; } /** * constructor */ public PmtElementaryField() { } public PmtElementaryField(Bit8 streamType, Bit3 reserved1, Bit13 pid, Bit4 reserved2, Bit12 esInfoLength) { this.streamType = streamType; this.reserved1 = reserved1; this.pid = pid; this.reserved2 = reserved2; this.esInfoLength = esInfoLength; } public int getSize() { return 5 + esInfoLength.get(); } /** * ref the pid * @return */ public short getPid() { return (short)pid.get(); } /** * ref the codecType * @return * @throws Exception */ public MpegtsCodecType getCodecType() throws Exception { return MpegtsCodecType.getType(streamType.get()); } public List<Bit> getBits() { List<Bit> list = new ArrayList<Bit>(); list.add(streamType); list.add(reserved1); list.add(pid); list.add(reserved2); list.add(esInfoLength); for(Descriptor descriptor : descriptors) { list.addAll(descriptor.getBits()); } return list; } /** * ref the descriptor */ public List<Descriptor> getDescriptors() { return new ArrayList<Descriptor>(descriptors); } /** * {@inheritDoc} * @param ch * @throws Exception */ public void load(IReadChannel ch) throws Exception { BitLoader bitLoader = new BitLoader(ch); bitLoader.load(streamType, reserved1, pid, reserved2, esInfoLength); int size = esInfoLength.get(); while(size > 0) { Descriptor descriptor = Descriptor.getDescriptor(ch, this); size -= descriptor.getDescriptorLength().get() + 2; // dataType, dataLengthByte, length descriptors.add(descriptor); } } /** * in the case of update size. */ @Override public void updateSize() { } @Override public String toString() { StringBuilder data = new StringBuilder(); data.append(" "); data.append("pmtElementrayField:"); try { data.append(" type:").append(MpegtsCodecType.getType(streamType.get())); } catch (Exception e) { } data.append(" r1:").append(reserved1); data.append(" pid:").append(Integer.toHexString(pid.get())); data.append(" r2:").append(reserved2); data.append(" eil").append(Integer.toHexString(esInfoLength.get())); for(Descriptor descriptor : descriptors) { data.append("\n"); data.append(descriptor); } return data.toString(); } }