mfreerdp-server: scaling fix, performance improvements
authorC-o-r-E <can.of.tuna@gmail.com>
Wed, 12 Dec 2012 02:20:10 +0000 (21:20 -0500)
committerC-o-r-E <can.of.tuna@gmail.com>
Wed, 12 Dec 2012 02:20:10 +0000 (21:20 -0500)
server/Mac/mf_info.c
server/Mac/mf_interface.h
server/Mac/mf_mountain_lion.c
server/Mac/mf_mountain_lion.h
server/Mac/mf_peer.c

index 18dd9a9..1af0ef1 100644 (file)
@@ -178,6 +178,7 @@ void mf_info_peer_register(mfInfo* mfi, mfPeerContext* context)
         //initialize screen capture\r
                if (mfi->peerCount == 0)\r
         {\r
+            mf_mlion_display_info(&mfi->servscreen_width, &mfi->servscreen_height, &mfi->scale);\r
             mf_mlion_screen_updates_init();\r
             mf_mlion_start_getting_screen_updates();\r
         }\r
index 58aa379..0f2a6cb 100644 (file)
@@ -93,7 +93,7 @@ struct mf_info
        freerdp_peer** peers;
        //BOOL mirrorDriverActive;
        unsigned int framesWaiting;
-    int scale;
+    UINT32 scale;
     
        //HANDLE snd_mutex;
        //BOOL snd_stop;
