Esempio n. 1
0
 public void loadBitmapStreamP2P()
 {
     while (true)
     {
         while (bitmap_stream.Count >= buffer_num)
         {
             Thread.Sleep(200);
         }
         Console.Out.WriteLine("loading buffer...");
         BitmapStream stream_tmp = new BitmapStream();
         stream_tmp = client.askBitmapStream(countBitmap);
         for (int i = 0; i < stream_tmp.stream.Count; i++)
         {
             if (stream_tmp.stream[i] == null)
             {
                 reader.finish = 1;
                 countBitmap++;
                 bitmap_stream.Add(stream_tmp);
                 return;
             }
         }
         countBitmap++;
         bitmap_stream.Add(stream_tmp);
     }
 }
Esempio n. 2
0
        public BitmapStream loadBitmapStream_wmv()
        {
            BitmapStream stream_tmp = new BitmapStream();

            for (int i = 0; i < bmpPerStream; i++)
            {
                //现在不会判断它停。。。
                if (video_wmv.IsOpen == false)
                {
                    return(stream_tmp);
                }
                Bitmap bitmap_tmp = video_wmv.ReadVideoFrame();
                if (bitmap_tmp != null)
                {
                    stream_tmp.addFrame(bitmap_tmp);
                }
                else
                {
                    finish = 1;
                    video_wmv.Close();
                    streamCount++;
                    return(stream_tmp);
                }
            }
            streamCount++;
            return(stream_tmp);
        }
 public CompressedBitmapStream(BitmapStream bitmapStream)
 {
     position  = bitmapStream.position;
     empty     = bitmapStream.empty;
     stream    = new List <byte[]>();
     converter = new ImageConverter();
     for (int i = 0; i < bitmapStream.stream.Count; i++)
     {
         MemoryStream ms = new MemoryStream();
         bitmapStream.stream[i].Save(ms, ImageFormat.Jpeg);
         stream.Add(ms.ToArray());
     }
 }
        public BitmapStream toBitmapStream()
        {
            BitmapStream result = new BitmapStream();

            converter = new ImageConverter();
            for (int i = 0; i < stream.Count; i++)
            {
                Image  img    = (Image)converter.ConvertFrom(stream[i]);
                Bitmap bitmap = new Bitmap(img);

                result.addFrame(bitmap);
            }
            return(result);
        }
Esempio n. 5
0
        public ThreadWithPort(String ip, int num1, int num2, String str, int num)
        {
            reader      = new BitmapReader();
            bitmap_resp = new BitmapStream();

            num_frac = num;

            audio_reader = new WaveOutReader();
            audio_resp   = new WaveOutStream();

            port_send   = num1;
            port_listen = num2;
            ip_send     = ip;
            conn        = new Connector(ip_send, port_send, port_listen);

            type = str;
        }
Esempio n. 6
0
 public void loadBitmapStream()
 {
     //“后台”线程,如果bitmap_stream的长度小于2,就读新的BitmapStream
     //两个BitmapStream的时候这个function就卡住了
     while (true)
     {
         //load 4 buffers
         while (bitmap_stream.Count >= buffer_num)
         {
             Thread.Sleep(200);
             if (reader.finish == 1)
             {
                 return;
             }
         }
         Console.Out.WriteLine("loading buffer...");
         BitmapStream stream_tmp = new BitmapStream();
         //reader的loadBitmapStream是读取bitmapstream
         //本地不用考虑异步、大家read的不对齐的情况,参数直接设-1
         stream_tmp = reader.loadBitmapStream_count(-1);
         bitmap_stream.Add(stream_tmp);
         countBitmap++;
     }
 }
Esempio n. 7
0
        public void listen_video_header()
        {
            while (true)
            {
                Console.Out.WriteLine("listen_video_header is running...");
                Package pack = conn.recv();
                if (pack == null)
                {
                    continue;
                }
                if (pack.type == "ask_video")
                {
                    /*
                     * header for request:
                     * [0] Name
                     */
                    List <String> header   = new List <String>(pack.header);
                    String[]      tmp      = header[0].Split('\\');
                    String        tmp_addr = Utils.search_addr_from_list(tmp[tmp.Length - 1], Client.media);
                    if (tmp_addr != "" && File.Exists(tmp_addr))
                    {
                        //该文件存在,载入到本线程的reader里面
                        //接受的时候不需要reader,只有传的时候需要,所以一个reader就够了

                        /*
                         * type of resp: has_video
                         *
                         * reader the info from the video file and response a header
                         *
                         * header of resp:
                         * [0] FrameRate(给player设置interval)
                         * [1] Height
                         * [2] Width
                         *
                         * 那个wmv是历史遗留问题反正avi也是这个参数。。。
                         *
                         */

                        header = reader.loadFile(tmp_addr, "wmv");


                        for (int i = 0; i < header.Count; i++)
                        {
                            Console.Out.WriteLine("{0}: {1}", i, header[i]);
                        }
                        Package pack_resp = new Package("has_video");
                        pack_resp.header = new List <string>(header);
                        Connector conn_resp = Client.find_conn(Client.conn_video_data, pack.from);
                        conn_resp.send(pack_resp);
                    }
                    else
                    {
                        Package   pack_resp = new Package("no_video");
                        Connector conn_resp = Client.find_conn(Client.conn_video_data, pack.from);
                        conn_resp.send(pack_resp);
                    }
                }
                else if (pack.type == "request_video" && num_frac == 0)
                {
                    /*
                     * header for request:
                     * [0] 第几个bitmapStream
                     */

                    List <String> header = new List <String>(pack.header);

                    if (reader.finish == 1)
                    {
                        //空了,给一个end_video
                        Package          pack_resp = new Package("end_video");
                        List <Connector> conn_resp = Client.find_conns(Client.conn_video_data, pack.from);

                        conn_resp[0].send(pack_resp);
                    }
                    else
                    {
                        BitmapStream bitmapStream = reader.loadBitmapStream_count(Int32.Parse(header[0]));

                        CompressedBitmapStream comp_bitmapStream = new CompressedBitmapStream(bitmapStream);

                        //把object serialize成memoryStream,再到byte[]
                        MemoryStream    stream    = new MemoryStream();
                        BinaryFormatter formatter = new BinaryFormatter();
                        formatter.Serialize(stream, comp_bitmapStream);

                        byte[] data = stream.ToArray();

                        //byte[] m = Compress.compress(data);

                        List <byte[]> data_list = new List <byte[]>();

                        int offset = (int)data.Length / Client.NUM_FRACTION;

                        for (int i = 0; i < Client.NUM_FRACTION; i++)
                        {
                            byte[] tmp_data;
                            if (i < Client.NUM_FRACTION - 1)
                            {
                                tmp_data = new byte[offset];
                            }
                            else
                            {
                                tmp_data = new byte[data.Length - (Client.NUM_FRACTION - 1) * offset];
                            }
                            System.Buffer.BlockCopy(data, i * offset, tmp_data, 0, tmp_data.Length);
                            data_list.Add(tmp_data);
                        }

                        //发回去

                        List <Connector> conn_resp = Client.find_conns(Client.conn_video_data, pack.from);

                        if (conn_resp.Count == 0)
                        {
                            return;
                        }

                        for (int i = 0; i < Client.NUM_FRACTION; i++)
                        {
                            Package pack_resp = new Package("video_resp");
                            pack_resp.data = data_list[i];
                            if (conn_resp[i].ip_send == "")
                            {
                                return;
                            }
                            send_thread a = new send_thread(conn_resp[i], pack_resp);
                            a.start();
                        }
                    }
                }
            }
        }