From 55fbcbc222cd03d14da3b244271d872af1a535d6 Mon Sep 17 00:00:00 2001 From: Ivan Borisenko Date: Fri, 16 May 2014 00:00:31 +0400 Subject: [PATCH] Windows version experimenting --- win/capture_video_win32.cpp | 23 ++- win/device.h | 1 + win/dsound_audiostream.cpp | 2 +- win/streamsrv.cpp | 344 ++++++++++++++++++------------------ 4 files changed, 192 insertions(+), 178 deletions(-) diff --git a/win/capture_video_win32.cpp b/win/capture_video_win32.cpp index f7b5d1a..b3054b2 100755 --- a/win/capture_video_win32.cpp +++ b/win/capture_video_win32.cpp @@ -65,11 +65,11 @@ const VIDEO_STREAM_RESOLUTION modes[] = { #define SHOW_STATS //# define BYPASS # define YUV_BILINEAR -# define CODEC_FPS 3 +# define CODEC_FPS 30 //# define DROP_30_TO_25 99999999// 6 // show first 1 in DROP_30_TO_3 frames -# define DROP_30_TO_3 10 //10 +//# define DROP_30_TO_3 10 //10 //# define MAXFRAME 5000 //(1480-28) //# define DROPFRAMEBEFORE 107 //# define DROPFRAMESHOW 7 @@ -81,13 +81,15 @@ const VIDEO_STREAM_RESOLUTION modes[] = { // soft mtu //# define MTU_PROFILE // 64k (up to 120k) // hard mtu -//# define MTU_HI_PROFILE +// # define MTU_HI_PROFILE + +# define HI_Q_W_320 // soft gprs //# define GPRS_PROFILE // 30k (up to 50) // hard gprs, needs 3 FPS -# define MTU_LO_PROFILE +//# define MTU_LO_PROFILE //# define USE_THEORA 1 // 16k @@ -103,6 +105,17 @@ const VIDEO_STREAM_RESOLUTION modes[] = { // VBR!!! # endif +# ifdef HI_Q_W_320 // 640x480 hi-q +# define FRAME_RESOLUTION_NUMBER 6 +# define VP8_QP_MAX 31 +# define VP8_QP_MIN 1 +# define VP8_KBITS_PER_SEC 4000///350 //700 +//# define VP8_CPU_USE -3 +# define VP8_CPU_USE -15 +//# define MAX_KEYFRAME_DIST 999999 +// VBR!!! +# endif + // soft mtu mode, 90k # ifdef MTU_PROFILE // 240x144 1400 bytes max packet # define FRAME_RESOLUTION_NUMBER 3 @@ -445,7 +458,7 @@ unsigned int __stdcall RenderThread(void*) if(pcktsiz>MAXFRAME) { // drop packet - packetToDecode = &emptyPacket; + //packetToDecode = &emptyPacket; encPacket = 0; vp8compressedSize = 0; if(firstTime) diff --git a/win/device.h b/win/device.h index ed6deb4..794b917 100755 --- a/win/device.h +++ b/win/device.h @@ -73,6 +73,7 @@ class IDevice; class IDeviceInfo; +class IDeviceSupply; enum EOnOffBehavior { diff --git a/win/dsound_audiostream.cpp b/win/dsound_audiostream.cpp index 36d41fd..5abb3a0 100755 --- a/win/dsound_audiostream.cpp +++ b/win/dsound_audiostream.cpp @@ -1,4 +1,4 @@ -# include "audiostream.h" +# include "audio_capture.h" # define INITGUID # include # pragma comment(lib, "dsound") diff --git a/win/streamsrv.cpp b/win/streamsrv.cpp index 1058f47..f486d47 100755 --- a/win/streamsrv.cpp +++ b/win/streamsrv.cpp @@ -1,92 +1,92 @@ -# include - -extern "C" -{ -# include "./../thirdparty/codec2/src/codec2.h" -# include "./../thirdparty/opus/include/opus.h" -# include "./../thirdparty/oslec/spandsp-0.0.3/src/msvc/inttypes.h" -} - -# include "audiostream.h" -# include -# include - - -# pragma comment(lib, "ws2_32") - -void StartVideoCapture(); -void CaptureAudio(); - -extern int compressedVideoWidth; -extern int compressedVideoHeight;// = compressedVideoWidth * 9 / 16 / 16 * 16; - -// ��������: -// 1. ���� ���� ���������� IPv6, �� ���� ����������� ��������, -// NAT �� ����� ������. ����� ������ IPv6 �� IPv6 ��������� �� �����. -// �� ��� ��� �������� ����� �����������, � ������� ���� ������������ -// (������, � �������, ��������� ����), �� IPv6 ������� ����� � ������ -// � ����� ����������������� ��������� ����������� �������. -// ���������� ��������� ���, � ������� IPv4 ����� �� ������������. -// ����� ������ ����� �����: -// OS6, LAN6, INET6 - -// �� ����������� IPv6: -// OS4, LAN4, INET4_NAT_REVERSE, INET4_NAT_STABLE, INET4 - -// ���� ���� IPv4, �� ��� ��������� �� IPv6, �� IPv6 ����� ������ ������������, -// �.�., LAN4 - ������� IPv4, ���� ���� ���� ��� � IPv6. -// LAN6 - ������ IPv6, ����� IPv4 �� ��������� ������. -// ����� ������ �����: -// OS4, LAN4, LAN6, INET4_NAT_REVERSE, INET4_NAT_STABLE, INET4, INET6, INET46 - -# if 0 -// ������������� ������� ��������, "������� �����������" -enum ServerLevel -{ - // ������� �������� �����������, ���� �� ��� ��������� ��� ���������. - // ����� �������������� ��� �������� ����� �� ���������� � ����������� ����������, - // ��������, ����������� � ����������. - // ��������� ����� �� IPv6 � IPv4. - SL_OS = 2, - - // ��������� ���� ���������� � �� �� ����������� �����. - // ��� ��� ����� ���� ��������� ������� ��������� � �� ����� �� ��� ����� ���� ������ - // IPv4, � �� ������ - IPv6, � ��������� ������ ����������� ����� �������� - // �� ����������������. - // ��������� �� ������ ����� �� �������� �� ������ ������� ��������. - // ��������� ������� ����� ��������� IP-������� (� �������) - // ��� ������� �� ��������� ����. - SL_LAN = 3, - - // ������� ����������� � ��������� ����� NAT, �� ��� ������ �� �������� - // �� ����� - ������� ���� �� ����� ��������. - // ��� ������ ����� �������� ������ ����� ������ ����, ��������� ��� �������, - // ��� � ��������. ��������� ������ ����� �������� � ���� ������� ������, - // �, ����� ������ ����� ������������, �� �� ������� ����� ������� - // ���������� � ����, � ��������� ������, ������� ��� ����������, - // ��� ����������� � �������. ��� ����������������� ����� �����������, - // ����� � ������� ��� ������� ������� SL_I4_NAT � ����. - SL_I4_REVERSE = 4, - - // �������� �������� �� "��������" IP-������. �� ����� �������� ��� ������, - // ��� ��� ������� ���� �� ��������. ��� ��� ����������� ��������� STUN-�������� - // ������������ ������ IPv4, ������ �� NAT'�� ����� �������������, ��� � ��� ������� - // IPv4-����� ������. �� ����� ��������, ����� � ��� ��������� ����. - SL_I4_NAT = 4, - - // Real external IP-address. IPv6 only. - SL_I6_REAL = , - - // Real external IP-address. IPv4 only. - SL_I4_REAL = , - - // Real external IP-address. Both IPv4 and IPv6. - SL_I46_REAL = 5 -}; -# endif - -void DetermineExternalAddress() -{ +# include + +extern "C" +{ +# include "./../thirdparty/codec2/src/codec2.h" +# include "./../thirdparty/opus/include/opus.h" +# include "./../thirdparty/oslec/spandsp-0.0.3/src/msvc/inttypes.h" +} + +# include "audio_capture.h" +# include +# include + + +# pragma comment(lib, "ws2_32") + +void StartVideoCapture(); +void CaptureAudio(); + +extern int compressedVideoWidth; +extern int compressedVideoHeight;// = compressedVideoWidth * 9 / 16 / 16 * 16; + +// ��������: +// 1. ���� ���� ���������� IPv6, �� ���� ����������� ��������, +// NAT �� ����� ������. ����� ������ IPv6 �� IPv6 ��������� �� �����. +// �� ��� ��� �������� ����� �����������, � ������� ���� ������������ +// (������, � �������, ��������� ����), �� IPv6 ������� ����� � ������ +// � ����� ����������������� ��������� ����������� �������. +// ���������� ��������� ���, � ������� IPv4 ����� �� ������������. +// ����� ������ ����� �����: +// OS6, LAN6, INET6 + +// �� ����������� IPv6: +// OS4, LAN4, INET4_NAT_REVERSE, INET4_NAT_STABLE, INET4 + +// ���� ���� IPv4, �� ��� ��������� �� IPv6, �� IPv6 ����� ������ ������������, +// �.�., LAN4 - ������� IPv4, ���� ���� ���� ��� � IPv6. +// LAN6 - ������ IPv6, ����� IPv4 �� ��������� ������. +// ����� ������ �����: +// OS4, LAN4, LAN6, INET4_NAT_REVERSE, INET4_NAT_STABLE, INET4, INET6, INET46 + +# if 0 +// ������������� ������� ��������, "������� �����������" +enum ServerLevel +{ + // ������� �������� �����������, ���� �� ��� ��������� ��� ���������. + // ����� �������������� ��� �������� ����� �� ���������� � ����������� ����������, + // ��������, ����������� � ����������. + // ��������� ����� �� IPv6 � IPv4. + SL_OS = 2, + + // ��������� ���� ���������� � �� �� ����������� �����. + // ��� ��� ����� ���� ��������� ������� ��������� � �� ����� �� ��� ����� ���� ������ + // IPv4, � �� ������ - IPv6, � ��������� ������ ����������� ����� �������� + // �� ����������������. + // ��������� �� ������ ����� �� �������� �� ������ ������� ��������. + // ��������� ������� ����� ��������� IP-������� (� �������) + // ��� ������� �� ��������� ����. + SL_LAN = 3, + + // ������� ����������� � ��������� ����� NAT, �� ��� ������ �� �������� + // �� ����� - ������� ���� �� ����� ��������. + // ��� ������ ����� �������� ������ ����� ������ ����, ��������� ��� �������, + // ��� � ��������. ��������� ������ ����� �������� � ���� ������� ������, + // �, ����� ������ ����� ������������, �� �� ������� ����� ������� + // ���������� � ����, � ��������� ������, ������� ��� ����������, + // ��� ����������� � �������. ��� ����������������� ����� �����������, + // ����� � ������� ��� ������� ������� SL_I4_NAT � ����. + SL_I4_REVERSE = 4, + + // �������� �������� �� "��������" IP-������. �� ����� �������� ��� ������, + // ��� ��� ������� ���� �� ��������. ��� ��� ����������� ��������� STUN-�������� + // ������������ ������ IPv4, ������ �� NAT'�� ����� �������������, ��� � ��� ������� + // IPv4-����� ������. �� ����� ��������, ����� � ��� ��������� ����. + SL_I4_NAT = 4, + + // Real external IP-address. IPv6 only. + SL_I6_REAL = , + + // Real external IP-address. IPv4 only. + SL_I4_REAL = , + + // Real external IP-address. Both IPv4 and IPv6. + SL_I46_REAL = 5 +}; +# endif + +void DetermineExternalAddress() +{ WSADATA data = {0}; ::WSAStartup(MAKEWORD(2, 2), & data ); @@ -96,95 +96,95 @@ void DetermineExternalAddress() cltAddr.sin_family = AF_INET; cltAddr.sin_port = htons(5555); - bind(sock, (struct sockaddr *)&cltAddr, sizeof(cltAddr)); - + bind(sock, (struct sockaddr *)&cltAddr, sizeof(cltAddr)); + sockaddr_in serverAddr = {0}; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.S_un.S_addr = inet_addr("212.79.111.155"); //serverAddr.sin_addr.S_un.S_addr = inet_addr("173.194.69.127"); //serverAddr.sin_addr.S_un.S_addr = inet_addr("74.125.23.127"); - serverAddr.sin_port = htons(3478); - //serverAddr.sin_port = htons(19302); - -# pragma pack(push,1) - struct StunRequest - { - uint16_t msgType; - uint16_t payloadLen; - uint32_t magic; - uint8_t transaction[12]; - }; -# pragma pack(pop) - - StunRequest r = {0}; - r.msgType = 0x0100; - r.payloadLen = 0; - r.magic = 0x42A41221; - r.transaction[0] = 5; - r.transaction[5] = 7; - - int sentBytes = sendto(sock, (char*)&r, sizeof(r), 0, - (sockaddr*)&serverAddr, sizeof(serverAddr)); - - char recvBuffer[ 1280 ] = {0}; - + serverAddr.sin_port = htons(3478); + //serverAddr.sin_port = htons(19302); + +# pragma pack(push,1) + struct StunRequest + { + uint16_t msgType; + uint16_t payloadLen; + uint32_t magic; + uint8_t transaction[12]; + }; +# pragma pack(pop) + + StunRequest r = {0}; + r.msgType = 0x0100; + r.payloadLen = 0; + r.magic = 0x42A41221; + r.transaction[0] = 5; + r.transaction[5] = 7; + + int sentBytes = sendto(sock, (char*)&r, sizeof(r), 0, + (sockaddr*)&serverAddr, sizeof(serverAddr)); + + char recvBuffer[ 1280 ] = {0}; + sockaddr_in from = {0}; int fromLen = sizeof(from); int nrecvd = recvfrom(sock, recvBuffer, sizeof(recvBuffer), - 0, (sockaddr*)&from, &fromLen); - - uint16_t externalPort = ntohs(*((uint16_t*)&recvBuffer[26])) ^ 0x2112; - uint32_t externalIp = ntohl(*((uint32_t*)&recvBuffer[28])) ^ 0x2112A442; - - StunRequest* response = (StunRequest*)recvBuffer; - -} - - -int WINAPI wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) -//int main() -{ - // Max. bitrate: 512000 for audio, 20 000 000 for video. - // ~30 MBit/s - - //DetermineExternalAddress(); - - CaptureAudio(); - - short bufIn[320]; - - - /////////////////// - // OPUS (SILK+CELT) - int err = 0; - OpusEncoder* opus = opus_encoder_create(8000, 1, - OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err);//OPUS_APPLICATION_VOIP, &err); - - int ok = opus_encoder_ctl(opus, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); - ok = opus_encoder_ctl(opus, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); - ok = opus_encoder_ctl(opus, OPUS_SET_PACKET_LOSS_PERC(50)); - ok = opus_encoder_ctl(opus, OPUS_SET_INBAND_FEC(1)); - ok = opus_encoder_ctl(opus, OPUS_SET_DTX(1)); - ok = opus_encoder_ctl(opus, OPUS_SET_PREDICTION_DISABLED(1)); - ok = opus_encoder_ctl(opus, OPUS_SET_VBR(0)); - ok = opus_encoder_ctl(opus, OPUS_SET_BITRATE(60000));//6144)); - ok = opus_encoder_ctl(opus, OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_2_5_MS)); - - unsigned char encodedOpus[1024] = {0}; - int result = opus_encode(opus, bufIn, 320, encodedOpus, sizeof(encodedOpus)); - - /////////// - // CODEC2 - - struct CODEC2* ctxt = codec2_create(CODEC2_MODE_1200); - int codec2_1200_samplesPerFrame = codec2_samples_per_frame(ctxt); - - int bits = codec2_bits_per_frame(ctxt); - - unsigned char encoded[6] = {0}; - codec2_encode(ctxt, encoded, bufIn); - - StartVideoCapture(); - - return 0; + 0, (sockaddr*)&from, &fromLen); + + uint16_t externalPort = ntohs(*((uint16_t*)&recvBuffer[26])) ^ 0x2112; + uint32_t externalIp = ntohl(*((uint32_t*)&recvBuffer[28])) ^ 0x2112A442; + + StunRequest* response = (StunRequest*)recvBuffer; + +} + + +int WINAPI wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) +//int main() +{ + // Max. bitrate: 512000 for audio, 20 000 000 for video. + // ~30 MBit/s + + //DetermineExternalAddress(); + + // CaptureAudio(); + + short bufIn[320]; + + + /////////////////// + // OPUS (SILK+CELT) + int err = 0; + OpusEncoder* opus = opus_encoder_create(8000, 1, + OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err);//OPUS_APPLICATION_VOIP, &err); + + int ok = opus_encoder_ctl(opus, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + ok = opus_encoder_ctl(opus, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + ok = opus_encoder_ctl(opus, OPUS_SET_PACKET_LOSS_PERC(50)); + ok = opus_encoder_ctl(opus, OPUS_SET_INBAND_FEC(1)); + ok = opus_encoder_ctl(opus, OPUS_SET_DTX(1)); + ok = opus_encoder_ctl(opus, OPUS_SET_PREDICTION_DISABLED(1)); + ok = opus_encoder_ctl(opus, OPUS_SET_VBR(0)); + ok = opus_encoder_ctl(opus, OPUS_SET_BITRATE(60000));//6144)); + ok = opus_encoder_ctl(opus, OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_2_5_MS)); + + unsigned char encodedOpus[1024] = {0}; + int result = opus_encode(opus, bufIn, 320, encodedOpus, sizeof(encodedOpus)); + + /////////// + // CODEC2 + + struct CODEC2* ctxt = codec2_create(CODEC2_MODE_1200); + int codec2_1200_samplesPerFrame = codec2_samples_per_frame(ctxt); + + int bits = codec2_bits_per_frame(ctxt); + + unsigned char encoded[6] = {0}; + codec2_encode(ctxt, encoded, bufIn); + + StartVideoCapture(); + + return 0; } \ No newline at end of file