Thijs Alkemade avatar Thijs Alkemade committed 7542124

- Fix indentation, formatting and logging of adiumPurpleMedia.
- The video views are now part of the call window itself, instead of spawning two new windows.

Comments (0)

Files changed (5)

Frameworks/Adium Framework/Source/AIMedia.h

 
 	AIMediaType		mediaType;
 	AIMediaState	mediaState;
-	NSWindow *remote_video;
-	NSWindow *local_video;
-	int i;
+	
+	NSView *localView;
+	NSView *remoteView;
 	
 	NSDate *startedAt;
 }
 
 @property (readwrite, retain, nonatomic) AIAccount <AIAccount_Media> *account;
 @property (readwrite, retain, nonatomic) AIListContact *listContact;
-@property (readwrite, retain, nonatomic) NSWindow *remote_video;
-@property (readwrite, retain, nonatomic) NSWindow *local_video;
+
+@property (readwrite, retain, nonatomic) NSView *localView;
+@property (readwrite, retain, nonatomic) NSView *remoteView;
 
 @property (readonly, retain, nonatomic) NSDate *startedAt;
 

Frameworks/Adium Framework/Source/AIMedia.m

 								onAccount:inAccount] autorelease];
 }
 
-@synthesize listContact, mediaType, mediaState, participant, i, account, protocolInfo, priv, sendLevel, receiveLevel, local_video, remote_video, startedAt;
+@synthesize listContact, mediaType, mediaState, participant, account, protocolInfo, priv, sendLevel, receiveLevel, startedAt, localView, remoteView;
 
 - (id)initWithContact:(AIListContact *)inListContact
 			  onAccount:(AIAccount<AIAccount_Media> *)inAccount

Plugins/Purple Service/adiumPurpleMedia.m

 #import "AIMediaWindowController.h"
 #import "adiumPurpleMedia.h"
 #import "AIMediaController.h"
+#import "AIMediaWindowController.h"
 #import <QTKit/QTKit.h>
 #import <CoreAudio/CoreAudio.h>
 #include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
 
