// // SimpleCocoaGUIAppDelegate.m // #import "SimpleCocoaGUIAppDelegate.h" @implementation SimpleCocoaGUIAppDelegate @synthesize window = _window; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // [self initializeVariables]; [self createUI]; // [self initViECocoaTest]; // [self NSLogVideoCodecs]; // [self startViECocoaTest]; // [self startLoopback]; [self ioLooback]; } -(void)createUI{ NSRect outWindow1Frame = NSMakeRect(200, 200, 200, 200); NSWindow* outWindow1 = [[NSWindow alloc] initWithContentRect:outWindow1Frame styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]; [outWindow1 orderOut:nil]; NSRect vieAutotestCocoaRenderView1Frame = NSMakeRect(0, 0, 200, 200); _vieCocoaRenderView1 = [[ViECocoaRenderView alloc] initWithFrame:vieAutotestCocoaRenderView1Frame]; [[outWindow1 contentView] addSubview:_vieCocoaRenderView1]; [outWindow1 setTitle:[NSString stringWithFormat:@"window1"]]; [outWindow1 makeKeyAndOrderFront:NSApp]; NSRect outWindow2Frame = NSMakeRect(400, 200, 200, 200); NSWindow* outWindow2 = [[NSWindow alloc] initWithContentRect:outWindow2Frame styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]; [outWindow2 orderOut:nil]; NSRect vieAutotestCocoaRenderView2Frame = NSMakeRect(0, 0, 200, 200); _vieCocoaRenderView2 = [[ViECocoaRenderView alloc] initWithFrame:vieAutotestCocoaRenderView2Frame]; [[outWindow2 contentView] addSubview:_vieCocoaRenderView2]; [outWindow2 setTitle:[NSString stringWithFormat:@"window2"]]; [outWindow2 makeKeyAndOrderFront:NSApp]; } -(void)initViECocoaTest{ int _error = 0; _ptrViE = VideoEngine::Create(); _ptrViEBase = ViEBase::GetInterface(_ptrViE); _error = _ptrViEBase->Init(); _ptrViECapture = ViECapture::GetInterface(_ptrViE); _ptrViERender = ViERender::GetInterface(_ptrViE); _ptrViECodec = ViECodec::GetInterface(_ptrViE); _ptrViENetwork = ViENetwork::GetInterface(_ptrViE); _error = _ptrViE->SetTraceFile("ViEBaseStandardTest.txt"); _error = _ptrViE->SetEncryptedTraceFile("ViEBaseStandardTestEncrypted.txt"); } -(void)initializeVariables{ _fullScreen = YES; } -(void)NSLogVideoCodecs{ NSLog(@"Searching for video codecs....."); VideoCodec videoCodec; memset(&videoCodec, 0, sizeof(VideoCodec)); for(int index = 0; index < _ptrViECodec->NumberOfCodecs(); index++) { ViE_TEST(_ptrViECodec->GetCodec(index, videoCodec)); NSLog(@"Video codec found: %s", videoCodec.plName); } } -(void)startViECocoaTest{ int error=0; char deviceName[128]; char deviceUniqueName[512]; int captureId = 0; int dummy = 0; //ViE_TEST(_ptrViEBase->CreateChannel(_videoChannel)); //ViE_TEST(_ptrViECapture->GetCaptureDevice(0,deviceName,sizeof(deviceName),deviceUniqueName,sizeof(deviceUniqueName))); //ViE_TEST(_ptrViECapture->AllocateCaptureDevice(deviceUniqueName,sizeof(deviceUniqueName),captureId)); //ViE_TEST(_ptrViECapture->AllocateCaptureDevice("dummydevicethatdoesnotexist",sizeof(deviceUniqueName),dummy)); char captureDeviceName[V_DEVICE_NAME_LENGTH] = ""; char captureDeviceUniqueId[V_DEVICE_NAME_LENGTH] = ""; int captureDeviceId = 0; ViE_TEST(_ptrViE->SetTraceFilter(webrtc::TR_ALL)); ViE_TEST(_ptrViE->SetTraceFile("ViECocoaTrace.txt")); ViE_TEST(_ptrViE->SetEncryptedTraceFile("ViECocoaEncryptedTrace.txt")); // base ViE_TEST(_ptrViEBase->CreateChannel(_videoChannel)); // capture device ViE_TEST(_ptrViECapture->GetCaptureDevice(V_CAPTURE_DEVICE_INDEX, captureDeviceName, V_DEVICE_NAME_LENGTH, captureDeviceUniqueId, V_DEVICE_NAME_LENGTH)); ViE_TEST(_ptrViECapture->AllocateCaptureDevice(captureDeviceUniqueId, V_DEVICE_NAME_LENGTH, captureDeviceId)); ViE_TEST(_ptrViECapture->ConnectCaptureDevice(captureDeviceId, _videoChannel)); ViE_TEST(_ptrViECapture->StartCapture(captureDeviceId)); // renderer ViE_TEST(_ptrViERender->AddRenderer(captureDeviceId, (void*)_vieCocoaRenderView1, 0, 0.0, 0.0, 1.0, 1.0)); ViE_TEST(_ptrViERender->StartRender(captureDeviceId)); // usleep(3 * 1000); // ViE_TEST(_ptrViERender->RemoveRenderer(captureDeviceId)); //exit(0); // // codec // [self NSLogVideoCodecs]; // VideoCodec videoCodec; // memset(&videoCodec, 0, sizeof(VideoCodec)); // ViE_TEST(_ptrViECodec->GetCodec(V_CODEC_INDEX, videoCodec)); // ViE_TEST(_ptrViECodec->SetReceiveCodec(_videoChannel, videoCodec)); // ViE_TEST(_ptrViECodec->SetSendCodec(_videoChannel, videoCodec)); // // // network + base // ViE_TEST(_ptrViENetwork->SetLocalReceiver(_videoChannel, V_RTP_PORT)); // ViE_TEST(_ptrViEBase->StartReceive(_videoChannel)); // ViE_TEST(_ptrViENetwork->SetSendDestination(_videoChannel, V_IP_ADDRESS, V_RTP_PORT)); // ViE_TEST(_ptrViEBase->StartSend(_videoChannel)); // ViE_TEST(_ptrViERender->MirrorRenderStream(captureDeviceId, true, false, true)); } -(int)initLoopback { } -(int)startLoopback { //******************************************************** // Begin create/initialize Video Engine for testing //******************************************************** int error = 0; bool succeeded = true; int numberOfErrors = 0; std::string str; // // Create a VideoEngine instance // // VideoEngine* ptrViE = NULL; ptrViE = VideoEngine::Create(); if (ptrViE == NULL) { printf("ERROR in VideoEngine::Create\n"); return -1; } error = ptrViE->SetTraceFilter(webrtc::TR_ALL); if (error == -1) { printf("ERROR in VideoEngine::SetTraceLevel\n"); return -1; } error = ptrViE->SetTraceFile("ViETrace.txt"); if (error == -1) { printf("ERROR in VideoEngine::SetTraceFile\n"); return -1; } error = ptrViE->SetEncryptedTraceFile("ViEEncryptedTrace.txt"); if (error == -1) { printf("ERROR in VideoEngine::SetEncryptedTraceFile\n"); return -1; } // // Init VideoEngine and create a channel // ptrViEBase = ViEBase::GetInterface(ptrViE); if (ptrViEBase == NULL) { printf("ERROR in ViEBase::GetInterface\n"); return -1; } error = ptrViEBase->Init(); if (error == -1) { printf("ERROR in ViEBase::Init\n"); return -1; } int videoChannel = -1; error = ptrViEBase->CreateChannel(_videoChannel); if (error == -1) { printf("ERROR in ViEBase::CreateChannel\n"); return -1; } // // List available capture devices, allocate and connect. // ptrViECapture = ViECapture::GetInterface(ptrViE); if (ptrViEBase == NULL) { printf("ERROR in ViECapture::GetInterface\n"); return -1; } const unsigned int KMaxDeviceNameLength = 128; const unsigned int KMaxUniqueIdLength = 256; char deviceName[KMaxDeviceNameLength]; memset(deviceName, 0, KMaxDeviceNameLength); char uniqueId[KMaxUniqueIdLength]; memset(uniqueId, 0, KMaxUniqueIdLength); std::cout << std::endl; std::cout << "Available capture devices:" << std::endl; unsigned int captureIdx = 0; for (captureIdx = 0; captureIdx < ptrViECapture->NumberOfCaptureDevices(); captureIdx++) { memset(deviceName, 0, KMaxDeviceNameLength); memset(uniqueId, 0, KMaxUniqueIdLength); error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, KMaxDeviceNameLength, uniqueId, KMaxUniqueIdLength); if (error == -1) { printf("ERROR in ViECapture::GetCaptureDevice\n"); return -1; } std::cout << " " << captureIdx+1 << ". " << deviceName << std::endl; } std::cout << std::endl; std::cout << "Choose capture devices: "; // std::getline(std::cin, str); // captureIdx = atoi(str.c_str()) - 1; captureIdx = 0; error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, KMaxDeviceNameLength, uniqueId, KMaxUniqueIdLength); if (error == -1) { printf("ERROR in ViECapture::GetCaptureDevice\n"); return -1; } _captureId = 0; error = ptrViECapture->AllocateCaptureDevice(uniqueId, KMaxUniqueIdLength, _captureId); if (error == -1) { printf("ERROR in ViECapture::AllocateCaptureDevice\n"); return -1; } error = ptrViECapture->ConnectCaptureDevice(_captureId, _videoChannel); if (error == -1) { printf("ERROR in ViECapture::ConnectCaptureDevice\n"); return -1; } error = ptrViECapture->StartCapture(_captureId); if (error == -1) { printf("ERROR in ViECapture::StartCapture\n"); return -1; } // // RTP/RTCP settings // ptrViERtpRtcp = ViERTP_RTCP::GetInterface(ptrViE); if (ptrViERtpRtcp == NULL) { printf("ERROR in ViERTP_RTCP::GetInterface\n"); return -1; } error = ptrViERtpRtcp->SetRTCPStatus(_videoChannel, kRtcpCompound_RFC4585); if (error == -1) { printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n"); return -1; } error = ptrViERtpRtcp->SetKeyFrameRequestMethod(_videoChannel, kViEKeyFrameRequestPliRtcp); if (error == -1) { printf("ERROR in ViERTP_RTCP::SetKeyFrameRequestMethod\n"); return -1; } error = ptrViERtpRtcp->SetTMMBRStatus(_videoChannel, true); if (error == -1) { printf("ERROR in ViERTP_RTCP::SetTMMBRStatus\n"); return -1; } // // Set up rendering // ptrViERender = ViERender::GetInterface(ptrViE); if (ptrViERender == NULL) { printf("ERROR in ViERender::GetInterface\n"); return -1; } error = ptrViERender->AddRenderer(_captureId, _vieCocoaRenderView1, 0, 0.0, 0.0, 1.0, 1.0); if (error == -1) { printf("ERROR in ViERender::AddRenderer\n"); return -1; } error = ptrViERender->StartRender(_captureId); if (error == -1) { printf("ERROR in ViERender::StartRender\n"); return -1; } error = ptrViERender->AddRenderer(_videoChannel, _vieCocoaRenderView2, 1, 0.0, 0.0, 1.0, 1.0); if (error == -1) { printf("ERROR in ViERender::AddRenderer\n"); return -1; } error = ptrViERender->StartRender(_videoChannel); if (error == -1) { printf("ERROR in ViERender::StartRender\n"); return -1; } // // Setup codecs // ptrViECodec = ViECodec::GetInterface(ptrViE); if (ptrViECodec == NULL) { printf("ERROR in ViECodec::GetInterface\n"); return -1; } std::cout << std::endl; std::cout << "Available codecs:" << std::endl; // Check available codecs and prepare receive codecs VideoCodec videoCodec; memset(&videoCodec, 0, sizeof(VideoCodec)); unsigned int codecIdx = 0; for (codecIdx = 0; codecIdx < ptrViECodec->NumberOfCodecs(); codecIdx++) { error = ptrViECodec->GetCodec(codecIdx, videoCodec); if (error == -1) { printf("ERROR in ViECodec::GetCodec\n"); return -1; } error = ptrViECodec->SetReceiveCodec(_videoChannel, videoCodec); if (error == -1) { printf("ERROR in ViECodec::SetReceiveCodec\n"); return -1; } if (videoCodec.codecType != kVideoCodecRED && videoCodec.codecType != kVideoCodecULPFEC) { std::cout << " " << codecIdx+1 << ". " << videoCodec.plName << std::endl; } } // std::cout << std::endl; // std::cout << "Choose codec: "; // std::getline(std::cin, str); // codecIdx = atoi(str.c_str()) - 1; codecIdx = 0; error = ptrViECodec->GetCodec(codecIdx, videoCodec); if (error == -1) { printf("ERROR in ViECodec::GetCodec\n"); return -1; } error = ptrViECodec->SetSendCodec(_videoChannel, videoCodec); if (error == -1) { printf("ERROR in ViECodec::SetSendCodec\n"); return -1; } // // Address settings // ptrViENetwork = ViENetwork::GetInterface(ptrViE); if (ptrViENetwork == NULL) { printf("ERROR in ViENetwork::GetInterface\n"); return -1; } const char* ipAddress = "127.0.0.1"; const unsigned short rtpPort = 6000; error = ptrViENetwork->SetLocalReceiver(_videoChannel, rtpPort); if (error == -1) { printf("ERROR in ViENetwork::SetLocalReceiver\n"); return -1; } error = ptrViEBase->StartReceive(_videoChannel); if (error == -1) { printf("ERROR in ViENetwork::StartReceive\n"); return -1; } error = ptrViENetwork->SetSendDestination(_videoChannel, ipAddress, rtpPort); if (error == -1) { printf("ERROR in ViENetwork::SetSendDestination\n"); return -1; } error = ptrViEBase->StartSend(_videoChannel); if (error == -1) { printf("ERROR in ViENetwork::StartSend\n"); return -1; } //******************************************************** // Engine started //******************************************************** // Call started std::cout << std::endl; std::cout << "Loopback call started" << std::endl; // std::cout << std::endl << std::endl; // std::cout << "Press enter to stop..."; // std::getline(std::cin, str); } -(int)stopLooback { int error = 0; //******************************************************** // Testing finished. Tear down Video Engine //******************************************************** error = ptrViEBase->StopReceive(_videoChannel); if (error == -1) { printf("ERROR in ViEBase::StopReceive\n"); return -1; } error = ptrViEBase->StopSend(_videoChannel); if (error == -1) { printf("ERROR in ViEBase::StopSend\n"); return -1; } error = ptrViERender->StopRender(_captureId); if (error == -1) { printf("ERROR in ViERender::StopRender\n"); return -1; } error = ptrViERender->RemoveRenderer(_captureId); if (error == -1) { printf("ERROR in ViERender::RemoveRenderer\n"); return -1; } error = ptrViERender->StopRender(_videoChannel); if (error == -1) { printf("ERROR in ViERender::StopRender\n"); return -1; } error = ptrViERender->RemoveRenderer(_videoChannel); if (error == -1) { printf("ERROR in ViERender::RemoveRenderer\n"); return -1; } error = ptrViECapture->StopCapture(_captureId); if (error == -1) { printf("ERROR in ViECapture::StopCapture\n"); return -1; } error = ptrViECapture->DisconnectCaptureDevice(_videoChannel); if (error == -1) { printf("ERROR in ViECapture::DisconnectCaptureDevice\n"); return -1; } error = ptrViECapture->ReleaseCaptureDevice(_captureId); if (error == -1) { printf("ERROR in ViECapture::ReleaseCaptureDevice\n"); return -1; } error = ptrViEBase->DeleteChannel(_videoChannel); if (error == -1) { printf("ERROR in ViEBase::DeleteChannel\n"); return -1; } int remainingInterfaces = 0; remainingInterfaces = ptrViECodec->Release(); remainingInterfaces += ptrViECapture->Release(); remainingInterfaces += ptrViERtpRtcp->Release(); remainingInterfaces += ptrViERender->Release(); remainingInterfaces += ptrViENetwork->Release(); remainingInterfaces += ptrViEBase->Release(); if (remainingInterfaces > 0) { printf("ERROR: Could not release all interfaces\n"); return -1; } bool deleted = VideoEngine::Delete(ptrViE); if (deleted == false) { printf("ERROR in VideoEngine::Delete\n"); return -1; } return 0; // =================================================================== // // END: VideoEngine 3.0 Sample Code // // =================================================================== } -(int)ioLooback { //******************************************************** // Begin create/initialize Video Engine for testing //******************************************************** int error = 0; bool succeeded = true; int numberOfErrors = 0; std::string str; // // Create a VideoEngine instance // VideoEngine* ptrViE = NULL; ptrViE = VideoEngine::Create(); if (ptrViE == NULL) { printf("ERROR in VideoEngine::Create\n"); return -1; } error = ptrViE->SetTraceFilter(webrtc::TR_ALL); if (error == -1) { printf("ERROR in VideoEngine::SetTraceLevel\n"); return -1; } error = ptrViE->SetTraceFile("ViETrace.txt"); if (error == -1) { printf("ERROR in VideoEngine::SetTraceFile\n"); return -1; } error = ptrViE->SetEncryptedTraceFile("ViEEncryptedTrace.txt"); if (error == -1) { printf("ERROR in VideoEngine::SetEncryptedTraceFile\n"); return -1; } // // Init VideoEngine and create a channel // ViEBase* ptrViEBase = ViEBase::GetInterface(ptrViE); if (ptrViEBase == NULL) { printf("ERROR in ViEBase::GetInterface\n"); return -1; } error = ptrViEBase->Init(); if (error == -1) { printf("ERROR in ViEBase::Init\n"); return -1; } int videoChannel = -1; error = ptrViEBase->CreateChannel(videoChannel); if (error == -1) { printf("ERROR in ViEBase::CreateChannel\n"); return -1; } // // List available capture devices, allocate and connect. // ViECapture* ptrViECapture = ViECapture::GetInterface(ptrViE); if (ptrViEBase == NULL) { printf("ERROR in ViECapture::GetInterface\n"); return -1; } const unsigned int KMaxDeviceNameLength = 128; const unsigned int KMaxUniqueIdLength = 256; char deviceName[KMaxDeviceNameLength]; memset(deviceName, 0, KMaxDeviceNameLength); char uniqueId[KMaxUniqueIdLength]; memset(uniqueId, 0, KMaxUniqueIdLength); std::cout << std::endl; std::cout << "Available capture devices:" << std::endl; unsigned int captureIdx = 0; for (captureIdx = 0; captureIdx < ptrViECapture->NumberOfCaptureDevices(); captureIdx++) { memset(deviceName, 0, KMaxDeviceNameLength); memset(uniqueId, 0, KMaxUniqueIdLength); error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, KMaxDeviceNameLength, uniqueId, KMaxUniqueIdLength); if (error == -1) { printf("ERROR in ViECapture::GetCaptureDevice\n"); return -1; } std::cout << " " << captureIdx+1 << ". " << deviceName << std::endl; } std::cout << std::endl; std::cout << "Choose capture devices: "; // std::getline(std::cin, str); // captureIdx = atoi(str.c_str()) - 1; captureIdx = 0; error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, KMaxDeviceNameLength, uniqueId, KMaxUniqueIdLength); if (error == -1) { printf("ERROR in ViECapture::GetCaptureDevice\n"); return -1; } int captureId = 0; error = ptrViECapture->AllocateCaptureDevice(uniqueId, KMaxUniqueIdLength, captureId); if (error == -1) { printf("ERROR in ViECapture::AllocateCaptureDevice\n"); return -1; } error = ptrViECapture->ConnectCaptureDevice(captureId, videoChannel); if (error == -1) { printf("ERROR in ViECapture::ConnectCaptureDevice\n"); return -1; } error = ptrViECapture->StartCapture(captureId); if (error == -1) { printf("ERROR in ViECapture::StartCapture\n"); return -1; } // // RTP/RTCP settings // ViERTP_RTCP* ptrViERtpRtcp = ViERTP_RTCP::GetInterface(ptrViE); if (ptrViERtpRtcp == NULL) { printf("ERROR in ViERTP_RTCP::GetInterface\n"); return -1; } error = ptrViERtpRtcp->SetRTCPStatus(videoChannel, kRtcpCompound_RFC4585); if (error == -1) { printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n"); return -1; } error = ptrViERtpRtcp->SetKeyFrameRequestMethod(videoChannel, kViEKeyFrameRequestPliRtcp); if (error == -1) { printf("ERROR in ViERTP_RTCP::SetKeyFrameRequestMethod\n"); return -1; } error = ptrViERtpRtcp->SetTMMBRStatus(videoChannel, true); if (error == -1) { printf("ERROR in ViERTP_RTCP::SetTMMBRStatus\n"); return -1; } // // Set up rendering // ViERender* ptrViERender = ViERender::GetInterface(ptrViE); if (ptrViERender == NULL) { printf("ERROR in ViERender::GetInterface\n"); return -1; } // error = ptrViERender->EnableFullScreenRender(_vieCocoaRenderView1); // if (error == -1) // { // printf("ERROR in ViERender::AddRenderer\n"); // return -1; // } error = ptrViERender->AddRenderer(captureId, _vieCocoaRenderView1, 0, 0.5, 0.5, 1.0, 1.0); if (error == -1) { printf("ERROR in ViERender::AddRenderer\n"); return -1; } error = ptrViERender->StartRender(captureId); if (error == -1) { printf("ERROR in ViERender::StartRender\n"); return -1; } error = ptrViERender->AddRenderer(videoChannel, _vieCocoaRenderView2, 1, 0.0, 0.0, 1.0, 1.0); if (error == -1) { printf("ERROR in ViERender::AddRenderer\n"); return -1; } error = ptrViERender->StartRender(videoChannel); if (error == -1) { printf("ERROR in ViERender::StartRender\n"); return -1; } // // Setup codecs // ViECodec* ptrViECodec = ViECodec::GetInterface(ptrViE); if (ptrViECodec == NULL) { printf("ERROR in ViECodec::GetInterface\n"); return -1; } std::cout << std::endl; std::cout << "Available codecs:" << std::endl; // Check available codecs and prepare receive codecs VideoCodec videoCodec; memset(&videoCodec, 0, sizeof(VideoCodec)); unsigned int codecIdx = 0; for (codecIdx = 0; codecIdx < ptrViECodec->NumberOfCodecs(); codecIdx++) { error = ptrViECodec->GetCodec(codecIdx, videoCodec); if (error == -1) { printf("ERROR in ViECodec::GetCodec\n"); return -1; } error = ptrViECodec->SetReceiveCodec(videoChannel, videoCodec); if (error == -1) { printf("ERROR in ViECodec::SetReceiveCodec\n"); return -1; } if (videoCodec.codecType != kVideoCodecRED && videoCodec.codecType != kVideoCodecULPFEC) { std::cout << " " << codecIdx+1 << ". " << videoCodec.plName << std::endl; } } std::cout << std::endl; std::cout << "Choose codec: "; // std::getline(std::cin, str); // codecIdx = atoi(str.c_str()) - 1; error = ptrViECapture->ShowCaptureSettingsDialogBox("unique",10, "mytitle"); codecIdx = 0; error = ptrViECodec->GetCodec(codecIdx, videoCodec); if (error == -1) { printf("ERROR in ViECodec::GetCodec\n"); return -1; } error = ptrViECodec->SetSendCodec(videoChannel, videoCodec); if (error == -1) { printf("ERROR in ViECodec::SetSendCodec\n"); return -1; } // // Address settings // ViENetwork* ptrViENetwork = ViENetwork::GetInterface(ptrViE); if (ptrViENetwork == NULL) { printf("ERROR in ViENetwork::GetInterface\n"); return -1; } const char* ipAddress = "127.0.0.1"; const unsigned short rtpPort = 6000; error = ptrViENetwork->SetLocalReceiver(videoChannel, rtpPort); if (error == -1) { printf("ERROR in ViENetwork::SetLocalReceiver\n"); return -1; } error = ptrViEBase->StartReceive(videoChannel); if (error == -1) { printf("ERROR in ViENetwork::StartReceive\n"); return -1; } error = ptrViENetwork->SetSendDestination(videoChannel, ipAddress, rtpPort); if (error == -1) { printf("ERROR in ViENetwork::SetSendDestination\n"); return -1; } error = ptrViEBase->StartSend(videoChannel); if (error == -1) { printf("ERROR in ViENetwork::StartSend\n"); return -1; } //******************************************************** // Engine started //******************************************************** // Call started std::cout << std::endl; std::cout << "Loopback call started" << std::endl; std::cout << std::endl << std::endl; std::cout << "Press enter to stop..."; // [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; // std::getline(std::cin, str); usleep(5 * 1000 * 1000); //int i = 0; // while(1) // { // NSLog(@"app iteration %d", i); // i++; // [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; // std::getline(std::cin, str); // if(i > 3) // { // break; // } // } //******************************************************** // Testing finished. Tear down Video Engine //******************************************************** error = ptrViEBase->StopReceive(videoChannel); if (error == -1) { printf("ERROR in ViEBase::StopReceive\n"); return -1; } error = ptrViEBase->StopSend(videoChannel); if (error == -1) { printf("ERROR in ViEBase::StopSend\n"); return -1; } error = ptrViERender->StopRender(captureId); if (error == -1) { printf("ERROR in ViERender::StopRender\n"); return -1; } error = ptrViERender->RemoveRenderer(captureId); if (error == -1) { printf("ERROR in ViERender::RemoveRenderer\n"); return -1; } error = ptrViERender->StopRender(videoChannel); if (error == -1) { printf("ERROR in ViERender::StopRender\n"); return -1; } error = ptrViERender->RemoveRenderer(videoChannel); if (error == -1) { printf("ERROR in ViERender::RemoveRenderer\n"); return -1; } error = ptrViECapture->StopCapture(captureId); if (error == -1) { printf("ERROR in ViECapture::StopCapture\n"); return -1; } error = ptrViECapture->DisconnectCaptureDevice(videoChannel); if (error == -1) { printf("ERROR in ViECapture::DisconnectCaptureDevice\n"); return -1; } error = ptrViECapture->ReleaseCaptureDevice(captureId); if (error == -1) { printf("ERROR in ViECapture::ReleaseCaptureDevice\n"); return -1; } error = ptrViEBase->DeleteChannel(videoChannel); if (error == -1) { printf("ERROR in ViEBase::DeleteChannel\n"); return -1; } int remainingInterfaces = 0; remainingInterfaces = ptrViECodec->Release(); remainingInterfaces += ptrViECapture->Release(); remainingInterfaces += ptrViERtpRtcp->Release(); remainingInterfaces += ptrViERender->Release(); remainingInterfaces += ptrViENetwork->Release(); remainingInterfaces += ptrViEBase->Release(); if (remainingInterfaces > 0) { printf("ERROR: Could not release all interfaces\n"); return -1; } bool deleted = VideoEngine::Delete(ptrViE); if (deleted == false) { printf("ERROR in VideoEngine::Delete\n"); return -1; } NSLog(@"Finished function"); return 0; // // END: VideoEngine 3.0 Sample Code // // =================================================================== } -(IBAction)handleRestart:(id)sender { // [self stopLooback]; // [self startLoopback]; [self ioLooback]; } @end