/*
* myLib - https://github.com/taktod/myLib
* Copyright (c) 2014 ttProject. All rights reserved.
*
* Licensed under The MIT license.
*/
package com.ttProject.chunk;
import java.nio.ByteBuffer;
/**
* mediaChunkの共通処理を一本化
* @author taktod
*/
public abstract class MediaChunk implements IMediaChunk {
/** 保持データ実体 */
private ByteBuffer buffer = null;
/** データの長さ */
private float duration = 0;
/** 動作タイムスタンプ値 */
private long timestamp = 0;
/**
* 処理buffer参照
* @param size
* @return
*/
protected ByteBuffer getBuffer(int size) {
if(buffer == null) { // なかったら新規作成
buffer = ByteBuffer.allocate(size + 65536);
}
if(buffer.remaining() >= size) { // 容量の残りが必要量ある場合はそのまま応答
return buffer;
}
// 必要量ないので、新規にバッファを再生成
ByteBuffer newBuffer = ByteBuffer.allocate(buffer.capacity() + size + 65536);
buffer.flip();
newBuffer.put(buffer);
buffer = newBuffer;
return buffer;
}
/**
* すでに追加済みのデータ量を応答する。
* @return
*/
protected int getBufferSize() {
if(buffer == null) {
return 0;
}
return buffer.position();
}
/**
* 長さ設定
* @param duration
*/
public void setDuration(float duration) {
this.duration = duration;
}
/**
* {@inheritDoc}
*/
@Override
public float getDuration() {
return duration;
}
/**
* {@inheritDoc}
*/
@Override
public ByteBuffer getRawBuffer() {
ByteBuffer buffer = this.buffer.duplicate();
buffer.flip();
return buffer;
}
/**
* {@inheritDoc}
*/
@Override
public byte[] getRawData() {
ByteBuffer buffer = getRawBuffer();
byte[] data = new byte[buffer.limit()];
buffer.get(data);
return data;
}
/**
* {@inheritDoc}
*/
@Override
public long getTimestamp() {
return timestamp;
}
/**
* timestampを設置する
* @param pts
*/
public void setTimestamp(long pts) {
timestamp = pts;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isHeader() {
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean write(ByteBuffer data) {
// データを登録しておく。
ByteBuffer buffer = getBuffer(data.remaining());
buffer.put(data);
return true;
}
}