import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
import jp.nyatla.nyartoolkit.core.types.*;\r
\r
\r
\r
+\r
+\r
+/**\r
+ * \r
+ * RGB形式のJMFバッファをラップするNyARRasterです。\r
+ * JMFから得たラスタデータのピクセル並び順を考慮します。\r
+ *\r
+ */\r
+public class JmfNyARRaster_RGB implements INyARRgbRaster\r
+{\r
+ private JmfRGB24RasterHolder _holder;\r
+ protected NyARIntSize _size;\r
+\r
+ /**\r
+ * i_fmtに一致する画素フォーマットのRasterを作成します。\r
+ * このコンストラクタで作成したクラスは、hasBuffer()がfalseを返すことがあります。\r
+ * @param i_width\r
+ * @param i_height\r
+ * @param i_fmt\r
+ * @throws NyARException\r
+ */\r
+ public JmfNyARRaster_RGB(int i_width,int i_height,VideoFormat i_fmt) throws NyARException\r
+ {\r
+ initMember(i_width,i_height,i_fmt);\r
+ }\r
+ /**\r
+ * i_fmtに一致する画素フォーマットのRasterを作成します。\r
+ * このコンストラクタで作成したクラスは、hasBuffer()がfalseを返すことがあります。\r
+ * @param i_size\r
+ * @param i_fmt\r
+ * @throws NyARException\r
+ */\r
+ public JmfNyARRaster_RGB(NyARIntSize i_size,VideoFormat i_fmt) throws NyARException\r
+ {\r
+ initMember(i_size.w,i_size.h,i_fmt);\r
+ }\r
+ private void initMember(int i_width,int i_height,VideoFormat i_fmt) throws NyARException\r
+ {\r
+ this._size= new NyARIntSize(i_width,i_height);\r
+ // データサイズの確認\r
+ final Dimension s = i_fmt.getSize();\r
+ if (!this._size.isEqualSize(s.width,s.height)) {\r
+ throw new NyARException();\r
+ }\r
+ // データ配列の確認\r
+ if(i_fmt instanceof YUVFormat){\r
+ //YUVフォーマット\r
+ this._holder=new NyARGLPixelReader_YUV(this._size,(YUVFormat)i_fmt); \r
+ }else if(i_fmt instanceof RGBFormat){\r
+ //RGBフォーマット\r
+ this._holder=new NyARGLPixelReader_RGB24(this._size,(RGBFormat)i_fmt);\r
+ }else{\r
+ throw new NyARException();\r
+ } \r
+ }\r
+ public void setBuffer(javax.media.Buffer i_buffer) throws NyARException\r
+ {\r
+ this._holder.setMediaBuffer(i_buffer);\r
+ return;\r
+ }\r
+ final public int getWidth()\r
+ {\r
+ return this._size.w;\r
+ }\r
+\r
+ final public int getHeight()\r
+ {\r
+ return this._size.h;\r
+ }\r
+\r
+ final public NyARIntSize getSize()\r
+ {\r
+ return this._size;\r
+ }\r
+ final public int getBufferType()\r
+ {\r
+ return this._holder.buffer_type;\r
+ }\r
+ final public INyARRgbPixelReader getRgbPixelReader()\r
+ {\r
+ return this._holder;\r
+ }\r
+ /**\r
+ * インスタンスがバッファを所有するかを返します。\r
+ * @return\r
+ */ \r
+ final public boolean hasBuffer()\r
+ {\r
+ return this._holder.buffer!=null;\r
+ }\r
+ final public Object getBuffer()\r
+ {\r
+ assert(this._holder.buffer!=null);\r
+ return this._holder.buffer;\r
+ }\r
+ final public boolean isEqualBufferType(int i_type_value)\r
+ {\r
+ return this._holder.buffer_type==i_type_value;\r
+ }\r
+ final public void wrapBuffer(Object i_ref_buf) throws NyARException\r
+ {\r
+ NyARException.notImplement();\r
+ }\r
+ /**\r
+ * @deprecated hasBuffer()関数を使ってください。\r
+ * \r
+ */\r
+ final public boolean hasData()\r
+ {\r
+ return this.hasBuffer();\r
+ }\r
+\r
+}\r
+\r
+\r
+/**\r
+ * JMFと汎用バッファを中継する拡張INyARRgbPixelReader\r
+ * @author nyatla\r
+ *\r
+ */\r
+abstract class JmfRGB24RasterHolder implements INyARRgbPixelReader\r
+{\r
+ public int buffer_type;\r
+ public byte[] buffer;\r
+ public abstract void setMediaBuffer(javax.media.Buffer i_buffer);\r
+}\r
+\r
/**\r
* RGB24フォーマットのデータを扱うピクセルリーダ\r
*/\r
-class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader\r
+class NyARGLPixelReader_RGB24 extends JmfRGB24RasterHolder\r
{\r
protected boolean _is_flipped;\r
- public NyARBufferReader_Reader_RGB24(RGBFormat i_input_format,NyARIntSize i_ref_size) throws NyARException\r
+ private NyARIntSize _ref_size;\r
+ public NyARGLPixelReader_RGB24(NyARIntSize i_ref_size,RGBFormat i_input_format) throws NyARException\r
{\r
- super(i_ref_size);\r
+ this._ref_size=i_ref_size;\r
//ピクセルフォーマットを設定(現状は24bitRGBを受けつける。)\r
RGBFormat fm=(RGBFormat)i_input_format;\r
if(fm.getBitsPerPixel()!=24){\r
int r=fm.getRedMask();\r
int b=fm.getBlueMask();\r
if(r==1 && b==3){\r
- this._buf_type=BUFFERFORMAT_BYTE1D_R8G8B8_24;\r
+ this.buffer_type=INyARRaster.BUFFERFORMAT_BYTE1D_R8G8B8_24;\r
}else if(r==3 && b==1){\r
- this._buf_type=BUFFERFORMAT_BYTE1D_B8G8R8_24; \r
+ this.buffer_type=INyARRaster.BUFFERFORMAT_BYTE1D_B8G8R8_24; \r
}else{\r
throw new NyARException();\r
}\r
//vertical反転の有無を確認\r
this._is_flipped=i_input_format.getFlipped()!=0?true:false;\r
- this._ref_buf=new byte[i_ref_size.w*i_ref_size.h*3];\r
+ this.buffer=new byte[i_ref_size.w*i_ref_size.h*3];\r
//RGBフォーマット\r
\r
return;\r
}\r
- public void changeBuffer(javax.media.Buffer i_buffer)\r
+ public void setMediaBuffer(javax.media.Buffer i_buffer)\r
{\r
//vertical反転が必要ならば、反転した画像を作成する。\r
byte[] src=(byte[])i_buffer.getData();\r
int src_idx = 0;\r
int dest_idx = (this._ref_size.h - 1) * length; \r
for (int i = 0; i < this._ref_size.h; i++) {\r
- System.arraycopy(src,src_idx, this._ref_buf, dest_idx, length);\r
+ System.arraycopy(src,src_idx, this.buffer, dest_idx, length);\r
src_idx += length;\r
dest_idx -= length;\r
}\r
}else{\r
- System.arraycopy(src,0,this._ref_buf,0,this._ref_buf.length);\r
- this._ref_buf=(byte[])i_buffer.getData();\r
+ System.arraycopy(src,0,this.buffer,0,this.buffer.length);\r
+ this.buffer=(byte[])i_buffer.getData();\r
}\r
return;\r
}\r
public void getPixel(int i_x, int i_y, int[] o_rgb) throws NyARException\r
{\r
int bp = (i_x + i_y * this._ref_size.w) * 3;\r
- byte[] ref = this._ref_buf;\r
- switch(this._buf_type){\r
- case BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
+ byte[] ref = this.buffer;\r
+ switch(this.buffer_type){\r
+ case INyARRaster.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
o_rgb[0] = (ref[bp + 0] & 0xff);// R\r
o_rgb[1] = (ref[bp + 1] & 0xff);// G\r
o_rgb[2] = (ref[bp + 2] & 0xff);// B\r
break;\r
- case BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
+ case INyARRaster.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
o_rgb[0] = (ref[bp + 2] & 0xff);// B\r
o_rgb[1] = (ref[bp + 1] & 0xff);// G\r
o_rgb[2] = (ref[bp + 0] & 0xff);// R\r
public void getPixelSet(int[] i_x, int i_y[], int i_num, int[] o_rgb) throws NyARException\r
{\r
int width = this._ref_size.w;\r
- byte[] ref = this._ref_buf;\r
+ byte[] ref = this.buffer;\r
int bp;\r
- switch(this._buf_type){\r
- case BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
+ switch(this.buffer_type){\r
+ case INyARRaster.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
for (int i = i_num - 1; i >= 0; i--) {\r
bp = (i_x[i] + i_y[i] * width) * 3;\r
o_rgb[i * 3 + 0] = (ref[bp + 0] & 0xff);// R\r
o_rgb[i * 3 + 2] = (ref[bp + 2] & 0xff);// B\r
}\r
break;\r
- case BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
+ case INyARRaster.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
for (int i = i_num - 1; i >= 0; i--) {\r
bp = (i_x[i] + i_y[i] * width) * 3;\r
o_rgb[i * 3 + 0] = (ref[bp + 2] & 0xff);// B\r
{\r
NyARException.notImplement(); \r
}\r
+ public void switchBuffer(Object i_ref_object) throws NyARException\r
+ {\r
+ NyARException.notImplement(); \r
+ }\r
\r
}\r
\r
* ソースデータをセットした時に変換します。\r
* (将来YUVをそのまま素通りさせるように書き換えるかも)\r
*/\r
-class NyARBufferReader_Reader_YUV extends NyARBufferReader_Reader\r
+class NyARGLPixelReader_YUV extends JmfRGB24RasterHolder\r
{\r
- \r
+ private NyARIntSize _ref_size; \r
private YUVToRGB _yuv2rgb;\r
+\r
private javax.media.Buffer _rgb_buf;\r
/**\r
* フォーマットアレイから、BGR24フォーマットを探す\r
}\r
return null;\r
}\r
- public NyARBufferReader_Reader_YUV(YUVFormat i_input_format,NyARIntSize i_ref_size) throws NyARException\r
+ public NyARGLPixelReader_YUV(NyARIntSize i_ref_size,YUVFormat i_input_format) throws NyARException\r
{\r
- super(i_ref_size,BUFFERFORMAT_BYTE1D_B8G8R8_24);\r
+ this._ref_size=i_ref_size;\r
+ this.buffer_type=INyARRaster.BUFFERFORMAT_BYTE1D_B8G8R8_24;\r
+ this.buffer=null;\r
this._yuv2rgb=new YUVToRGB();\r
this._rgb_buf=new javax.media.Buffer();\r
- this._ref_buf=null;\r
//24bit-BGRフォーマットのものを探す\r
Format output_format=pickRGB24Format(this._yuv2rgb.getSupportedOutputFormats(i_input_format));\r
if(output_format==null){\r
}\r
return;\r
}\r
- public void changeBuffer(javax.media.Buffer i_buffer)\r
+ public void setMediaBuffer(javax.media.Buffer i_buffer)\r
{\r
//エラー出した時のトラップ\r
if(this._yuv2rgb.process(i_buffer, this._rgb_buf)!=YUVToRGB.BUFFER_PROCESSED_OK){\r
System.err.println("YUVToRGB.process error:");\r
}\r
- this._ref_buf=(byte[])this._rgb_buf.getData();\r
+ this.buffer=(byte[])this._rgb_buf.getData();\r
return;\r
}\r
public void getPixel(int i_x, int i_y, int[] o_rgb) throws NyARException\r
//IN :BGRBGR\r
// :012012\r
final int bp = (i_x + i_y * this._ref_size.w) * 3;\r
- final byte[] ref = this._ref_buf;\r
+ final byte[] ref = this.buffer;\r
o_rgb[0] = (ref[bp + 2] & 0xff);// R\r
o_rgb[1] = (ref[bp + 1] & 0xff);// G\r
o_rgb[2] = (ref[bp + 0] & 0xff);// B\r
{\r
int bp;\r
final int width = this._ref_size.w;\r
- final byte[] ref = this._ref_buf;\r
+ final byte[] ref = this.buffer;\r
for (int i = i_num - 1; i >= 0; i--) {\r
bp = (i_x[i] + i_y[i] * width) * 3;\r
o_rgb[i * 3 + 0] = (ref[bp + 2] & 0xff);// R\r
{\r
NyARException.notImplement(); \r
}\r
- \r
-}\r
-\r
-\r
-/**\r
- * \r
- * RGB形式のJMFバッファをラップするNyARRasterです。\r
- * JMFから得たラスタデータのピクセル並び順を考慮します。\r
- *\r
- */\r
-public class JmfNyARRaster_RGB extends NyARRgbRaster_BasicClass\r
-{\r
-\r
- protected NyARBufferReader_Reader _reader;\r
- /**\r
- * i_formatに一致する画素フォーマットの\r
- * @param i_size\r
- * @param i_format\r
- * @throws NyARException\r
- */\r
-\r
-\r
- public JmfNyARRaster_RGB(NyARIntSize i_ref_size,VideoFormat i_format) throws NyARException\r
+ public void switchBuffer(Object i_ref_object) throws NyARException\r
{\r
- super(new NyARIntSize(i_ref_size)); \r
- this._reader = createReader(i_format);\r
- }\r
- public JmfNyARRaster_RGB(int i_width,int i_height,VideoFormat i_format) throws NyARException\r
- {\r
- super(new NyARIntSize(i_width,i_height));\r
- this._reader = createReader(i_format);\r
- }\r
- \r
- /**\r
- * フォーマットを解析して、マッチするリーダオブジェクトを返します。\r
- * @param i_fmt\r
- * ビデオフォーマットを指定します。\r
- * @return\r
- * リーダオブジェクト\r
- * @throws NyARException\r
- */\r
- private NyARBufferReader_Reader createReader(VideoFormat i_fmt) throws NyARException\r
- {\r
- // データサイズの確認\r
- final Dimension s = i_fmt.getSize();\r
- if (!this._size.isEqualSize(s.width, s.height)) {\r
- throw new NyARException();\r
- }\r
- // データ配列の確認\r
- if(i_fmt instanceof YUVFormat){\r
- //YUVフォーマット\r
- return new NyARBufferReader_Reader_YUV((YUVFormat)i_fmt,this._size); \r
- }else if(i_fmt instanceof RGBFormat){\r
- //RGBフォーマット\r
- return new NyARBufferReader_Reader_RGB24((RGBFormat)i_fmt,this._size);\r
- }else{\r
- throw new NyARException();\r
- }\r
- }\r
-\r
- /**\r
- * javax.media.Bufferを分析して、その分析結果をNyARRasterに適合する形で保持します。\r
- * 関数実行後に外部でi_bufferの内容変更した場合には、再度setBuffer関数を呼び出してください。\r
- * この関数を実行すると、getRgbPixelReaderで取得したReaderのプロパティが変化することがあります。\r
- * @param i_buffer\r
- * RGB形式のデータを格納したjavax.media.Bufferオブジェクトを指定してください。\r
- * @return i_bufferをラップしたオブジェクトを返します。\r
- * @throws NyARException\r
- */\r
- public void setBuffer(javax.media.Buffer i_buffer) throws NyARException\r
- {\r
- this._reader.changeBuffer(i_buffer);\r
- return;\r
- }\r
- /**\r
- * データを持っているかを返します。\r
- * @return\r
- */\r
- public boolean hasData()\r
- {\r
- return this._reader._ref_buf != null;\r
- }\r
- public INyARRgbPixelReader getRgbPixelReader()\r
- {\r
- return this._reader;\r
- }\r
- public INyARBufferReader getBufferReader()\r
- {\r
- return this._reader;\r
- }\r
+ NyARException.notImplement(); \r
+ } \r
}\r
\r
-\r
-\r