index d8f700c..d70a6a2 100644 (file)
@@ -54,7 +54,6 @@ void (^streamHandler)(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisp
         
         RFX_RECT rect;
         unsigned long offset_beg;
-        unsigned long surflen;
         unsigned long stride;
 
         rect.x = 0;
@@ -103,6 +102,29 @@ void (^streamHandler)(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisp
     dispatch_semaphore_signal(region_sem);
 };
 
+int mf_mlion_display_info(UINT32* disp_width, UINT32* disp_height, UINT32* scale)
+{
+    CGDirectDisplayID display_id;
+    
+    display_id = CGMainDisplayID();
+    
+    CGDisplayModeRef mode = CGDisplayCopyDisplayMode(display_id);
+    
+    size_t pixelWidth = CGDisplayModeGetPixelWidth(mode);
+    size_t pixelHeight = CGDisplayModeGetPixelHeight(mode);
+    
+    size_t wide = CGDisplayPixelsWide(display_id);
+    size_t high = CGDisplayPixelsHigh(display_id);
+    
+    CGDisplayModeRelease(mode);
+    
+    *disp_width = wide;//pixelWidth;
+    *disp_height = high;//pixelHeight;
+    *scale = pixelWidth / wide;
+    
+    return 0;
+}
+
 int mf_mlion_screen_updates_init()
 {
     printf("mf_mlion_screen_updates_init()\n");
@@ -115,12 +137,11 @@ int mf_mlion_screen_updates_init()
     region_sem = dispatch_semaphore_create(1);
     data_sem = dispatch_semaphore_create(1);
  
-    CGDisplayModeRef mode = CGDisplayCopyDisplayMode(display_id);
+    UINT32 pixelWidth;
+    UINT32 pixelHeight;
+    UINT32 scale;
     
-    size_t pixelWidth = CGDisplayModeGetPixelWidth(mode);
-    size_t pixelHeight = CGDisplayModeGetPixelHeight(mode);
-    
-    CGDisplayModeRelease(mode);
+    mf_mlion_display_info(&pixelWidth, &pixelHeight, &scale);
     
     localBuf = malloc(pixelWidth * pixelHeight * 4);
 
@@ -132,58 +153,7 @@ int mf_mlion_screen_updates_init()
                                                     NULL,
                                                     screen_update_q,
                                                     streamHandler);
-    /*
-    
-    CFDictionaryRef opts;
-    
-    long ImageCompatibility;
-    long BitmapContextCompatibility;
-    
-    void * keys[3];
-    keys[0] = (void *) kCVPixelBufferCGImageCompatibilityKey;
-    keys[1] = (void *) kCVPixelBufferCGBitmapContextCompatibilityKey;
-    keys[2] = NULL;
-    
-    void * values[3];
-    values[0] = (void *) &ImageCompatibility;
-    values[1] = (void *) &BitmapContextCompatibility;
-    values[2] = NULL;
-    
-    opts = CFDictionaryCreate(kCFAllocatorDefault, (const void **) keys, (const void **) values, 2, NULL, NULL);
-    
-    if (opts == NULL)
-    {
-        printf("failed to create dictionary\n");
-        //return 1;
-    }
-    
-    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, pixelWidth,
-                                          pixelHeight,  kCVPixelFormatType_32ARGB, opts,
-                                          &pxbuffer);
-    
-    if (status != kCVReturnSuccess)
-    {
-        printf("Failed to create pixel buffer! \n");
-        //return 1;
-    }
-    
-    CFRelease(opts);
-    
-    CVPixelBufferLockBaseAddress(pxbuffer, 0);
-    baseAddress = CVPixelBufferGetBaseAddress(pxbuffer);
-    
-    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
 
-    bitmapcontext = CGBitmapContextCreate(baseAddress,
-                                                 pixelWidth,
-                                                 pixelHeight, 8, 4*pixelWidth, rgbColorSpace,
-                                                 kCGImageAlphaNoneSkipLast);
-    
-    if (bitmapcontext == NULL) {
-        printf("context = null!!!\n\n\n");
-    }
-    CGColorSpaceRelease(rgbColorSpace);
-    */
     
     return 0;
     
@@ -246,7 +216,7 @@ int mf_mlion_peek_dirty_region(RFX_RECT* invalid)
     
     const CGRect * rects = CGDisplayStreamUpdateGetRects(lastUpdate, kCGDisplayStreamUpdateDirtyRects, &num_rects);
     
-    printf("\trectangles: %zd\n", num_rects);
+    //printf("\trectangles: %zd\n", num_rects);
     
     if (num_rects == 0) {
         //dispatch_semaphore_signal(region_sem);
@@ -269,18 +239,13 @@ int mf_mlion_peek_dirty_region(RFX_RECT* invalid)
 
 int mf_mlion_clear_dirty_region()
 {
-   /* dispatch_semaphore_wait(region_sem, DISPATCH_TIME_FOREVER);
-
-    clean = TRUE;
-    dirtyRegion.size.width = 0;
-    dirtyRegion.size.height = 0;
-    
-    dispatch_semaphore_signal(region_sem);
-    */
+    dispatch_semaphore_wait(region_sem, DISPATCH_TIME_FOREVER);
     
     CFRelease(lastUpdate);
     lastUpdate = NULL;
     
+    dispatch_semaphore_signal(region_sem);
+    
     
     return 0;
 }
index d370d6c..fb63424 100644 (file)
@@ -23,6 +23,8 @@
 #include <freerdp/codec/rfx.h>
 
 
+int mf_mlion_display_info(UINT32* disp_width, UINT32* dispHeight, UINT32* scale);
+
 int mf_mlion_screen_updates_init();
 
 int mf_mlion_start_getting_screen_updates();
index 2e737ec..146665d 100644 (file)
@@ -89,9 +89,7 @@ BOOL mf_peer_check_fds(freerdp_peer* client)
                else if (event->type == MF_EVENT_TYPE_FRAME_TICK)\r
                {\r
                        event = mf_event_pop(info_event_queue);\r
-            \r
-            printf("Tick\n");\r
-            \r
+                        \r
             mf_peer_rfx_update(client);\r
             \r
                        mf_event_free(event);\r
@@ -164,7 +162,6 @@ void mf_peer_rfx_update(freerdp_peer* client)
        cmd->bitmapData = stream_get_head(s);\r
     \r
     //send\r
-    printf("send\n");\r
     \r
        update->SurfaceBits(update->context, cmd);\r
     \r
@@ -252,9 +249,9 @@ void mf_peer_init(freerdp_peer* client)
     if(info_timer)\r
     {\r
         //printf("created timer\n");\r
-        dispatch_source_set_timer(info_timer, DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC, 100ull * NSEC_PER_MSEC);\r
+        dispatch_source_set_timer(info_timer, DISPATCH_TIME_NOW, 41ull * NSEC_PER_MSEC, 100ull * NSEC_PER_MSEC);\r
         dispatch_source_set_event_handler(info_timer, ^{\r
-            printf("dispatch\n");\r
+            //printf("dispatch\n");\r
             mfEvent* event = mf_event_new(MF_EVENT_TYPE_FRAME_TICK);\r
             mf_event_push(info_event_queue, (mfEvent*) event);}\r
                                           );\r
@@ -283,8 +280,8 @@ BOOL mf_peer_post_connect(freerdp_peer* client)
     mfInfo* mfi = mf_info_get_instance();\r
     mfi->scale = 1;\r
     \r
-    mfi->servscreen_width = 2880 / mfi->scale;\r
-    mfi->servscreen_height = 1800 / mfi->scale;\r
+    //mfi->servscreen_width = 2880 / mfi->scale;\r
+    //mfi->servscreen_height = 1800 / mfi->scale;\r
     UINT32 bitsPerPixel = 32;\r
     \r
     if ((settings->DesktopWidth != mfi->servscreen_width) || (settings->DesktopHeight != mfi->servscreen_height))\r