-GstElement *osxvideosink;
-NSWindow* remote_window = NULL;
-NSWindow* local_window = NULL;
-
-void adium_media_print_pipeline_latency(GstPipeline *pipeline) {
+void adium_media_print_pipeline_latency(GstPipeline *pipeline)
+{
     //  prints out latency
 	GstQuery *q = gst_query_new_latency();
+	
 	if (gst_element_query (GST_ELEMENT(pipeline), q)) {
 		gboolean live;
 		GstClockTime minlat, maxlat;
 		gst_query_parse_latency (q, &live, &minlat, &maxlat);
-		printf("adium_media_print_pipeline_latency: minlatency: %ld maxlatency: %ld\n", minlat, maxlat);
+		AILogWithSignature(@"minlatency: %ld maxlatency: %ld\n", minlat, maxlat);
 	} 
 	
 }
 
-void adium_media_print_pipeline_graph(GstPipeline *pipeline) {
+void adium_media_print_pipeline_graph(GstPipeline *pipeline)
+{
     // function to traverse a given pipeline and print out all the element names
 	GstElement *cur_element;
-	printf("adium_media_print_pipeline_graph(): \n");
+	AILogWithSignature(@"Pipeline: ");
 	GstIterator *iterator = gst_bin_iterate_sorted(GST_BIN(pipeline));
 	bool done = FALSE;
+	
 	while(!done) {
 		switch(gst_iterator_next(iterator, (gpointer *)&cur_element)) {
 				
 			case GST_ITERATOR_OK:
-				printf("%s\n", gst_element_get_name(cur_element));
+				AILogWithSignature(@"%s\n", gst_element_get_name(cur_element));
 				gst_object_unref(cur_element);
 				break;
 			case GST_ITERATOR_ERROR:
-				printf("GST_ITERATOR_ERROR\n");
+				AILogWithSignature(@"GST_ITERATOR_ERROR");
 
 				break;
 			case GST_ITERATOR_DONE:
-				printf("GST_ITERATOR_DONE\n");
+				AILogWithSignature(@"GST_ITERATOR_DONE");
 				done = TRUE;
 
 				break;
 			case GST_ITERATOR_RESYNC:
-				printf("GST_ITERATOR_RESYNC\n");
+				AILogWithSignature(@"GST_ITERATOR_RESYNC");
 				
 				break;
 		}
 }
 
 GstBusSyncReply
-adium_bus_sync_signal_handler (GstBus * bus, GstMessage * message, gpointer data) {
+adium_bus_sync_signal_handler (GstBus * bus, GstMessage * message, gpointer data)
+{
     // adium_bus_sync_signal_handler is called whenever a synchronous event occurs on ANY thread
     // it then handles the message asynchronously using libdispatch on the main queue
 	dispatch_queue_t queue = (dispatch_queue_t)data;
 		// Receive progress
 		[adiumMedia setReceiveLevel:level];
 	}
-	
-//	printf("Participant: %s Level: %f\n", participant, level);
 }
 
 static void
 static void
 adium_media_ready_cb(PurpleMedia *media, AIMedia *adiumMedia, const gchar *sid)
 {
-    // TODO: 
 	PurpleMediaSessionType type = purple_media_get_session_type(media, sid);
-	long remote_window_id, local_window_id;
-
-	//printf("adium_media_ready_cb participant: %s i: %d\n", ((AIMediaPrivate *)adiumMedia.priv)->participant, adiumMedia.i);
-	//printf("adium_media_ready_cb participant: %s\n", [[adiumMedia.listContact formattedUID] UTF8String]);
-
+	long remote_view_id, local_view_id;
 	gchar *participant = adiumMedia.participant;
 	
-	
 	if (type & PURPLE_MEDIA_RECV_VIDEO) {
-
-		NSRect remote_frame = NSMakeRect(100, 100, 200, 200);
-                // retrieve pointer to local_window's contentView to pass to purple_media_set_output_window TODO: pass as part of 
-		remote_window  = [[NSWindow alloc] initWithContentRect:remote_frame
-														styleMask:(NSTitledWindowMask | NSResizableWindowMask)
-														  backing:NSBackingStoreBuffered
-															defer:NO];
+		NSWindowController<AIMediaWindowController> *windowController = [adium.mediaController windowControllerForMedia:adiumMedia];
+		// retrieve pointer to local_window's contentView to pass to purple_media_set_output_window TODO: pass as part of 
+		NSView *newView = [[[NSView alloc] initWithFrame:NSMakeRect(0.0, 0.0, windowController.incomingVideo.frame.size.width, windowController.incomingVideo.frame.size.height)]
+						   autorelease];
+		adiumMedia.remoteView = newView;
 		
         // retrieve pointer to remote_window's contentView to pass to purple_media_set_output_window
-		remote_window_id = (long) [remote_window contentView];
-		
-		[remote_window makeKeyAndOrderFront:NSApp];
+		remote_view_id = (long) adiumMedia.remoteView;
 
         // purple_media_set_output_window will cause remote participant's osxvideosink to paint itself into the remote_window contentview
         // since osxvideosink knows how to embed itself in a parent view
-		purple_media_set_output_window(media, sid, participant, remote_window_id);
-	
+		purple_media_set_output_window(media, sid, participant, remote_view_id);
+		
 		// Setup receiving video view
-#warning Set up receiving video view
+		
+		[windowController.incomingVideo addSubview:adiumMedia.remoteView];
 	}
 	
 	if (type & PURPLE_MEDIA_SEND_VIDEO) {
-		NSRect local_frame = NSMakeRect(300,300,200,200);
-		local_window  = [[NSWindow alloc] initWithContentRect:local_frame
-													 styleMask:(NSTitledWindowMask | NSResizableWindowMask)
-													   backing:NSBackingStoreBuffered
-                                                        defer:NO]; 
+		NSWindowController<AIMediaWindowController> *windowController = [adium.mediaController windowControllerForMedia:adiumMedia];
+		NSView *newView = [[[NSView alloc] initWithFrame:NSMakeRect(0.0, 0.0, windowController.outgoingVideo.frame.size.width, windowController.outgoingVideo.frame.size.height)]
+						   autorelease];
+		adiumMedia.localView = newView;
 	
         // retrieve pointer to local_window's contentView to pass to purple_media_set_output_window
-		local_window_id = (long) [local_window contentView];
+		local_view_id = (long) adiumMedia.localView;
 		
-		[local_window makeKeyAndOrderFront:NSApp];
-        
         // purple_media_set_output_window will cause local osxvideosink to paint itself into the local_window contentview
         // since osxvideosink knows how to embed itself in a superview
-		purple_media_set_output_window(media, sid, NULL, local_window_id);
+		purple_media_set_output_window(media, sid, NULL, local_view_id);
 		
 		// Set up sending video view
-#warning Set up sending video view
+		[windowController.outgoingVideo addSubview:adiumMedia.localView];
 	}
 
 	if (type & PURPLE_MEDIA_RECV_AUDIO) {
 static void
 adium_media_state_changed_cb(PurpleMedia *media, PurpleMediaState state, gchar *sid, gchar *name, AIMedia *adiumMedia)
 {
-	NSLog(@"state: %d sid: %s name: %s\n", state, sid ? sid : "(null)", name ? name : "(null)");
-	//printf("adium_media_state_changed_cb participant: %s\n", ((AIMediaPrivate *)adiumMedia.priv)->participant);
+	AILogWithSignature(@"state: %d sid: %s name: %s\n", state, sid ? sid : "(null)", name ? name : "(null)");
+	
 	switch (state) {
 		case PURPLE_MEDIA_STATE_CONNECTED:
 			adiumMedia.mediaState = AIMediaStateAccepted;
 static void
 adium_media_stream_info_cb(PurpleMedia *media, PurpleMediaInfoType type, gchar *sid, gchar *name, gboolean local, AIPurpleMedia *adiumMedia)
 {
-//	NSLog(@"Media stream info cb: %d", type);
-//	NSLog(@"adium_media_stream_info_cb participant: %s", adiumMedia.participant);
 	if (type == PURPLE_MEDIA_INFO_REJECT) {
 		adium_media_emit_message(adiumMedia, _("You have rejected the call."));
 	} else if (type == PURPLE_MEDIA_INFO_ACCEPT) {		
 adium_media_new_cb(PurpleMediaManager *manager, PurpleMedia *media,
 		PurpleAccount *account, gchar *participant, gpointer nul)
 {
-
 	GstElement *pipeline; // this will point to the gst pipeline the manager has created
 	GstBus *bus; 
 	
 	}
 	
 	adiumMedia.media = media;
-	
 	adiumMedia.protocolInfo = (id)media;
 	adiumMedia.participant = strdup(participant);
-	adiumMedia.i = 5;
 	
-	NSLog(@"adium_media_new_cb: participant: %s", adiumMedia.participant);
+	AILogWithSignature(@"Participant: %s", adiumMedia.participant);
 
 	NSWindowController *windowController = [adium.mediaController windowControllerForMedia:adiumMedia];
 	[windowController showWindow:nil];
 					 G_CALLBACK(level_message_cb), adiumMedia);
 	
 	pipeline = purple_media_manager_get_pipeline(manager);
-	
 	bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
 	
 	adium_add_media_bus_source(bus, media, manager); // register the bus as a runloop source
 
 void adium_media_remove(AIPurpleMedia *adiumMedia)
 {
-	printf("adium_media_remove\n");
+	AILogWithSignature(@"Removing %@", adiumMedia);
 	
 	PurpleMedia *media = (PurpleMedia *)adiumMedia.protocolInfo;
 	
 create_default_video_src(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-	NSLog(@"create_default_video_src");
+	AILogWithSignature(@"Creating video src for %s", session_id);
+	
 	GstElement *sendbin, *src, *videoscale, *capsfilter, *videorate, *autoconvert, *colorspace;
 	GstPad *pad;
 	GstPad *ghost;
 	GstCaps *caps;
 
-	src = gst_element_factory_make("qtkitvideosrc", NULL);
+	src = gst_element_factory_make("videotestsrc", NULL);
 	
 	NSString *deviceUID = [adium.preferenceController preferenceForKey:KEY_VIDEO_DEVICE_UID
 																 group:PREF_GROUP_MEDIA];
 	NSArray *devices = [QTCaptureDevice inputDevicesWithMediaType:QTMediaTypeVideo];
 	NSInteger deviceIndex = [devices indexOfObject:device];
 	
-	g_object_set (G_OBJECT(src), "device-index", deviceIndex, NULL);
+	g_object_set(G_OBJECT(src), "device-index", deviceIndex, NULL);
 	
 	AILogWithSignature(@"Setting device-index to %d", deviceIndex);
 	
 	if (src == NULL) {
-		NSLog(@"Unable to find suitable element for default video source.");
+		AILogWithSignature(@"Unable to find suitable element for default video source.");
 		return NULL;
 	}
 
 	/* It was recommended to set the size <= 352x288 and framerate <= 20 */
 	caps = gst_caps_from_string("video/x-raw-rgb, width=[176,352] , height=[144,288] , framerate=[1/1,20/1]");
 	g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
-
+	
 	gst_bin_add_many(GST_BIN(sendbin), src, colorspace, autoconvert, videorate, NULL);
 	gst_element_link_many(src, colorspace, autoconvert, videorate, NULL);
 
 	pad = gst_element_get_static_pad(videorate, "src");
 	ghost = gst_ghost_pad_new("ghostsrc", pad);
+	
 	gst_element_add_pad(sendbin, ghost);
 
 	return sendbin;
 static GstElement *
 create_default_video_sink(PurpleMedia *media, const gchar *session_id, const gchar *participant)
 {
+	AILogWithSignature(@"Creating default video sink for %s", session_id);
 	
-	NSLog(@"create_default_video_sink\n");
 	GstElement *bin = gst_bin_new("adiumdefaultvideosinkbin");
 	GstElement *sink = gst_element_factory_make("osxvideosink", NULL);
 	GstElement *videoscale = gst_element_factory_make("videoscale", NULL);
 	GstPad *pad, *ghost;
+
 	gst_bin_add_many(GST_BIN(bin), sink, videoscale, NULL);
 	gst_element_link_many(videoscale, sink, NULL);
+	
 	pad = gst_element_get_static_pad(videoscale, "sink");
 	ghost = gst_ghost_pad_new("sink", pad);
+	
 	gst_element_add_pad(bin, ghost);
-	
-	g_object_set (G_OBJECT (sink), "embed", true, NULL);
+	g_object_set(G_OBJECT(sink), "embed", true, NULL);
 	
 	if (sink == NULL) {
-		NSLog(@"Unable to find suitable element for default video sink.");
+		AILogWithSignature(@"Unable to find suitable element for default video sink.");
 	}
 	
 	return bin;
 create_default_audio_src(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-	NSLog(@"create_default_audio_src");
+	AILogWithSignature(@"Creating default audio source for %s", session_id);
+	
 	GstElement *src, *convert, *resample, *bin;
 	GstPad *pad, *ghost;
+	
 	bin = gst_bin_new("adiumdefaultaudiosrcbin");
-	
 	src = gst_element_factory_make("osxaudiosrc", "adiumdefaultaudiosrc");
 	
 	NSString *deviceUID = [adium.preferenceController preferenceForKey:KEY_AUDIO_INPUT_DEVICE_UID
 	AILogWithSignature(@"Setting device to %d", device);
 
 	if (src == NULL) {
-		NSLog(@"Unable to find suitable element for default audio src.");
+		AILogWithSignature(@"Unable to find suitable element for default audio src.");
 		return NULL;
 	}
+	
 	convert = gst_element_factory_make("audioconvert", NULL);
 	resample = gst_element_factory_make("audioresample", NULL);
+	
 	gst_bin_add_many(GST_BIN(bin), src, convert, resample, NULL);
 	gst_element_link_many(src, convert, resample, NULL);
+	
 	pad = gst_element_get_static_pad(resample, "src");
 	ghost = gst_ghost_pad_new("ghostpad", pad);
+	
 	gst_element_add_pad(bin, ghost);
 	
 	return bin;
 create_default_audio_sink(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-	NSLog(@"create_default_audio_sink");
+	AILogWithSignature(@"Creating default audio sink for %s", session_id);
+	
 	PurpleMediaManager *manager = purple_media_get_manager(media);
 	GstPipeline *pipeline = GST_PIPELINE(purple_media_manager_get_pipeline(manager));
 	GstElement *bin, *convert, *resample, *sink;
 	GstPad *pad;
+	
 	bin = gst_bin_new("adiumdefaultaudiosinkbin");
 	sink = gst_element_factory_make("osxaudiosink", "adiumdefaultaudiosink");
 	
 	resample = gst_element_factory_make("audioresample", NULL);
 	
 	if (sink == NULL) {
-		NSLog(@"Unable to find suitable element for default audio sink.");
+		AILogWithSignature(@"Unable to find suitable element for default audio sink.");
 		return NULL;
 	}
 
 	if (convert == NULL) {
-		NSLog(@"Unable to find suitable element for audioconvert");
+		AILogWithSignature(@"Unable to find suitable element for audioconvert");
 		return NULL;
 	}
 	
 	if (resample == NULL) {
-		NSLog(@"Unable to find suitable element for audioresample");
+		AILogWithSignature(@"Unable to find suitable element for audioresample");
 		return NULL;
 	}
 	
 	gst_bin_add(GST_BIN(bin), convert);
 	gst_bin_add(GST_BIN(bin), resample);
 	gst_bin_add(GST_BIN(bin), sink);
+	
 	gst_element_link(resample, sink);
 	gst_element_link(convert, resample);
-	pad = gst_element_get_static_pad (convert, "sink");
-	gst_element_add_pad (bin, gst_ghost_pad_new ("sink", pad));
+	
+	pad = gst_element_get_static_pad(convert, "sink");
+	
+	gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad));
 	adium_media_print_pipeline_graph(pipeline);
+	
 	return bin;
 }
 
 void
 adium_purple_media_set_muted(AIPurpleMedia *adiumMedia, BOOL muted)
 {
-	purple_media_stream_info(adiumMedia.media, (muted ? PURPLE_MEDIA_INFO_MUTE : PURPLE_MEDIA_INFO_UNMUTE), NULL, NULL, TRUE);
+	purple_media_stream_info(adiumMedia.media,
+							 (muted ? PURPLE_MEDIA_INFO_MUTE : PURPLE_MEDIA_INFO_UNMUTE),
+							 NULL, NULL, TRUE);
 }
 
 void
 adium_purple_media_set_paused(AIPurpleMedia *adiumMedia, BOOL paused)
 {
-	purple_media_stream_info(adiumMedia.media, (paused ? PURPLE_MEDIA_INFO_PAUSE | PURPLE_MEDIA_INFO_HOLD : PURPLE_MEDIA_INFO_UNPAUSE | PURPLE_MEDIA_INFO_UNHOLD), NULL, NULL, TRUE);
+	purple_media_stream_info(adiumMedia.media,
+							 (paused ? PURPLE_MEDIA_INFO_PAUSE | PURPLE_MEDIA_INFO_HOLD : PURPLE_MEDIA_INFO_UNPAUSE | PURPLE_MEDIA_INFO_UNHOLD),
+							 NULL, NULL, TRUE);
 }
 
 void
 
 void
 adiumPurpleMedia_init(void)
-{	
-	
-	NSLog(@"adiumPurpleMedia_init()\n");
-	
+{
+	AILogWithSignature(@"");
 	
 	PurpleMediaManager *manager = purple_media_manager_get();
 	PurpleMediaElementInfo *default_video_src =
 	purple_media_manager_set_active_element(manager, default_video_sink);
 	purple_media_manager_set_active_element(manager, default_audio_src);
 	purple_media_manager_set_active_element(manager, default_audio_sink);
-
-
 }

Resources/AIMediaWindow.nib/designable.nib

 <?xml version="1.0" encoding="UTF-8"?>
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
-		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">11A511</string>
-		<string key="IBDocument.InterfaceBuilderVersion">1617</string>
-		<string key="IBDocument.AppKitVersion">1138</string>
-		<string key="IBDocument.HIToolboxVersion">566.00</string>
+		<int key="IBDocument.SystemTarget">1070</int>
+		<string key="IBDocument.SystemVersion">11D50</string>
+		<string key="IBDocument.InterfaceBuilderVersion">2182</string>
+		<string key="IBDocument.AppKitVersion">1138.32</string>
+		<string key="IBDocument.HIToolboxVersion">568.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">1617</string>
+			<string key="NS.object.0">2182</string>
 		</object>
 		<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 			<string>NSSlider</string>
 			<string>NSSliderCell</string>
 			<string>NSCustomObject</string>
+			<string>NSCustomView</string>
 			<string>NSView</string>
 			<string>NSWindowTemplate</string>
 			<string>NSTextField</string>
 			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
-			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys" id="0">
-				<bool key="EncodedWithXMLCoder">YES</bool>
-			</object>
-			<reference key="dict.values" ref="0"/>
+			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+			<integer value="1" key="NS.object.0"/>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 			<object class="NSWindowTemplate" id="1005">
 				<int key="NSWindowStyleMask">7</int>
 				<int key="NSWindowBacking">2</int>
-				<string key="NSWindowRect">{{718, 494}, {367, 199}}</string>
+				<string key="NSWindowRect">{{718, 494}, {712, 475}}</string>
 				<int key="NSWTFlags">544735232</int>
 				<string key="NSWindowTitle">Media Window</string>
 				<string key="NSWindowClass">NSWindow</string>
 							<reference key="NSNextKeyView" ref="262074219"/>
 							<int key="NSViewLayerContentsRedrawPolicy">2</int>
 						</object>
+						<object class="NSCustomView" id="499408224">
+							<reference key="NSNextResponder" ref="1006"/>
+							<int key="NSvFlags">274</int>
+							<string key="NSFrame">{{0, 187}, {352, 288}}</string>
+							<reference key="NSSuperview" ref="1006"/>
+							<reference key="NSNextKeyView" ref="251933577"/>
+							<string key="NSClassName">NSView</string>
+						</object>
+						<object class="NSCustomView" id="960780271">
+							<reference key="NSNextResponder" ref="1006"/>
+							<int key="NSvFlags">274</int>
+							<string key="NSFrame">{{360, 187}, {352, 288}}</string>
+							<reference key="NSSuperview" ref="1006"/>
+							<string key="NSClassName">NSView</string>
+						</object>
 					</object>
-					<string key="NSFrameSize">{367, 199}</string>
+					<string key="NSFrameSize">{712, 475}</string>
 					<reference key="NSSuperview"/>
-					<reference key="NSNextKeyView" ref="251933577"/>
+					<reference key="NSNextKeyView" ref="499408224"/>
 					<int key="NSViewLayerContentsRedrawPolicy">2</int>
 				</object>
-				<string key="NSScreenRect">{{0, 0}, {1920, 1080}}</string>
+				<string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
 				<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
 				<bool key="NSWindowIsRestorable">NO</bool>
 			</object>
 					</object>
 					<int key="connectionID">153</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">videoView</string>
+						<reference key="source" ref="1001"/>
+						<reference key="destination" ref="499408224"/>
+					</object>
+					<int key="connectionID">155</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">incomingVideo</string>
+						<reference key="source" ref="1001"/>
+						<reference key="destination" ref="499408224"/>
+					</object>
+					<int key="connectionID">157</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">outgoingVideo</string>
+						<reference key="source" ref="1001"/>
+						<reference key="destination" ref="960780271"/>
+					</object>
+					<int key="connectionID">160</int>
+				</object>
 			</object>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<object class="NSArray" key="orderedObjects">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<reference key="object" ref="0"/>
+						<object class="NSArray" key="object" id="0">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+						</object>
 						<reference key="children" ref="1000"/>
 						<nil key="parent"/>
 					</object>
 							<reference ref="866078648"/>
 							<reference ref="927379675"/>
 							<reference ref="251933577"/>
+							<reference ref="499408224"/>
+							<reference ref="960780271"/>
 						</object>
 						<reference key="parent" ref="1005"/>
 					</object>
 						<reference key="object" ref="503888431"/>
 						<reference key="parent" ref="565866026"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">154</int>
+						<reference key="object" ref="499408224"/>
+						<reference key="parent" ref="1006"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">159</int>
+						<reference key="object" ref="960780271"/>
+						<reference key="parent" ref="1006"/>
+					</object>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 					<string>148.IBPluginDependency</string>
 					<string>149.IBPluginDependency</string>
 					<string>150.IBPluginDependency</string>
+					<string>154.IBPluginDependency</string>
+					<string>159.IBPluginDependency</string>
 					<string>2.IBPluginDependency</string>
 					<string>80.IBPluginDependency</string>
 					<string>81.IBPluginDependency</string>
 					<string>98.IBPluginDependency</string>
 					<string>99.IBPluginDependency</string>
 				</object>
-				<object class="NSMutableArray" key="dict.values">
+				<object class="NSArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<reference key="dict.values" ref="0"/>
 			</object>
 			<nil key="sourceID"/>
-			<int key="maxID">153</int>
+			<int key="maxID">160</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes"/>
 		<int key="IBDocument.localizationMode">0</int>
 		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
-		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
-			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
-			<integer value="1050" key="NS.object.0"/>
-		</object>
 		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
 			<integer value="3000" key="NS.object.0"/>
Add a comment to this file

Resources/AIMediaWindow.nib/keyedobjects.nib

Binary file modified.

Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.