/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.chunk.mpegts; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.ttProject.media.IAudioData; /** * audioDataはunitごとの動作への切り分けが比較的容易に実行できるので、unitごとの保存でいい * @author taktod */ public class AudioDataList extends MediaDataList { /** ロガー */ @SuppressWarnings("unused") private final Logger logger = Logger.getLogger(AudioDataList.class); /** 保持データリスト(aacやmp3の状態に分解されています。) */ private final List<IAudioData> audioDataList = new ArrayList<IAudioData>(); /** 取得サンプル数 */ private long counter = 0; /** 転送済みのサンプル数 */ private long sendedCounter = 0; /** pesの開始位置(mpegtsのtimestampは必ずしも0からはじまっていないので、ずれ分を保持しなければいけない) */ private long startPos = -1; /** sampleRate値(時間の計算で必要) */ private int sampleRate = 44100; /** * 保持データリストのサイズを確認する。 * @return */ public int getListCount() { return audioDataList.size(); } /** * データを追加する。 * @param data データ実体 * @param pts pts値(任意) */ public void addAudioData(IAudioData data, long pts) { if(startPos == -1 && pts != -1L) { startPos = pts; } sampleRate = data.getSampleRate(); counter += data.getSampleNum(); audioDataList.add(data); } /** * 終端pts値を参照する * @return */ public long getLastDataPts() { return startPos + (long)(counter * (90000D / sampleRate)); } /** * 現在保持している先頭データpts値 * @return */ public long getFirstDataPts() { return startPos + (long)(sendedCounter * (90000D / sampleRate)); } /** * 先頭データを取り出す * @return */ public IAudioData shift() { if(audioDataList.size() == 0) { return null; } IAudioData audioData = audioDataList.remove(0); sendedCounter += audioData.getSampleNum(); return audioData; } /** * 先頭にデータを戻す * @param audioData */ public void unshift(IAudioData audioData) { if(audioData == null) { return; } sendedCounter -= audioData.getSampleNum(); audioDataList.add(0, audioData); } /** * {@inheritDoc} */ @Override public String toString() { StringBuilder data = new StringBuilder(); data.append("audioDataList:").append(audioDataList.size()); return data.toString(); } }