/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.packet;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* MediaPacketManagerの共通動作部分抜きだし
* @author taktod
*/
public abstract class MediaPacketManager implements IMediaPacketManager {
/** 保持データ実体 */
private ByteBuffer buffer = null;
/** 現在処理中のパケット参照 */
private IMediaPacket currentPacket = null;
/** 処理済み書き込み経過時刻 */
private float passedTime = 0;
/** 各パケットの目標の長さ */
private float duration = 2;
/**
* {@inheritDoc}
*/
@Override
public float getDuration() {
return duration;
}
/**
* duration値参照
* @param duration
*/
public void setDuration(float duration) {
this.duration = duration;
}
/**
* パケットの解析処理
*/
@Override
public List<IMediaPacket> getPackets(ByteBuffer data) {
if(buffer != null) {
int length = buffer.remaining() + data.remaining();
ByteBuffer newBuffer = ByteBuffer.allocate(length);
newBuffer.put(buffer);
buffer = newBuffer;
buffer.put(data);
buffer.flip();
}
else {
int length = data.remaining();
ByteBuffer newBuffer = ByteBuffer.allocate(length);
newBuffer.put(data);
buffer = newBuffer;
buffer.flip();
}
List<IMediaPacket> result = new ArrayList<IMediaPacket>();
while(buffer.remaining() > 0) {
IMediaPacket packet = analizePacket(buffer);
if(packet == null) {
break;
}
else {
result.add(packet);
}
}
return result;
}
/**
* 現在処理中のパケットを取得
*/
@Override
public IMediaPacket getCurrentPacket() {
return currentPacket;
}
/**
* パケットの中身解析処理
* @param buffer
* @return
*/
protected abstract IMediaPacket analizePacket(ByteBuffer buffer);
/**
* 現在処理中のパケットを取得
* @param packet
*/
protected void setCurrentPacket(IMediaPacket packet) {
currentPacket = packet;
}
/**
* 経過秒数を増やす
* @param time
*/
public void addPassedTime(float time) {
passedTime += time;
}
/**
* 経過秒数を取得する。
* @return 秒数
*/
public float getPassedTime() {
return passedTime;
}
/**
* データをリセットしておく。
*/
public void reset() {
passedTime = 0;
currentPacket = null;
buffer = null;
}
}