int shadow_encoder_init_rfx(rdpShadowEncoder* encoder) { rdpContext* context = (rdpContext*) encoder->client; rdpSettings* settings = context->settings; if (!encoder->rfx) encoder->rfx = rfx_context_new(TRUE); if (!encoder->rfx) goto fail; if (!rfx_context_reset(encoder->rfx, encoder->width, encoder->height)) goto fail; encoder->rfx->mode = RLGR3; encoder->rfx->width = encoder->width; encoder->rfx->height = encoder->height; rfx_context_set_pixel_format(encoder->rfx, RDP_PIXEL_FORMAT_B8G8R8A8); encoder->fps = 16; encoder->maxFps = 32; encoder->frameId = 0; encoder->lastAckframeId = 0; encoder->frameAck = settings->SurfaceFrameMarkerEnabled; encoder->codecs |= FREERDP_CODEC_REMOTEFX; return 1; fail: rfx_context_free(encoder->rfx); return -1; }
void wf_update_encoder_reset(wfInfo* wfi) { if (wf_info_lock(wfi) > 0) { printf("Resetting encoder\n"); if (wfi->rfx_context) { rfx_context_reset(wfi->rfx_context); } else { wfi->rfx_context = rfx_context_new(); wfi->rfx_context->mode = RLGR3; wfi->rfx_context->width = wfi->width; wfi->rfx_context->height = wfi->height; rfx_context_set_pixel_format(wfi->rfx_context, RDP_PIXEL_FORMAT_B8G8R8A8); wfi->s = stream_new(0xFFFF); } wf_info_invalidate_full_screen(wfi); wf_info_unlock(wfi); } }
BOOL tf_peer_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { freerdp_peer* client = input->context->peer; rdpUpdate* update = client->update; testPeerContext* context = (testPeerContext*) input->context; WLog_DBG(TAG, "Client sent a keyboard event (flags:0x%04"PRIX16" code:0x%04"PRIX16")", flags, code); if ((flags & 0x4000) && code == 0x22) /* 'g' key */ { if (client->settings->DesktopWidth != 800) { client->settings->DesktopWidth = 800; client->settings->DesktopHeight = 600; } else { client->settings->DesktopWidth = SAMPLE_SERVER_DEFAULT_WIDTH; client->settings->DesktopHeight = SAMPLE_SERVER_DEFAULT_HEIGHT; } if (!rfx_context_reset(context->rfx_context, client->settings->DesktopWidth, client->settings->DesktopHeight)) return FALSE; update->DesktopResize(update->context); context->activated = FALSE; } else if ((flags & 0x4000) && code == 0x2E) /* 'c' key */ { if (context->debug_channel) { ULONG written; WTSVirtualChannelWrite(context->debug_channel, (PCHAR) "test2", 5, &written); } } else if ((flags & 0x4000) && code == 0x2D) /* 'x' key */ { client->Close(client); } else if ((flags & 0x4000) && code == 0x13) /* 'r' key */ { if (!context->audin_open) { context->audin->Open(context->audin); context->audin_open = TRUE; } else { context->audin->Close(context->audin); context->audin_open = FALSE; } } else if ((flags & 0x4000) && code == 0x1F) /* 's' key */ { } return TRUE; }
BOOL mf_peer_activate(freerdp_peer* client) { mfPeerContext* context = (mfPeerContext*) client->context; rfx_context_reset(context->rfx_context); context->activated = TRUE; return TRUE; }
boolean tf_peer_activate(freerdp_peer* client) { testPeerContext* context = (testPeerContext*) client->context; rfx_context_reset(context->rfx_context); context->activated = true; if (test_pcap_file != NULL) { client->update->dump_rfx = true; tf_peer_dump_rfx(client); } else { test_peer_draw_background(client); } return true; }
static int shadow_encoder_init_rfx(rdpShadowEncoder* encoder) { if (!encoder->rfx) encoder->rfx = rfx_context_new(TRUE); if (!encoder->rfx) goto fail; if (!rfx_context_reset(encoder->rfx, encoder->width, encoder->height)) goto fail; encoder->rfx->mode = encoder->server->rfxMode; rfx_context_set_pixel_format(encoder->rfx, PIXEL_FORMAT_BGRX32); encoder->codecs |= FREERDP_CODEC_REMOTEFX; return 1; fail: rfx_context_free(encoder->rfx); return -1; }
BOOL test_peer_context_new(freerdp_peer* client, testPeerContext* context) { if (!(context->rfx_context = rfx_context_new(TRUE))) goto fail_rfx_context; if (!rfx_context_reset(context->rfx_context, SAMPLE_SERVER_DEFAULT_WIDTH, SAMPLE_SERVER_DEFAULT_HEIGHT)) goto fail_rfx_context; context->rfx_context->mode = RLGR3; rfx_context_set_pixel_format(context->rfx_context, PIXEL_FORMAT_RGB24); if (!(context->nsc_context = nsc_context_new())) goto fail_nsc_context; nsc_context_set_pixel_format(context->nsc_context, PIXEL_FORMAT_RGB24); if (!(context->s = Stream_New(NULL, 65536))) goto fail_stream_new; context->icon_x = -1; context->icon_y = -1; context->vcm = WTSOpenServerA((LPSTR) client->context); if (!context->vcm || context->vcm == INVALID_HANDLE_VALUE) goto fail_open_server; return TRUE; fail_open_server: context->vcm = NULL; Stream_Free(context->s, TRUE); context->s = NULL; fail_stream_new: nsc_context_free(context->nsc_context); context->nsc_context = NULL; fail_nsc_context: rfx_context_free(context->rfx_context); context->rfx_context = NULL; fail_rfx_context: return FALSE; }
BOOL tf_peer_activate(freerdp_peer* client) { testPeerContext* context = (testPeerContext*) client->context; rfx_context_reset(context->rfx_context); context->activated = TRUE; //client->settings->CompressionLevel = PACKET_COMPR_TYPE_8K; //client->settings->CompressionLevel = PACKET_COMPR_TYPE_64K; //client->settings->CompressionLevel = PACKET_COMPR_TYPE_RDP6; client->settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61; if (test_pcap_file != NULL) { client->update->dump_rfx = TRUE; tf_peer_dump_rfx(client); } else { test_peer_draw_background(client); } return TRUE; }
BOOL freerdp_client_codecs_reset(rdpCodecs* codecs, UINT32 flags, UINT32 width, UINT32 height) { BOOL rc = TRUE; if (!freerdp_client_codecs_prepare(codecs, flags)) return FALSE; if (flags & FREERDP_CODEC_INTERLEAVED) { if (codecs->interleaved) { rc &= bitmap_interleaved_context_reset(codecs->interleaved); } } if (flags & FREERDP_CODEC_PLANAR) { if (codecs->planar) { rc &= freerdp_bitmap_planar_context_reset(codecs->planar); } } if (flags & FREERDP_CODEC_NSCODEC) { if (codecs->nsc) { rc &= nsc_context_reset(codecs->nsc, width, height); } } if (flags & FREERDP_CODEC_REMOTEFX) { if (codecs->rfx) { rc &= rfx_context_reset(codecs->rfx, width, height); } } if (flags & FREERDP_CODEC_CLEARCODEC) { if (codecs->clear) { rc &= clear_context_reset(codecs->clear); } } if (flags & FREERDP_CODEC_ALPHACODEC) { } if (flags & FREERDP_CODEC_PROGRESSIVE) { if (codecs->progressive) { rc &= progressive_context_reset(codecs->progressive); } } if (flags & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444)) { if (codecs->h264) { rc &= h264_context_reset(codecs->h264, width, height); } } return rc; }
BOOL freerdp_client_codecs_reset(rdpCodecs* codecs, UINT32 flags) { if (flags & FREERDP_CODEC_INTERLEAVED) { if (codecs->interleaved) { bitmap_interleaved_context_reset(codecs->interleaved); } } if (flags & FREERDP_CODEC_PLANAR) { if (codecs->planar) { freerdp_bitmap_planar_context_reset(codecs->planar); } } if (flags & FREERDP_CODEC_NSCODEC) { if (codecs->nsc) { nsc_context_reset(codecs->nsc); } } if (flags & FREERDP_CODEC_REMOTEFX) { if (codecs->rfx) { rfx_context_reset(codecs->rfx); } } if (flags & FREERDP_CODEC_CLEARCODEC) { if (codecs->clear) { clear_context_reset(codecs->clear); } } if (flags & FREERDP_CODEC_ALPHACODEC) { } if (flags & FREERDP_CODEC_PROGRESSIVE) { if (codecs->progressive) { progressive_context_reset(codecs->progressive); } } if (flags & FREERDP_CODEC_H264) { if (codecs->h264) { h264_context_reset(codecs->h264); } } return TRUE; }
BOOL tf_peer_post_connect(freerdp_peer* client) { testPeerContext* context = (testPeerContext*) client->context; /** * This callback is called when the entire connection sequence is done, i.e. we've received the * Font List PDU from the client and sent out the Font Map PDU. * The server may start sending graphics output and receiving keyboard/mouse input after this * callback returns. */ WLog_DBG(TAG, "Client %s is activated (osMajorType %"PRIu32" osMinorType %"PRIu32")", client->local ? "(local)" : client->hostname, client->settings->OsMajorType, client->settings->OsMinorType); if (client->settings->AutoLogonEnabled) { WLog_DBG(TAG, " and wants to login automatically as %s\\%s", client->settings->Domain ? client->settings->Domain : "", client->settings->Username); /* A real server may perform OS login here if NLA is not executed previously. */ } WLog_DBG(TAG, ""); WLog_DBG(TAG, "Client requested desktop: %"PRIu32"x%"PRIu32"x%"PRIu32"", client->settings->DesktopWidth, client->settings->DesktopHeight, client->settings->ColorDepth); #if (SAMPLE_SERVER_USE_CLIENT_RESOLUTION == 1) if (!rfx_context_reset(context->rfx_context, client->settings->DesktopWidth, client->settings->DesktopHeight)) return FALSE; WLog_DBG(TAG, "Using resolution requested by client."); #else client->settings->DesktopWidth = context->rfx_context->width; client->settings->DesktopHeight = context->rfx_context->height; WLog_DBG(TAG, "Resizing client to %"PRIu32"x%"PRIu32"", client->settings->DesktopWidth, client->settings->DesktopHeight); client->update->DesktopResize(client->update->context); #endif /* A real server should tag the peer as activated here and start sending updates in main loop. */ if (!test_peer_load_icon(client)) { WLog_DBG(TAG, "Unable to load icon"); return FALSE; } if (WTSVirtualChannelManagerIsChannelJoined(context->vcm, "rdpdbg")) { context->debug_channel = WTSVirtualChannelOpen(context->vcm, WTS_CURRENT_SESSION, "rdpdbg"); if (context->debug_channel != NULL) { WLog_DBG(TAG, "Open channel rdpdbg."); if (!(context->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL))) { WLog_ERR(TAG, "Failed to create stop event"); return FALSE; } if (!(context->debug_channel_thread = CreateThread(NULL, 0, tf_debug_channel_thread_func, (void*) context, 0, NULL))) { WLog_ERR(TAG, "Failed to create debug channel thread"); CloseHandle(context->stopEvent); context->stopEvent = NULL; return FALSE; } } } if (WTSVirtualChannelManagerIsChannelJoined(context->vcm, "rdpsnd")) { sf_peer_rdpsnd_init(context); /* Audio Output */ } if (WTSVirtualChannelManagerIsChannelJoined(context->vcm, "encomsp")) { sf_peer_encomsp_init(context); /* Lync Multiparty */ } /* Dynamic Virtual Channels */ sf_peer_audin_init(context); /* Audio Input */ /* Return FALSE here would stop the execution of the peer main loop. */ return TRUE; }