#include #include "bass.h" #include "bassenc.h" #include "bassmix.h" #include #include #include #include using namespace cv; using namespace std; #define maxsock 50 WSADATA wsa; SOCKET sock; SOCKADDR_IN addr; typedef struct { int a; unsigned char snd[34000]; int b; unsigned char vid[14000]; } bufbuf; char startbuf[maxsock][34000]; int startpos[maxsock]; void CALLBACK MyFileCloseProc(void *user) { return; // close the file } QWORD CALLBACK MyFileLenProc(void *user) { return 0; // return the file length } DWORD CALLBACK MyFileReadProc(void *buffer, DWORD length, void *user) { int i; i = (int)user; memcpy( buffer, &startbuf[i][startpos[i]], length ); startpos[i] += length; return length; // read from file } BOOL CALLBACK MyFileSeekProc(QWORD offset, void *user) { return 0; // seek to offset } BASS_FILEPROCS fileprocs={MyFileCloseProc, MyFileLenProc, MyFileReadProc, MyFileSeekProc}; int dpos; unsigned char dbuf[100000]; void CALLBACK encpro( HENCODE enc, DWORD chan, const void *buffer, DWORD length, void *user ) { memcpy( &dbuf[dpos], buffer, length ); dpos += length; return; } int main(int, char**) { WSAStartup( MAKEWORD(2, 2), &wsa ); sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("87.106.40.176"); addr.sin_port = htons(23000); int rc; rc = connect( sock, (SOCKADDR*) &addr, sizeof(addr) ); if (rc == SOCKET_ERROR) return 0; char on = 1; setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char*) &on, 1 ); BASS_Init( -1, 44100, 0, 0, 0 ); BASS_RecordInit( -1 ); BASS_PluginLoad( "bassenc.dll", 0 ); BASS_PluginLoad( "bassmix.dll", 0 ); BASS_SetConfig( BASS_CONFIG_UPDATEPERIOD, 20 ); BASS_SetConfig( BASS_CONFIG_BUFFER, 200 ); HRECORD rec; rec = BASS_RecordStart( 44100, 1, MAKELONG(0, 10), 0, 0 ); HSTREAM mixer; mixer = BASS_Mixer_StreamCreate( 44100, 1, 0 ); BASS_Mixer_StreamAddChannel( mixer, rec, 0 ); BASS_ChannelSetAttribute( mixer, BASS_ATTRIB_VOL, 0.0 ); BASS_ChannelPlay( mixer, 0 ); HENCODE enc; dpos = 0; enc = BASS_Encode_Start( mixer, "lame -q 0 -b 64 - -", 0, encpro, 0 ); HSTREAM hstr[maxsock]; BYTE bassbuf[50000]; VideoCapture cap(0); if(!cap.isOpened()) return 0; cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 200); Mat sframe; Mat dframe; vector cmpr_a; cmpr_a.push_back(CV_IMWRITE_JPEG_QUALITY); cmpr_a.push_back(24); vector cmpr_b; cmpr_b.push_back(CV_IMWRITE_JPEG_QUALITY); cmpr_b.push_back(32); vector cmpr_c; cmpr_c.push_back(CV_IMWRITE_JPEG_QUALITY); cmpr_c.push_back(28); int wcmpr; wcmpr = 0; vector vidbuffer; vector recvidbuf(20000); bufbuf buffer; bufbuf inbuff; int iswin[maxsock]; int i; char wnam[maxsock][20]; int pos; unsigned char c; for (i = 0; i < maxsock; i++) { iswin[i] = 0; sprintf( wnam[i], "ID%d", i ); } fd_set initfd, readfd; FD_ZERO( &initfd ); FD_SET( sock, &initfd ); TIMEVAL tv; int allowsend; allowsend = 1; //Sleep(200); namedWindow("its me",1); for(;;) { //BASS_ChannelGetData( rec, bassbuf, 50000 ); if (allowsend == 1) { allowsend = 0; cap >> sframe; switch( wcmpr ) { case 0: wcmpr = 1; imencode( "a.jpg", sframe, vidbuffer, cmpr_a ); break; case 1: wcmpr = 2; imencode( "a.jpg", sframe, vidbuffer, cmpr_b ); break; case 2: wcmpr = 0; imencode( "a.jpg", sframe, vidbuffer, cmpr_c ); break; } //buffer.a = BASS_ChannelGetData( enc, buffer.snd, 34000 ); //cout << dpos << endl; buffer.a = dpos; memcpy( buffer.snd, dbuf, dpos ); dpos = 0; if (buffer.a <= 0) buffer.a = 1; //BASS_ChannelGetData( enc, buffer.snd, buffer.a ); buffer.b = vidbuffer.size(); memcpy( buffer.vid, vidbuffer.data(), buffer.b ); send( sock, (char*)&buffer.a, 4, 0 ); send( sock, (char*)buffer.snd, buffer.a, 0 ); send( sock, (char*)&buffer.b, 4, 0 ); send( sock, (char*)buffer.vid, buffer.b, 0 ); } for(;;) { tv.tv_sec = 0; tv.tv_usec = 20000; readfd = initfd; select( 0, &readfd, 0, 0, &tv ); if (!FD_ISSET( sock, &readfd )) break; rc = recv( sock, (char*)&c, 1, 0 ); if (rc <= 0) break; if (c == 250) { allowsend = 1; continue; } rc = recv( sock, (char*)&inbuff.a, 4, 0 ); if (rc <= 0) break; pos = 0; while(1) { rc = recv( sock, (char*)&inbuff.snd[pos], inbuff.a-pos, 0 ); if (rc <= 0) break; pos += rc; if (pos >= inbuff.a) break; } if (rc <= 0) break; rc = recv( sock, (char*)&inbuff.b, 4, 0 ); if (rc <= 0) break; pos = 0; while(1) { rc = recv( sock, (char*)&inbuff.vid[pos], inbuff.b-pos, 0 ); if (rc <= 0) break; pos += rc; if (pos >= inbuff.b) break; } if (rc <= 0) break; i = (int)c; if (iswin[i] == 0) { iswin[i] = 1; namedWindow(wnam[i], 1); startpos[i] = 0; memcpy( startbuf[i], inbuff.snd, inbuff.a ); hstr[i] = BASS_StreamCreateFileUser( STREAMFILE_BUFFERPUSH, 0, &fileprocs, (void*)i ); BASS_ChannelPlay( hstr[i], 0 ); } if (inbuff.a > 1) BASS_StreamPutFileData( hstr[i], inbuff.snd, inbuff.a ); recvidbuf.resize( inbuff.b ); memcpy( recvidbuf.data(), inbuff.vid, inbuff.b ); imdecode( recvidbuf, CV_LOAD_IMAGE_COLOR, &dframe ); imshow(wnam[i], dframe); } //imdecode( buffer, CV_LOAD_IMAGE_COLOR, &dframe ); imshow("its me", sframe); if(waitKey(30) >= 0) break; } return 0; }