Switch to GIL instead if VIGRA for image saving
[opengigevision:adaerr-sandbox.git] / Gvsp.h
1 #ifndef GVSP_H
2 #define GVSP_H
3
4 #include <arpa/inet.h>
5 #include <boost/asio.hpp>
6 #include <boost/gil/gil_all.hpp>
7 #include <boost/gil/extension/io/png_io.hpp>
8
9 class GvspManager
10 {
11   public:
12     GvspManager(boost::asio::io_service& service, int nPort):
13         m_socket(service, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), nPort)),
14         m_nCurrPartOfFrame(0),
15         m_nImg(0),
16         m_bRun(false)
17     {
18       StartReceive();
19     }
20
21     ~GvspManager()
22     {
23       Stop();
24       // TODO: socket wait or close
25     }
26
27     void Stop() { m_bRun = false; }
28
29   private:
30     void StartReceive()
31     {
32       m_bRun = true;
33       boost::asio::ip::udp::endpoint ep;
34       m_socket.async_receive_from(boost::asio::buffer(m_buff), ep,
35                                   boost::bind(&GvspManager::RecHandler, this,
36                                               boost::asio::placeholders::error,
37                                               boost::asio::placeholders::bytes_transferred));
38     }
39
40     void RecHandler(const boost::system::error_code& error, std::size_t nBytes)
41     {
42       if (!error || error == boost::asio::error::message_size)
43       {
44         uint16_t nPartOfFrame = ntohs(((uint16_t*)&m_buff)[3]);
45        // std::cout << "Got data:" << nBytes << " bytes\tFrame# " << ntohl(((uint32_t*)&m_buff)[0])
46        //           << "\tPart of frame# " << nPartOfFrame;
47
48         if(m_buff[4] == 0x01)
49         {
50           m_nCurrPartOfFrame = nPartOfFrame;
51           assert(m_nCurrPartOfFrame == 0);
52           uint16_t nWidth = ntohs(((uint16_t*)&m_buff)[13]);
53           uint16_t nHeight = ntohs(((uint16_t*)&m_buff)[15]);
54           std::cout << "\tHeader width: " << nWidth << "\theight: " << nHeight << std::endl;
55           m_img.recreate(nWidth, nHeight);
56         }
57         else if(m_buff[4] == 0x03)
58         {
59           if(nPartOfFrame != m_nCurrPartOfFrame+1)
60             std::cout << "\n***Missing Package***" << std::endl;
61
62           m_nCurrPartOfFrame = nPartOfFrame;
63           int nPayloadSize = nBytes-8;
64           std::copy(m_buff.begin()+8, m_buff.begin() + nPayloadSize, view(m_img).begin() + nPartOfFrame*nPayloadSize);
65         }
66         else if(m_buff[4] == 0x02)
67         {
68           std::cout << "\tFooter" << std::endl;
69           boost::gil::png_write_view(str(boost::format("%|03|.png") % m_nImg++), view(m_img));
70         }
71         else
72           std::cout << "\tUnknown frame" << std::endl;
73
74         if(m_bRun)
75           StartReceive();
76       }
77       else
78         std::cerr << "Error receiving stream data" << std::endl;
79     }
80
81     boost::asio::ip::udp::socket m_socket;
82     boost::array<uint8_t, 2048> m_buff;
83     boost::gil::gray8_image_t m_img;
84     int m_nCurrPartOfFrame;
85     int m_nImg;
86     bool m_bRun;
87 };
88
89
90
91 #endif // GVSP_H