linphone-iphone/submodules/MS2/MS2/ViewController.m
2016-01-06 12:19:07 +01:00

151 lines
4.5 KiB
Objective-C

//
// ViewController.m
// MS2
//
// Created by guillaume on 06/05/2015.
// Copyright (c) 2015 Belldonne Communications. All rights reserved.
//
#import "ViewController.h"
#include <ifaddrs.h>
#include <arpa/inet.h>
#import "mediastreamer2/mediastream.h"
#import "oRTP/rtpsession.h"
#import "UITextField+DoneButton.h"
extern void libmsopenh264_init();
@interface ViewController () {
MSWebCam *videoCam;
MSWebCam *noCam;
MSFilter *noWebCamFilter;
MSFilter *videoCamFilter;
RtpProfile *profile;
VideoStream *currentStream;
IceSession *iceSession;
PayloadType *vp8_pt;
}
@end
@implementation ViewController
#define CAM_NAME "AV Capture: com.apple.avfoundation.avcapturedevice.built-in_video:1"
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
ortp_init();
ortp_set_log_level_mask(ORTP_DEBUG | ORTP_MESSAGE | ORTP_WARNING | ORTP_ERROR | ORTP_FATAL);
ms_init();
libmsopenh264_init(); /*no plugin on IOS/Android */
NSString *nowebFile = @"nowebcamCIF.jpg";
NSString *path = [[NSBundle mainBundle] pathForResource:[nowebFile stringByDeletingPathExtension]
ofType:[nowebFile pathExtension]];
ms_static_image_set_default_image([path UTF8String]);
noCam = ms_web_cam_manager_get_cam(ms_web_cam_manager_get(), "StaticImage: Static picture");
videoCam = ms_web_cam_manager_get_cam(ms_web_cam_manager_get(), CAM_NAME);
noWebCamFilter = ms_web_cam_create_reader(noCam);
videoCamFilter = ms_web_cam_create_reader(videoCam);
currentStream = NULL;
profile = rtp_profile_clone_full(&av_profile);
rtp_profile_set_payload(profile, 103, &payload_type_vp8);
vp8_pt = payload_type_clone(rtp_profile_get_payload(profile, 103));
// Enable AVPF
PayloadTypeAvpfParams avpf_params;
payload_type_set_flag(vp8_pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED);
avpf_params.features =
PAYLOAD_TYPE_AVPF_FIR | PAYLOAD_TYPE_AVPF_PLI | PAYLOAD_TYPE_AVPF_SLI | PAYLOAD_TYPE_AVPF_RPSI;
avpf_params.trr_interval = 3000;
payload_type_set_avpf_params(vp8_pt, avpf_params);
vp8_pt->normal_bitrate = 500000;
[NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(timer:) userInfo:nil repeats:TRUE];
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(infoTimer:) userInfo:nil repeats:TRUE];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)updateInfo {
if (currentStream == NULL) {
self.infoLabel.text = @"No stream";
self.bandwidthLabel.text = @"";
return;
}
const MSWebCam *currentCam = video_stream_get_camera(currentStream);
if (currentCam)
self.infoLabel.text = [NSString stringWithFormat:@"Stream running, current cam: %s", currentCam->name];
else
self.infoLabel.text = @"No Webcam ?!";
MediaStream *ms = (MediaStream *)currentStream;
float upload = rtp_session_get_rtp_send_bandwidth(ms->sessions.rtp_session);
float download = rtp_session_get_rtp_recv_bandwidth(ms->sessions.rtp_session);
self.bandwidthLabel.text =
[NSString stringWithFormat:@"Upload: %f kbit/s, Download: %f kbit/s", upload / 1000.0, download / 1000.0];
}
#pragma mark - Timer callbacks
- (void)timer:(NSTimer *)timer {
if (currentStream) {
media_stream_iterate((MediaStream *)currentStream);
}
}
- (void)infoTimer:(NSTimer *)timer {
[self updateInfo];
}
#pragma mark - Actions
- (IBAction)onStartStreamsClick:(id)sender {
if (currentStream) {
VideoStream *stream = currentStream;
currentStream = NULL;
video_stream_stop_keep_source(stream);
[self.startStreamLabel setTitle:@"Start streams" forState:UIControlStateNormal];
} else {
VideoStream *stream = video_stream_new(3456, 3457, FALSE);
video_stream_set_native_window_id(stream, (unsigned long)self.remoteView);
video_stream_set_native_preview_window_id(stream, (unsigned long)self.localView);
video_stream_start_with_source(stream, profile, "127.0.0.1", 3456, "127.0.0.1", 3457, 103, 30, noCam,
noWebCamFilter);
currentStream = stream;
[self.startStreamLabel setTitle:@"Stop streams" forState:UIControlStateNormal];
[self updateInfo];
}
}
- (IBAction)changeCamUp:(id)sender {
if (currentStream == NULL)
return;
NSLog(@"Restore static cam (%p)", noWebCamFilter);
video_stream_change_source_filter(currentStream, noCam, noWebCamFilter, TRUE);
[self updateInfo];
}
- (IBAction)changeCamDown:(id)sender {
if (currentStream == NULL) {
return;
}
NSLog(@"Use real camera (%p)", videoCamFilter);
video_stream_change_source_filter(currentStream, videoCam, videoCamFilter, TRUE);
[self updateInfo];
}
@end