diff options
| -rw-r--r-- | main.c | 38 | 
1 files changed, 23 insertions, 15 deletions
| @@ -17,6 +17,7 @@  #include <arpa/inet.h>  #include <errno.h> +#include <limits.h>  #include <netinet/in.h>  #include <netinet/tcp.h>  #include <poll.h> @@ -35,11 +36,9 @@  #include "toolbox/utils.h"  #include "window.h" -#define OVERLAY_WIDTH 256 -#define OVERLAY_HEIGHT 20 -  static volatile sig_atomic_t g_signal;  static void OnSignal(int status) { g_signal = status; } +static size_t overlay_width, overlay_height;  static void SocketDtor(int* sock) {    if (*sock == -1) return; @@ -147,6 +146,13 @@ static void DecodeContextDtor(struct DecodeContext** decode_context) {    *decode_context = NULL;  } +static void GetMaxOverlaySize(size_t* width, size_t* height) { +  char str[64]; +  snprintf(str, sizeof(str), "Bitrate: %zu.000 Mbps", SIZE_MAX / 1000); +  *width = PuiStringWidth(str) + 8; +  *height = 20; +} +  static void RenderOverlay(struct Overlay* overlay, uint64_t clock_delta,                            const struct DecodeStats* decode_stats) {    uint32_t* buffer = OverlayLock(overlay); @@ -155,20 +161,20 @@ static void RenderOverlay(struct Overlay* overlay, uint64_t clock_delta,      return;    } -  char bitrate[64]; -  snprintf(bitrate, sizeof(bitrate), "Bitrate: %zu Kbps", -           decode_stats->bitrate * 1000000 / clock_delta / 1024); -  size_t overlay_width = PuiStringWidth(bitrate) + 8; +  char str[64]; +  size_t bitrate = decode_stats->bitrate * 1000000 / clock_delta / 1024; +  snprintf(str, sizeof(str), "Bitrate: %zu.%03zu Mbps", bitrate / 1000, +           bitrate % 1000); +  size_t width = PuiStringWidth(str) + 8; -  memset(buffer, 0, OVERLAY_HEIGHT * OVERLAY_WIDTH * 4); -  for (size_t y = 0; y < OVERLAY_HEIGHT; y++) { -    for (size_t x = 0; x < overlay_width; x++) -      buffer[x + y * OVERLAY_WIDTH] = 0x40000000; +  memset(buffer, 0, overlay_width * overlay_height * 4); +  for (size_t y = 0; y < overlay_height; y++) { +    for (size_t x = 0; x < width; x++) +      buffer[x + y * overlay_width] = 0x40000000;    } -  PuiStringRender(bitrate, buffer + OVERLAY_WIDTH * 4 + 4, OVERLAY_WIDTH, -                  0xffffffff); - +  size_t voffset = overlay_width * 4; +  PuiStringRender(str, buffer + voffset + 4, overlay_width, 0xffffffff);    OverlayUnlock(overlay);  } @@ -217,7 +223,9 @@ int main(int argc, char* argv[]) {    struct Overlay __attribute__((cleanup(OverlayDtor)))* overlay = NULL;    if (stats) { -    overlay = OverlayCreate(window, 4, 4, OVERLAY_WIDTH, OVERLAY_HEIGHT); +    GetMaxOverlaySize(&overlay_width, &overlay_height); +    overlay = +        OverlayCreate(window, 4, 4, (int)overlay_width, (int)overlay_height);      if (!overlay) {        LOG("Failed to create overlay");        return EXIT_FAILURE; | 
