OSDN Git Service

[backup]NyARToolkit
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src.utils / jmf / jp / nyatla / nyartoolkit / jmf / utils / JmfNyARRaster_RGB.java
index 15bf2c6..06fd00b 100644 (file)
@@ -34,19 +34,148 @@ import com.sun.media.codec.video.colorspace.*;
 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
@@ -55,20 +184,20 @@ class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader
                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
@@ -77,27 +206,27 @@ class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader
                        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
@@ -110,10 +239,10 @@ class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader
        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
@@ -121,7 +250,7 @@ class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader
                                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
@@ -142,6 +271,10 @@ class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader
        {\r
                NyARException.notImplement();           \r
        }\r
+       public void switchBuffer(Object i_ref_object) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
 \r
 }\r
 \r
@@ -153,10 +286,11 @@ class NyARBufferReader_Reader_RGB24 extends NyARBufferReader_Reader
  * ソースデータをセットした時に変換します。\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
@@ -178,12 +312,13 @@ class NyARBufferReader_Reader_YUV extends NyARBufferReader_Reader
                }\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
@@ -198,13 +333,13 @@ class NyARBufferReader_Reader_YUV extends NyARBufferReader_Reader
                }\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
@@ -212,7 +347,7 @@ class NyARBufferReader_Reader_YUV extends NyARBufferReader_Reader
                //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
@@ -222,7 +357,7 @@ class NyARBufferReader_Reader_YUV extends NyARBufferReader_Reader
        {\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
@@ -239,97 +374,9 @@ class NyARBufferReader_Reader_YUV extends NyARBufferReader_Reader
        {\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