/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.mpegts.descriptor; import java.nio.ByteBuffer; import java.util.List; import com.ttProject.media.extra.Bit; import com.ttProject.media.extra.Bit8; import com.ttProject.media.extra.BitLoader; import com.ttProject.nio.channels.IReadChannel; import com.ttProject.util.BufferUtil; /** * SDT等に乗っているserviceDescriptorの定義 * @author taktod * */ public class ServiceDescriptor extends Descriptor { private Bit8 serviceType; // 00000001 private Bit8 serviceProviderNameLength; private String serviceProviderName; private Bit8 serviceNameLength; private String serviceName; /** * コンストラクタ * @param descriptorLength */ public ServiceDescriptor(Bit8 descriptorLength) { super(new Bit8(DescriptorType.service_descriptor.intValue()), descriptorLength); // typeだけ1に設定しておく。 serviceType = new Bit8(1); } /** * コンストラクタ */ public ServiceDescriptor() { super(new Bit8(DescriptorType.service_descriptor.intValue())); serviceType = new Bit8(1); } /** * 名称を追加 * @param providerName * @param name */ public void setName(String providerName, String name) { serviceProviderName = providerName; serviceProviderNameLength = new Bit8(providerName.length()); serviceName = name; serviceNameLength = new Bit8(name.length()); setDescriptorLength(new Bit8(3 + providerName.length() + name.length())); } public String getProviderName() { return serviceProviderName; } public String getName() { return serviceName; } @Override public List<Bit> getBits() { List<Bit> list = super.getBits(); list.add(serviceType); list.add(serviceProviderNameLength); // stringの値をbitに変換して投入する必要あり。 ByteBuffer buffer; buffer = ByteBuffer.wrap(serviceProviderName.getBytes()); while(buffer.remaining() > 0) { list.add(new Bit8(buffer.get() & 0xFF)); } list.add(serviceNameLength); buffer = ByteBuffer.wrap(serviceName.getBytes()); while(buffer.remaining() > 0) { list.add(new Bit8(buffer.get() & 0xFF)); } return list; } /** * 解析動作 * @param channel * @throws Exception */ public void analyze(IReadChannel channel) throws Exception { serviceType = new Bit8(); serviceProviderNameLength = new Bit8(); BitLoader bitLoader = new BitLoader(channel); bitLoader.load(serviceType, serviceProviderNameLength); serviceProviderName = new String(BufferUtil.safeRead(channel, serviceProviderNameLength.get()).array()); serviceNameLength = new Bit8(); bitLoader = new BitLoader(channel); bitLoader.load(serviceNameLength); serviceName = new String(BufferUtil.safeRead(channel, serviceNameLength.get()).array()); } @Override public String toString() { StringBuilder data = new StringBuilder(); data.append(" "); data.append("serviceDescriptor:"); data.append(" length:").append(Integer.toHexString(getDescriptorLength().get())); data.append(" type:").append(serviceType); data.append(" providerName:").append(serviceProviderName); data.append(" name:").append(serviceName); return data.toString(); } }