From 12179037031484c3469fd5128a7028c1f520fba0 Mon Sep 17 00:00:00 2001 From: markmental Date: Sun, 29 Mar 2026 14:58:13 -0400 Subject: [PATCH 01/10] Bundle assets into the appimage build --- build-appimage.sh | 8 ++++++++ src/ui.c | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/build-appimage.sh b/build-appimage.sh index 1d11705..31b7128 100755 --- a/build-appimage.sh +++ b/build-appimage.sh @@ -33,6 +33,14 @@ mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps cp passport-c-media-player AppDir/usr/bin/ chmod +x AppDir/usr/bin/passport-c-media-player +# Copy bundled resources (font and logo for AppImage) +if [ -f "BigBlueTermPlusNerdFontMono-Regular.ttf" ]; then + cp BigBlueTermPlusNerdFontMono-Regular.ttf AppDir/usr/bin/ +fi +if [ -f "logo.png" ]; then + cp logo.png AppDir/usr/bin/ +fi + # Create desktop file directly in script (avoids copy conflicts) cat > AppDir/passport-c-media-player.desktop << 'EOF' [Desktop Entry] diff --git a/src/ui.c b/src/ui.c index b7d5416..a1e14c5 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1,6 +1,7 @@ #include "ui.h" #include +#include #include #include @@ -1198,6 +1199,8 @@ void ui_render_theme_picker(SDL_Renderer *renderer, active_theme->panel_text); } +static char *get_exe_dir(void); + int ui_cache_init(UiCache *cache, SDL_Renderer *renderer, const UiFonts *fonts, const ChannelList *channels) { char buffer[256]; @@ -1227,7 +1230,19 @@ int ui_cache_init(UiCache *cache, SDL_Renderer *renderer, const UiFonts *fonts, return -1; } - cache->logo_texture = load_png_texture(renderer, "logo.png", NULL, NULL); + { + char *exe_dir = get_exe_dir(); + if (exe_dir) { + char logo_path[512]; + snprintf(logo_path, sizeof(logo_path), "%slogo.png", exe_dir); + cache->logo_texture = load_png_texture(renderer, logo_path, NULL, NULL); + SDL_free(exe_dir); + } + + if (!cache->logo_texture) { + cache->logo_texture = load_png_texture(renderer, "logo.png", NULL, NULL); + } + } if (channels && channels->count > 0) { cache->channels = calloc((size_t) channels->count, sizeof(UiChannelCache)); @@ -1302,12 +1317,36 @@ void ui_cache_destroy(UiCache *cache) { memset(cache, 0, sizeof(*cache)); } +static char *get_exe_dir(void) { + return SDL_GetBasePath(); +} + int ui_load_fonts(UiFonts *fonts) { + char *exe_dir; + if (!fonts) { return -1; } memset(fonts, 0, sizeof(*fonts)); + + exe_dir = get_exe_dir(); + if (exe_dir) { + char font_path[512]; + snprintf(font_path, sizeof(font_path), "%sBigBlueTermPlusNerdFontMono-Regular.ttf", exe_dir); + + fonts->small = TTF_OpenFont(font_path, 13); + fonts->medium = TTF_OpenFont(font_path, 17); + fonts->large = TTF_OpenFont(font_path, 22); + + SDL_free(exe_dir); + + if (fonts->small && fonts->medium && fonts->large) { + return 0; + } + ui_destroy_fonts(fonts); + } + for (size_t i = 0; i < sizeof(FONT_CANDIDATES) / sizeof(FONT_CANDIDATES[0]); ++i) { fonts->small = TTF_OpenFont(FONT_CANDIDATES[i], 13); fonts->medium = TTF_OpenFont(FONT_CANDIDATES[i], 17); From 538c6768283da8be37a9cd20c090b10320469281 Mon Sep 17 00:00:00 2001 From: markmental Date: Sun, 29 Mar 2026 18:28:58 -0400 Subject: [PATCH 02/10] Adds aarch64 support to the build appimage script --- build-appimage.sh | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/build-appimage.sh b/build-appimage.sh index 31b7128..b49adcc 100755 --- a/build-appimage.sh +++ b/build-appimage.sh @@ -4,7 +4,6 @@ set -e APP_NAME="Passport-C-Media-Player" APP_VERSION="0.1" -OUTPUT_NAME="${APP_NAME}-${APP_VERSION}-x86_64.AppImage" # Colors for output RED='\033[0;31m' @@ -12,9 +11,29 @@ GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color +# Detect architecture +ARCH=$(uname -m) +case $ARCH in + x86_64) + LINUXDEPLOY_URL="https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" + LINUXDEPLOY_BIN="linuxdeploy-x86_64.AppImage" + ;; + aarch64|arm64) + LINUXDEPLOY_URL="https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20250213-2/linuxdeploy-aarch64.AppImage" + LINUXDEPLOY_BIN="linuxdeploy-aarch64.AppImage" + ;; + *) + echo -e "${RED}Error: Unsupported architecture: $ARCH${NC}" + echo -e "${RED}Supported architectures: x86_64, aarch64${NC}" + exit 1 + ;; +esac + +OUTPUT_NAME="${APP_NAME}-${APP_VERSION}-${ARCH}.AppImage" + rm -rf AppDir/ -echo -e "${GREEN}Building ${APP_NAME} AppImage...${NC}" +echo -e "${GREEN}Building ${APP_NAME} AppImage for ${ARCH}...${NC}" # Check if binary exists if [ ! -f "passport-c-media-player" ]; then @@ -71,15 +90,15 @@ ln -sf usr/bin/passport-c-media-player AppRun cd .. # Download linuxdeploy if not present -if [ ! -f "linuxdeploy-x86_64.AppImage" ]; then - echo -e "${GREEN}Downloading linuxdeploy...${NC}" - wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage - chmod +x linuxdeploy-x86_64.AppImage +if [ ! -f "${LINUXDEPLOY_BIN}" ]; then + echo -e "${GREEN}Downloading linuxdeploy for ${ARCH}...${NC}" + wget -q "${LINUXDEPLOY_URL}" -O "${LINUXDEPLOY_BIN}" + chmod +x "${LINUXDEPLOY_BIN}" fi # Build AppImage -echo -e "${GREEN}Creating AppImage...${NC}" -./linuxdeploy-x86_64.AppImage \ +echo -e "${GREEN}Creating AppImage for ${ARCH}...${NC}" +./"${LINUXDEPLOY_BIN}" \ --appdir AppDir \ --output appimage \ -d AppDir/usr/share/applications/passport-c-media-player.desktop \ From 56a802b5025e3126fab0054aa458548b0d91d872 Mon Sep 17 00:00:00 2001 From: markmental Date: Sun, 29 Mar 2026 18:57:42 -0400 Subject: [PATCH 03/10] refine README to mention the ARM build --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f675a05..9009c95 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Passport-C Media Player -Passport-C Media Player is a low-dependency SDL2 + FFmpeg prototype that recreates the 2004-era Passport DCT cable guide with live-seeking channels. +Passport-C Media Player is a low-dependency SDL2 + FFmpeg application that recreates the 2004-era Passport DCT cable guide with live-seeking channels. ## Features @@ -48,10 +48,17 @@ To create a portable AppImage that can run on any Linux distribution: make appimage ``` -This creates `Passport-C-Media-Player-0.1-x86_64.AppImage`, a self-contained executable that includes all dependencies. Users can run it directly: +This creates a self-contained executable that includes all dependencies. The script automatically detects your architecture and produces the appropriate AppImage: + +- **x86_64**: `Passport-C-Media-Player-0.1-x86_64.AppImage` +- **ARM64/aarch64**: `Passport-C-Media-Player-0.1-aarch64.AppImage` + +Users can run it directly: ```bash ./Passport-C-Media-Player-0.1-x86_64.AppImage +# or on ARM devices: +./Passport-C-Media-Player-0.1-aarch64.AppImage ``` For a fully portable setup, create a `media/` directory in the same folder as the AppImage and add your channel videos there. The AppImage will automatically detect and load channels from this directory. From ee8bf2dd0bad072efaa4ce8dc92c214e41e38caa Mon Sep 17 00:00:00 2001 From: markmental Date: Sun, 29 Mar 2026 22:36:02 -0400 Subject: [PATCH 04/10] Added i to bring up programming info --- README.md | 5 +++-- src/app.c | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9009c95..776083e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Passport-C Media Player +# FreePassport-C Media Player -Passport-C Media Player is a low-dependency SDL2 + FFmpeg application that recreates the 2004-era Passport DCT cable guide with live-seeking channels. +FreePassport-C Media Player is a low-dependency SDL2 + FFmpeg application that is based on the look of interactive programming guide software used on older Cisco/Scientific Atlanta Explorer cable boxes, it allows you to organize your media into a virtual cable guide with live-seeking channels. ## Features @@ -21,6 +21,7 @@ Passport-C Media Player is a low-dependency SDL2 + FFmpeg application that recre - `Up` / `Down` - surf channels - `Tab` - toggle guide +- `i` - show current channel info - `Esc` - exit guide or quit the app ## Build diff --git a/src/app.c b/src/app.c index c67c289..603f370 100644 --- a/src/app.c +++ b/src/app.c @@ -374,6 +374,11 @@ static void handle_event(App *app, const SDL_Event *event) { tune_relative(app, -1); } break; + case SDLK_i: + if (app->mode == MODE_FULLSCREEN) { + app->channel_banner_until = SDL_GetTicks() + CHANNEL_BANNER_DURATION_MS; + } + break; case SDLK_LEFT: browse_guide_time(app, -GUIDE_BROWSE_STEP_MINUTES); break; From 126469df76fd7114855f0d510bf9a49066ea9fd0 Mon Sep 17 00:00:00 2001 From: markmental Date: Sun, 29 Mar 2026 22:54:04 -0400 Subject: [PATCH 05/10] Touchup app naming to be more consistent --- build-appimage.sh | 6 +++--- src/app.c | 2 +- src/ui.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build-appimage.sh b/build-appimage.sh index b49adcc..4dfb307 100755 --- a/build-appimage.sh +++ b/build-appimage.sh @@ -2,7 +2,7 @@ set -e -APP_NAME="Passport-C-Media-Player" +APP_NAME="FreePassport-C-Media-Player" APP_VERSION="0.1" # Colors for output @@ -63,7 +63,7 @@ fi # Create desktop file directly in script (avoids copy conflicts) cat > AppDir/passport-c-media-player.desktop << 'EOF' [Desktop Entry] -Name=Passport-C Media Player +Name=FreePassport-C Media Player Comment=Turn your media library into an early 2000s cable box TV guide Exec=passport-c-media-player Icon=passport-c-media-player @@ -106,7 +106,7 @@ echo -e "${GREEN}Creating AppImage for ${ARCH}...${NC}" # Rename output file # Use wildcard to find whatever AppImage was created (handles underscore/dash variations) -for file in Passport*.AppImage; do +for file in FreePassport-C_Media_Player-*.AppImage; do if [ -f "$file" ]; then mv "$file" "${OUTPUT_NAME}" break diff --git a/src/app.c b/src/app.c index 603f370..dd8dbcc 100644 --- a/src/app.c +++ b/src/app.c @@ -428,7 +428,7 @@ int app_init(App *app) { return -1; } - app->window = SDL_CreateWindow("Passport-C Media Player", + app->window = SDL_CreateWindow("FreePassport-C Media Player", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, diff --git a/src/ui.c b/src/ui.c index a1e14c5..0ce6bc2 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1217,7 +1217,7 @@ int ui_cache_init(UiCache *cache, SDL_Renderer *renderer, const UiFonts *fonts, return -1; } - if (text_texture_init(&cache->no_media_title, renderer, fonts->large, "Passport-C Media Player", COLOR_TEXT_LIGHT) != 0 || + if (text_texture_init(&cache->no_media_title, renderer, fonts->large, "FreePassport-C Media Player", COLOR_TEXT_LIGHT) != 0 || text_texture_init(&cache->no_media_body, renderer, fonts->medium, "No channels found in ./media", COLOR_HIGHLIGHT_YELLOW) != 0 || text_texture_init(&cache->no_media_hint, renderer, fonts->small, "Add MP4 or MKV files to ./media and relaunch.", COLOR_PALE_BLUE) != 0 || text_texture_init(&cache->footer_a, renderer, fonts->medium, "A", COLOR_TEXT_DARK) != 0 || From f64429b7b4d87560525eab48c5de03f7e022fe0b Mon Sep 17 00:00:00 2001 From: markmental Date: Mon, 30 Mar 2026 12:09:11 -0400 Subject: [PATCH 06/10] Frame rendering optimizations --- Makefile | 4 ++ src/app.d | 8 +++ src/channel.d | 8 +++ src/frame_queue.c | 106 +++++++++++++++++++++++++++++++++- src/frame_queue.d | 2 + src/frame_queue.h | 20 ++++++- src/main.d | 8 +++ src/player.c | 143 ++++++++++++++++++++++++++++++++-------------- src/player.d | 4 ++ src/player.h | 5 ++ src/ui.d | 4 ++ 11 files changed, 268 insertions(+), 44 deletions(-) create mode 100644 src/app.d create mode 100644 src/channel.d create mode 100644 src/frame_queue.d create mode 100644 src/main.d create mode 100644 src/player.d create mode 100644 src/ui.d diff --git a/Makefile b/Makefile index 22334cc..dcb5403 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ CC ?= cc CSTD ?= -std=c11 CFLAGS ?= -O2 -Wall -Wextra -Wpedantic $(CSTD) +CFLAGS += -MMD -MP SDL_CFLAGS := $(shell pkg-config --cflags SDL2 SDL2_ttf SDL2_image 2>/dev/null) SDL_LIBS := $(shell pkg-config --libs SDL2 SDL2_ttf SDL2_image 2>/dev/null) @@ -19,6 +20,7 @@ endif SRC := $(wildcard src/*.c) OBJ := $(SRC:.c=.o) +DEP := $(OBJ:.o=.d) BIN := passport-c-media-player CPPFLAGS += -I./src $(SDL_CFLAGS) $(FFMPEG_CFLAGS) @@ -31,6 +33,8 @@ all: $(BIN) $(BIN): $(OBJ) $(CC) $(OBJ) -o $@ $(LDLIBS) +-include $(DEP) + run: $(BIN) ./$(BIN) diff --git a/src/app.d b/src/app.d new file mode 100644 index 0000000..708163b --- /dev/null +++ b/src/app.d @@ -0,0 +1,8 @@ +src/app.o: src/app.c src/app.h src/channel.h src/player.h \ + src/frame_queue.h src/theme.h src/ui.h +src/app.h: +src/channel.h: +src/player.h: +src/frame_queue.h: +src/theme.h: +src/ui.h: diff --git a/src/channel.d b/src/channel.d new file mode 100644 index 0000000..644d8f4 --- /dev/null +++ b/src/channel.d @@ -0,0 +1,8 @@ +src/channel.o: src/channel.c src/channel.h \ + /usr/include/i386-linux-gnu/sys/stat.h \ + /usr/include/i386-linux-gnu/bits/stat.h \ + /usr/include/i386-linux-gnu/bits/struct_stat.h +src/channel.h: +/usr/include/i386-linux-gnu/sys/stat.h: +/usr/include/i386-linux-gnu/bits/stat.h: +/usr/include/i386-linux-gnu/bits/struct_stat.h: diff --git a/src/frame_queue.c b/src/frame_queue.c index 0a49fd7..562e9d4 100644 --- a/src/frame_queue.c +++ b/src/frame_queue.c @@ -9,10 +9,114 @@ void frame_data_free(FrameData *frame) { return; } - av_freep(&frame->buffer); + if (frame->pool && frame->buffer) { + video_buffer_pool_release(frame->pool, frame->buffer); + } memset(frame, 0, sizeof(*frame)); } +int frame_queue_is_full(FrameQueue *queue) { + int full; + if (!queue || !queue->mutex) { + return 0; + } + SDL_LockMutex(queue->mutex); + full = (queue->count >= FRAME_QUEUE_CAPACITY); + SDL_UnlockMutex(queue->mutex); + return full; +} + +int video_buffer_pool_init(VideoBufferPool *pool) { + int i; + int yuv420p_size; + + if (!pool) { + return -1; + } + + memset(pool, 0, sizeof(*pool)); + pool->mutex = SDL_CreateMutex(); + if (!pool->mutex) { + return -1; + } + + yuv420p_size = TARGET_WIDTH * TARGET_HEIGHT * 3 / 2; + pool->buffer_size = yuv420p_size; + + for (i = 0; i < VIDEO_BUFFER_POOL_SIZE; i++) { + pool->buffers[i] = (unsigned char *)av_malloc(yuv420p_size + 32); + if (!pool->buffers[i]) { + video_buffer_pool_destroy(pool); + return -1; + } + pool->available[i] = 1; + } + + return 0; +} + +void video_buffer_pool_destroy(VideoBufferPool *pool) { + int i; + if (!pool) { + return; + } + + if (pool->mutex) { + SDL_LockMutex(pool->mutex); + } + + for (i = 0; i < VIDEO_BUFFER_POOL_SIZE; i++) { + if (pool->buffers[i]) { + av_freep(&pool->buffers[i]); + } + } + + if (pool->mutex) { + SDL_UnlockMutex(pool->mutex); + SDL_DestroyMutex(pool->mutex); + } + + memset(pool, 0, sizeof(*pool)); +} + +unsigned char *video_buffer_pool_acquire(VideoBufferPool *pool) { + unsigned char *buffer = NULL; + int i; + + if (!pool || !pool->mutex) { + return NULL; + } + + SDL_LockMutex(pool->mutex); + for (i = 0; i < VIDEO_BUFFER_POOL_SIZE; i++) { + if (pool->available[i]) { + pool->available[i] = 0; + buffer = pool->buffers[i]; + break; + } + } + SDL_UnlockMutex(pool->mutex); + + return buffer; +} + +void video_buffer_pool_release(VideoBufferPool *pool, unsigned char *buffer) { + int i; + + if (!pool || !pool->mutex || !buffer) { + return; + } + + SDL_LockMutex(pool->mutex); + for (i = 0; i < VIDEO_BUFFER_POOL_SIZE; i++) { + if (pool->buffers[i] == buffer) { + pool->available[i] = 1; + break; + } + } + SDL_UnlockMutex(pool->mutex); +} + int frame_queue_init(FrameQueue *queue) { if (!queue) { return -1; diff --git a/src/frame_queue.d b/src/frame_queue.d new file mode 100644 index 0000000..6e86a35 --- /dev/null +++ b/src/frame_queue.d @@ -0,0 +1,2 @@ +src/frame_queue.o: src/frame_queue.c src/frame_queue.h +src/frame_queue.h: diff --git a/src/frame_queue.h b/src/frame_queue.h index d4cdf1e..f4ec35a 100644 --- a/src/frame_queue.h +++ b/src/frame_queue.h @@ -1,12 +1,17 @@ #ifndef FRAME_QUEUE_H #define FRAME_QUEUE_H +#include #include -#define FRAME_QUEUE_CAPACITY 12 +#define FRAME_QUEUE_CAPACITY 6 +#define TARGET_WIDTH 640 +#define TARGET_HEIGHT 360 +#define VIDEO_BUFFER_POOL_SIZE 16 typedef struct FrameData { unsigned char *buffer; + struct VideoBufferPool *pool; unsigned char *plane_y; unsigned char *plane_u; unsigned char *plane_v; @@ -26,6 +31,13 @@ typedef struct FrameQueue { SDL_cond *cond; } FrameQueue; +typedef struct VideoBufferPool { + unsigned char *buffers[VIDEO_BUFFER_POOL_SIZE]; + int buffer_size; + int available[VIDEO_BUFFER_POOL_SIZE]; + SDL_mutex *mutex; +} VideoBufferPool; + int frame_queue_init(FrameQueue *queue); void frame_queue_destroy(FrameQueue *queue); void frame_queue_clear(FrameQueue *queue); @@ -34,5 +46,11 @@ int frame_queue_pop_latest(FrameQueue *queue, FrameData *out); int frame_queue_peek_first(FrameQueue *queue, FrameData *out); int frame_queue_pop_first(FrameQueue *queue, FrameData *out); void frame_data_free(FrameData *frame); +int frame_queue_is_full(FrameQueue *queue); + +int video_buffer_pool_init(VideoBufferPool *pool); +void video_buffer_pool_destroy(VideoBufferPool *pool); +unsigned char *video_buffer_pool_acquire(VideoBufferPool *pool); +void video_buffer_pool_release(VideoBufferPool *pool, unsigned char *buffer); #endif diff --git a/src/main.d b/src/main.d new file mode 100644 index 0000000..fd0decd --- /dev/null +++ b/src/main.d @@ -0,0 +1,8 @@ +src/main.o: src/main.c src/app.h src/channel.h src/player.h \ + src/frame_queue.h src/theme.h src/ui.h +src/app.h: +src/channel.h: +src/player.h: +src/frame_queue.h: +src/theme.h: +src/ui.h: diff --git a/src/player.c b/src/player.c index e30f03c..32d9c90 100644 --- a/src/player.c +++ b/src/player.c @@ -15,6 +15,8 @@ #include #include +#define AUDIO_BUFFER_SAMPLES 48000 + typedef struct DecoderThreadArgs { Player *player; const Channel *channel; @@ -180,13 +182,13 @@ static int player_ensure_audio_device(Player *player) { } static int queue_audio_frame(Player *player, - SwrContext **swr_context, - AVCodecContext *audio_codec_context, - AVRational audio_time_base, - AVFrame *audio_frame, - double pts_base_offset, - int *queued_any_audio) { - uint8_t **converted_data = NULL; + SwrContext **swr_context, + AVCodecContext *audio_codec_context, + AVRational audio_time_base, + AVFrame *audio_frame, + double pts_base_offset, + int *queued_any_audio) { + uint8_t *converted_data[1] = {NULL}; int out_rate; int out_channels; enum AVSampleFormat out_format; @@ -196,10 +198,10 @@ static int queue_audio_frame(Player *player, int sample_count; int buffer_size; int queued_limit; - int line_size = 0; int result; double audio_pts; double frame_duration; + int wait_ms = 2; if (!player || !audio_codec_context || !audio_frame) { return -1; @@ -236,34 +238,34 @@ static int queue_audio_frame(Player *player, audio_codec_context->sample_rate, AV_ROUND_UP); - if (av_samples_alloc_array_and_samples(&converted_data, - &line_size, - out_channels, - max_samples, - out_format, - 0) < 0) { - av_channel_layout_uninit(&out_layout); - player_set_error(player, "Unable to allocate audio buffer"); - return -1; + if (max_samples > player->audio_convert_buffer_samples) { + int new_size = max_samples * out_channels * sizeof(int16_t); + uint8_t *new_buffer = (uint8_t *)av_realloc(player->audio_convert_buffer, new_size); + if (!new_buffer) { + av_channel_layout_uninit(&out_layout); + player_set_error(player, "Unable to resize audio buffer"); + return -1; + } + player->audio_convert_buffer = new_buffer; + player->audio_convert_buffer_samples = max_samples; + player->audio_convert_buffer_size = new_size; } + converted_data[0] = player->audio_convert_buffer; + sample_count = swr_convert(*swr_context, converted_data, max_samples, (const uint8_t * const *) audio_frame->extended_data, audio_frame->nb_samples); if (sample_count < 0) { - av_freep(&converted_data[0]); - av_freep(&converted_data); av_channel_layout_uninit(&out_layout); player_set_error(player, "Audio resample failed"); return -1; } - buffer_size = av_samples_get_buffer_size(&line_size, out_channels, sample_count, out_format, 1); + buffer_size = sample_count * out_channels * sizeof(int16_t); if (buffer_size <= 0) { - av_freep(&converted_data[0]); - av_freep(&converted_data); av_channel_layout_uninit(&out_layout); return 0; } @@ -275,12 +277,11 @@ static int queue_audio_frame(Player *player, queued_limit = (int) (player_audio_bytes_per_second(player) * 0.18); while (!should_stop(player) && (int) SDL_GetQueuedAudioSize(player->audio_device) > queued_limit) { - SDL_Delay(2); + SDL_Delay(wait_ms); + wait_ms = (wait_ms < 10) ? wait_ms + 1 : 10; } - result = SDL_QueueAudio(player->audio_device, converted_data[0], (Uint32) buffer_size); - av_freep(&converted_data[0]); - av_freep(&converted_data); + result = SDL_QueueAudio(player->audio_device, player->audio_convert_buffer, (Uint32) buffer_size); if (result != 0) { av_channel_layout_uninit(&out_layout); @@ -403,8 +404,8 @@ static int decode_context_open(DecodeContext *ctx, const ProgramEntry *program, ctx->sws_context = sws_getContext(ctx->video_codec_context->width, ctx->video_codec_context->height, ctx->video_codec_context->pix_fmt, - ctx->video_codec_context->width, - ctx->video_codec_context->height, + TARGET_WIDTH, + TARGET_HEIGHT, AV_PIX_FMT_YUV420P, SWS_BILINEAR, NULL, @@ -612,30 +613,62 @@ static int decode_thread_main(void *userdata) { FrameData frame = {0}; uint8_t *dest_data[4] = {0}; int dest_linesize[4] = {0}; - int image_size; + int needs_conversion = 1; - frame.width = ctx.video_codec_context->width; - frame.height = ctx.video_codec_context->height; + while (!should_stop(player) && frame_queue_is_full(&player->frame_queue)) { + SDL_Delay(5); + } + if (should_stop(player)) { + break; + } + + frame.width = TARGET_WIDTH; + frame.height = TARGET_HEIGHT; frame.pts_seconds = frame_seconds; - image_size = av_image_alloc(dest_data, dest_linesize, frame.width, frame.height, AV_PIX_FMT_YUV420P, 1); - if (image_size < 0) { - player_set_error(player, "Unable to allocate frame buffer"); + + frame.buffer = video_buffer_pool_acquire(&player->video_buffer_pool); + if (!frame.buffer) { + player_set_error(player, "Unable to acquire frame buffer from pool"); goto cleanup; } - frame.buffer = dest_data[0]; + + frame.pool = &player->video_buffer_pool; + dest_data[0] = frame.buffer; + dest_data[1] = frame.buffer + (TARGET_WIDTH * TARGET_HEIGHT); + dest_data[2] = frame.buffer + (TARGET_WIDTH * TARGET_HEIGHT * 5 / 4); + dest_linesize[0] = TARGET_WIDTH; + dest_linesize[1] = TARGET_WIDTH / 2; + dest_linesize[2] = TARGET_WIDTH / 2; + + if (ctx.video_codec_context->width == TARGET_WIDTH && + ctx.video_codec_context->height == TARGET_HEIGHT && + ctx.video_codec_context->pix_fmt == AV_PIX_FMT_YUV420P) { + needs_conversion = 0; + } + + if (needs_conversion) { + sws_scale(ctx.sws_context, + (const uint8_t *const *) ctx.decoded_frame->data, + ctx.decoded_frame->linesize, + 0, + ctx.video_codec_context->height, + dest_data, + dest_linesize); + } else { + av_image_copy(dest_data, dest_linesize, + (const uint8_t *const *) ctx.decoded_frame->data, + ctx.decoded_frame->linesize, + AV_PIX_FMT_YUV420P, + TARGET_WIDTH, TARGET_HEIGHT); + } + frame.plane_y = dest_data[0]; frame.plane_u = dest_data[1]; frame.plane_v = dest_data[2]; frame.pitch_y = dest_linesize[0]; frame.pitch_u = dest_linesize[1]; frame.pitch_v = dest_linesize[2]; - sws_scale(ctx.sws_context, - (const uint8_t *const *) ctx.decoded_frame->data, - ctx.decoded_frame->linesize, - 0, - ctx.video_codec_context->height, - dest_data, - dest_linesize); + frame_queue_push(&player->frame_queue, &frame); queued_first_video = 1; MAYBE_MARK_PREROLL_READY(); @@ -696,6 +729,28 @@ int player_init(Player *player, const ChannelList *channels, Uint64 app_start_ti return -1; } + if (video_buffer_pool_init(&player->video_buffer_pool) != 0) { + frame_queue_destroy(&player->frame_queue); + SDL_DestroyMutex(player->audio_mutex); + SDL_DestroyMutex(player->clock_mutex); + SDL_DestroyMutex(player->error_mutex); + memset(player, 0, sizeof(*player)); + return -1; + } + + player->audio_convert_buffer_samples = AUDIO_BUFFER_SAMPLES; + player->audio_convert_buffer_size = AUDIO_BUFFER_SAMPLES * 2 * sizeof(int16_t); + player->audio_convert_buffer = (uint8_t *)av_malloc(player->audio_convert_buffer_size); + if (!player->audio_convert_buffer) { + video_buffer_pool_destroy(&player->video_buffer_pool); + frame_queue_destroy(&player->frame_queue); + SDL_DestroyMutex(player->audio_mutex); + SDL_DestroyMutex(player->clock_mutex); + SDL_DestroyMutex(player->error_mutex); + memset(player, 0, sizeof(*player)); + return -1; + } + return 0; } @@ -706,6 +761,10 @@ void player_destroy(Player *player) { player_stop_thread(player); player_close_audio(player); + video_buffer_pool_destroy(&player->video_buffer_pool); + if (player->audio_convert_buffer) { + av_freep(&player->audio_convert_buffer); + } frame_queue_destroy(&player->frame_queue); if (player->audio_mutex) { SDL_DestroyMutex(player->audio_mutex); diff --git a/src/player.d b/src/player.d new file mode 100644 index 0000000..8d072b6 --- /dev/null +++ b/src/player.d @@ -0,0 +1,4 @@ +src/player.o: src/player.c src/player.h src/channel.h src/frame_queue.h +src/player.h: +src/channel.h: +src/frame_queue.h: diff --git a/src/player.h b/src/player.h index 0568cf6..a9fe1be 100644 --- a/src/player.h +++ b/src/player.h @@ -1,6 +1,7 @@ #ifndef PLAYER_H #define PLAYER_H +#include #include #include @@ -9,6 +10,7 @@ typedef struct Player { FrameQueue frame_queue; + VideoBufferPool video_buffer_pool; SDL_Thread *thread; SDL_atomic_t stop_requested; const ChannelList *channels; @@ -27,6 +29,9 @@ typedef struct Player { char audio_driver[32]; SDL_mutex *error_mutex; char last_error[256]; + uint8_t *audio_convert_buffer; + int audio_convert_buffer_size; + int audio_convert_buffer_samples; } Player; int player_init(Player *player, const ChannelList *channels, Uint64 app_start_ticks); diff --git a/src/ui.d b/src/ui.d new file mode 100644 index 0000000..f011b0c --- /dev/null +++ b/src/ui.d @@ -0,0 +1,4 @@ +src/ui.o: src/ui.c src/ui.h src/channel.h src/theme.h +src/ui.h: +src/channel.h: +src/theme.h: From fe5fccbd027c6b28893fcae14f80bb7c02d1f7b0 Mon Sep 17 00:00:00 2001 From: markmental Date: Mon, 30 Mar 2026 12:23:19 -0400 Subject: [PATCH 07/10] More minimal preview view in the top right corner --- src/app.c | 25 +++++++++++++++++++++++++ src/app.h | 1 + src/theme.h | 4 ++-- src/ui.c | 50 ++++++++++++++++++++++++++++++++------------------ 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/src/app.c b/src/app.c index dd8dbcc..5075bb4 100644 --- a/src/app.c +++ b/src/app.c @@ -15,6 +15,7 @@ #define CHANNEL_BANNER_DURATION_MS 5000 #define CHANNEL_SWITCH_LOCK_DURATION_MS 7000 #define NUMERIC_INPUT_TIMEOUT_MS 1000 +#define GUIDE_PREVIEW_FRAME_INTERVAL_MS 83 static void configure_runtime_environment(void) { char runtime_dir[64]; @@ -66,6 +67,9 @@ static void destroy_video_texture(App *app) { app->texture_width = 0; app->texture_height = 0; } + if (app) { + app->last_guide_preview_update = 0; + } } static void begin_startup_handoff(App *app) { @@ -82,8 +86,25 @@ static int update_video_texture(App *app) { double sync_clock; double lead_tolerance; Uint64 now_ticks; + Uint32 update_ticks; + + if (!app) { + return -1; + } now_ticks = SDL_GetTicks64(); + update_ticks = (Uint32) now_ticks; + + if (app->mode == MODE_GUIDE && + app->video_texture && + update_ticks - app->last_guide_preview_update < GUIDE_PREVIEW_FRAME_INTERVAL_MS) { + if (app->startup_handoff_active && app->startup_handoff_until != 0 && SDL_GetTicks() >= app->startup_handoff_until) { + app->startup_handoff_active = 0; + app->startup_handoff_until = 0; + } + return 0; + } + sync_clock = player_get_sync_clock(&app->player, now_ticks); lead_tolerance = app->startup_handoff_active ? 0.240 : 0.060; @@ -119,6 +140,10 @@ static int update_video_texture(App *app) { frame.pitch_v); frame_data_free(&frame); + if (app->mode == MODE_GUIDE) { + app->last_guide_preview_update = update_ticks; + } + if (app->startup_handoff_active && app->startup_handoff_until != 0 && SDL_GetTicks() >= app->startup_handoff_until) { app->startup_handoff_active = 0; app->startup_handoff_until = 0; diff --git a/src/app.h b/src/app.h index f8d6912..5207292 100644 --- a/src/app.h +++ b/src/app.h @@ -24,6 +24,7 @@ typedef struct App { int startup_handoff_active; int last_blackout_state; Uint32 startup_handoff_until; + Uint32 last_guide_preview_update; Uint32 channel_banner_until; Uint32 channel_switch_lock_until; time_t app_start_time; diff --git a/src/theme.h b/src/theme.h index f321b30..9a4b52f 100644 --- a/src/theme.h +++ b/src/theme.h @@ -110,8 +110,8 @@ static const SDL_Color COLOR_PILL_SHADOW = {0x00, 0x00, 0x00, 0x40}; #define GUIDE_VISIBLE_ROWS 5 #define TIMELINE_VISIBLE_SECONDS (90.0 * 60.0) #define GUIDE_INFO_WIDTH 390 -#define GUIDE_PREVIEW_WIDTH 430 -#define GUIDE_PREVIEW_HEIGHT 194 +#define GUIDE_PREVIEW_WIDTH 240 +#define GUIDE_PREVIEW_HEIGHT 135 #define GUIDE_STATUS_HEIGHT 42 #define GUIDE_GRID_TOP 212 #define GUIDE_FOOTER_HEIGHT 54 diff --git a/src/ui.c b/src/ui.c index 0ce6bc2..cb64546 100644 --- a/src/ui.c +++ b/src/ui.c @@ -503,8 +503,14 @@ static void draw_mini_status_bar(SDL_Renderer *renderer, const Channel *selected_channel, const SDL_Rect *rect, time_t now_wall) { - char status_text[256]; + char clock_text[32]; + char channel_text[192]; + char fitted_channel_text[192]; SDL_Color text_color; + SDL_Rect time_rect; + SDL_Rect channel_rect; + int time_width = 0; + int gap = 8; if (!rect) { return; @@ -519,17 +525,31 @@ static void draw_mini_status_bar(SDL_Renderer *renderer, blend_color(theme->status_bottom, theme->status_mid, 220)); stroke_rect(renderer, rect, theme->panel_border); - if (selected_channel) { - char clock_text[32]; - format_time_compact(clock_text, sizeof(clock_text), now_wall); - snprintf(status_text, sizeof(status_text), "Time %s | Channel %s %d", clock_text, selected_channel->name, selected_channel->number); - } else { - char clock_text[32]; - format_time_compact(clock_text, sizeof(clock_text), now_wall); - snprintf(status_text, sizeof(status_text), "Time %s", clock_text); + format_time_compact(clock_text, sizeof(clock_text), now_wall); + if (TTF_SizeUTF8(font, clock_text, &time_width, NULL) != 0) { + time_width = rect->w / 3; } - draw_text_clipped(renderer, font, status_text, rect, rect->x + 10, rect->y + 4, text_color); + time_rect = (SDL_Rect){rect->x + 8, rect->y, SDL_min(time_width + 4, rect->w - 16), rect->h}; + draw_text_clipped(renderer, font, clock_text, &time_rect, time_rect.x, rect->y + 4, text_color); + + if (selected_channel) { + channel_rect = (SDL_Rect){time_rect.x + time_rect.w + gap, + rect->y, + rect->x + rect->w - (time_rect.x + time_rect.w + gap) - 8, + rect->h}; + if (channel_rect.w > 0) { + snprintf(channel_text, sizeof(channel_text), "%d %s", selected_channel->number, selected_channel->name); + fit_text_with_ellipsis(font, channel_text, channel_rect.w, fitted_channel_text, sizeof(fitted_channel_text)); + draw_text_clipped(renderer, + font, + fitted_channel_text, + &channel_rect, + channel_rect.x, + rect->y + 4, + text_color); + } + } } static void draw_info_panel(SDL_Renderer *renderer, @@ -661,13 +681,6 @@ static void draw_footer_legend(SDL_Renderer *renderer, } } -static void draw_scanline_overlay(SDL_Renderer *renderer, int width, int height, const GuideTheme *theme) { - (void) renderer; - (void) width; - (void) height; - (void) theme; -} - static void draw_channel_status_banner(SDL_Renderer *renderer, const UiFonts *fonts, const GuideTheme *theme, @@ -946,6 +959,8 @@ void ui_render_guide(SDL_Renderer *renderer, double guide_view_end_seconds = guide_view_start_seconds + TIMELINE_VISIBLE_SECONDS; double guide_focus_seconds = channel_schedule_elapsed_seconds(app_start_time, guide_focus_time); + (void) active_channel; + if (channels && channels->count > 0 && selected_channel >= 0 && selected_channel < channels->count) { selected_channel_ptr = &channels->items[selected_channel]; } @@ -1145,7 +1160,6 @@ void ui_render_guide(SDL_Renderer *renderer, } draw_footer_legend(renderer, fonts, theme, window_width, window_height, cache->logo_texture); - draw_scanline_overlay(renderer, window_width, window_height, theme); } void ui_render_theme_picker(SDL_Renderer *renderer, From 177933878b41c1af3d295edb96964e38f8fbc0d8 Mon Sep 17 00:00:00 2001 From: markmental Date: Mon, 30 Mar 2026 12:41:11 -0400 Subject: [PATCH 08/10] Adds bevel to preview panel --- src/theme.h | 2 +- src/ui.c | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/theme.h b/src/theme.h index 9a4b52f..a37b309 100644 --- a/src/theme.h +++ b/src/theme.h @@ -360,7 +360,7 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0x33,0xff,0x00,0xff}, .block_active_bottom = {0x15,0x6e,0x15,0xff}, .block_text = {0x33,0xff,0x00,0xff}, - .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_active_text = {0x00,0x00,0x00,0xff}, .block_border = {0x4a,0x8a,0x4a,0xff}, .block_active_border = {0x6a,0xff,0x4a,0xff}, .selection_edge = {0x33,0xff,0x00,0xff}, diff --git a/src/ui.c b/src/ui.c index cb64546..cefcd5f 100644 --- a/src/ui.c +++ b/src/ui.c @@ -195,13 +195,21 @@ static void draw_gloss_line(SDL_Renderer *renderer, const SDL_Rect *rect, SDL_Co } static void draw_panel_bevel(SDL_Renderer *renderer, const SDL_Rect *rect, SDL_Color gloss_color) { - SDL_Rect top_white = {rect->x + 8, rect->y, SDL_max(rect->w - 16, 0), 1}; - SDL_Rect top_black = {rect->x + 8, rect->y + 1, SDL_max(rect->w - 16, 0), 1}; + SDL_Rect top_highlight = {rect->x + 4, rect->y + 1, SDL_max(rect->w - 8, 0), 2}; + SDL_Rect left_highlight = {rect->x + 1, rect->y + 4, 2, SDL_max(rect->h - 8, 0)}; + SDL_Rect inner_shadow_top = {rect->x + 4, rect->y + 3, SDL_max(rect->w - 8, 0), 1}; + SDL_Rect right_shadow = {rect->x + rect->w - 3, rect->y + 3, 2, SDL_max(rect->h - 6, 0)}; + SDL_Rect bottom_shadow = {rect->x + 3, rect->y + rect->h - 3, SDL_max(rect->w - 6, 0), 2}; - if (top_white.w > 0) { - fill_rect_alpha(renderer, &top_white, color_with_alpha(gloss_color, 72)); - fill_rect_alpha(renderer, &top_black, (SDL_Color){0, 0, 0, 28}); + if (!rect || rect->w <= 6 || rect->h <= 6) { + return; } + + fill_rect_alpha(renderer, &top_highlight, color_with_alpha(gloss_color, 96)); + fill_rect_alpha(renderer, &left_highlight, color_with_alpha(gloss_color, 64)); + fill_rect_alpha(renderer, &inner_shadow_top, (SDL_Color){0, 0, 0, 34}); + fill_rect_alpha(renderer, &right_shadow, (SDL_Color){0, 0, 0, 56}); + fill_rect_alpha(renderer, &bottom_shadow, (SDL_Color){0, 0, 0, 64}); } static void stroke_rect_alpha(SDL_Renderer *renderer, const SDL_Rect *rect, SDL_Color color) { @@ -524,6 +532,7 @@ static void draw_mini_status_bar(SDL_Renderer *renderer, theme->status_mid, blend_color(theme->status_bottom, theme->status_mid, 220)); stroke_rect(renderer, rect, theme->panel_border); + draw_panel_bevel(renderer, rect, theme->gloss); format_time_compact(clock_text, sizeof(clock_text), now_wall); if (TTF_SizeUTF8(font, clock_text, &time_width, NULL) != 0) { @@ -578,6 +587,7 @@ static void draw_info_panel(SDL_Renderer *renderer, fill_rect(renderer, rect, theme->panel_fill); stroke_rect(renderer, rect, theme->panel_border); + draw_panel_bevel(renderer, rect, theme->gloss); accent = (SDL_Rect){rect->x + 1, rect->y + 1, rect->w - 2, 36}; fill_rect(renderer, &accent, blend_color(theme->panel_fill, theme->ribbon_mid, 40)); @@ -973,6 +983,8 @@ void ui_render_guide(SDL_Renderer *renderer, draw_info_panel(renderer, fonts, theme, selected_channel_ptr, &info_panel, app_start_time, guide_focus_time); draw_panel_shadow(renderer, &preview); fill_rect(renderer, &preview, COLOR_BLACK); + stroke_rect(renderer, &preview, theme->panel_border); + draw_panel_bevel(renderer, &preview, theme->gloss); draw_video(renderer, video_texture, texture_width, texture_height, preview); draw_mini_status_bar(renderer, fonts->small, theme, selected_channel_ptr, &mini_status_bar, now_wall); From 0a7e9dcdfb50fe5cbd2ce9200504b0f5a6b45360 Mon Sep 17 00:00:00 2001 From: markmental Date: Mon, 30 Mar 2026 13:07:06 -0400 Subject: [PATCH 09/10] Make channel banner a full bottom dock to better emulate a broadcast OSD --- src/theme.h | 7 +++++++ src/ui.c | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/theme.h b/src/theme.h index a37b309..92fbc48 100644 --- a/src/theme.h +++ b/src/theme.h @@ -112,6 +112,7 @@ static const SDL_Color COLOR_PILL_SHADOW = {0x00, 0x00, 0x00, 0x40}; #define GUIDE_INFO_WIDTH 390 #define GUIDE_PREVIEW_WIDTH 240 #define GUIDE_PREVIEW_HEIGHT 135 +#define GUIDE_TOP_SECTION_GAP 14 #define GUIDE_STATUS_HEIGHT 42 #define GUIDE_GRID_TOP 212 #define GUIDE_FOOTER_HEIGHT 54 @@ -119,6 +120,12 @@ static const SDL_Color COLOR_PILL_SHADOW = {0x00, 0x00, 0x00, 0x40}; #define GUIDE_X_START 258 #define GUIDE_INFO_HEIGHT 184 +#define CHANNEL_BANNER_HEIGHT 96 +#define CHANNEL_BANNER_PILL_WIDTH 280 +#define CHANNEL_BANNER_PADDING_X 18 +#define CHANNEL_BANNER_PADDING_Y 14 +#define CHANNEL_BANNER_DIVIDER_GAP 14 + #define GUIDE_THEME_COUNT 10 static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { diff --git a/src/ui.c b/src/ui.c index cefcd5f..2480a54 100644 --- a/src/ui.c +++ b/src/ui.c @@ -664,6 +664,7 @@ static void draw_footer_legend(SDL_Renderer *renderer, blend_color(theme->footer_bottom, theme->footer_mid, 240)); draw_gloss_line(renderer, &footer, color_with_alpha(theme->gloss, 20)); stroke_rect(renderer, &footer, theme->panel_border); + draw_panel_bevel(renderer, &footer, theme->gloss); draw_pill_button(renderer, theme, &chip, theme->panel_fill, theme->panel_border); draw_text_clipped(renderer, fonts->small, "A", &footer, chip.x + 11, chip.y + 2, footer_text); @@ -706,6 +707,9 @@ static void draw_channel_status_banner(SDL_Renderer *renderer, SDL_Rect banner; SDL_Rect channel_pill; SDL_Rect info_clip; + int banner_padding_x; + int banner_padding_y; + int divider_x; SDL_Color banner_text; SDL_Color sub_text; char channel_text[96]; @@ -731,13 +735,18 @@ static void draw_channel_status_banner(SDL_Renderer *renderer, return; } - banner = (SDL_Rect){window_width / 2 - 360, window_height - 92, 720, 64}; - if (banner.x < 24) { - banner.x = 24; - banner.w = window_width - 48; - } - channel_pill = (SDL_Rect){banner.x + 10, banner.y + 10, 210, banner.h - 20}; - info_clip = (SDL_Rect){channel_pill.x + channel_pill.w + 14, banner.y + 8, banner.w - channel_pill.w - 28, banner.h - 16}; + banner_padding_x = CHANNEL_BANNER_PADDING_X; + banner_padding_y = CHANNEL_BANNER_PADDING_Y; + banner = (SDL_Rect){0, window_height - CHANNEL_BANNER_HEIGHT, window_width, CHANNEL_BANNER_HEIGHT}; + channel_pill = (SDL_Rect){banner.x + banner_padding_x, + banner.y + banner_padding_y, + CHANNEL_BANNER_PILL_WIDTH, + banner.h - (banner_padding_y * 2)}; + divider_x = channel_pill.x + channel_pill.w + CHANNEL_BANNER_DIVIDER_GAP; + info_clip = (SDL_Rect){divider_x + CHANNEL_BANNER_DIVIDER_GAP, + banner.y + banner_padding_y, + banner.w - (divider_x + CHANNEL_BANNER_DIVIDER_GAP) - banner_padding_x, + banner.h - (banner_padding_y * 2)}; banner_text = ensure_contrast(theme->ribbon_text, theme->status_mid); sub_text = ensure_contrast(theme->row_subtext, theme->status_mid); @@ -758,6 +767,7 @@ static void draw_channel_status_banner(SDL_Renderer *renderer, color_with_alpha(theme->gloss, 42), theme->panel_border); stroke_rect(renderer, &banner, theme->panel_border); + draw_panel_bevel(renderer, &banner, theme->gloss); if (numeric_input_length > 0 || numeric_input_invalid) { SDL_Color accent_fill = theme->ribbon_mid; @@ -793,23 +803,23 @@ static void draw_channel_status_banner(SDL_Renderer *renderer, set_draw_color(renderer, theme->status_divider); SDL_RenderDrawLine(renderer, - channel_pill.x + channel_pill.w + 6, - banner.y + 10, - channel_pill.x + channel_pill.w + 6, - banner.y + banner.h - 10); + divider_x, + banner.y + banner_padding_y, + divider_x, + banner.y + banner.h - banner_padding_y); draw_text_clipped(renderer, fonts->medium, program->program_title, &info_clip, info_clip.x, - banner.y + 10, + banner.y + 18, banner_text); draw_text_clipped(renderer, fonts->small, time_range, &info_clip, info_clip.x, - banner.y + 36, + banner.y + 52, sub_text); } @@ -949,11 +959,13 @@ void ui_render_guide(SDL_Renderer *renderer, int guide_x_start = (int) (GUIDE_X_START * scale_x); int sidebar_width = (int) (GUIDE_SIDEBAR_WIDTH * scale_x); int mini_status_height = (int) (26 * scale_y); + int top_section_gap = (int) (GUIDE_TOP_SECTION_GAP * scale_y); SDL_Rect full = {0, 0, window_width, window_height}; SDL_Rect info_panel = {0, 0, (int) (GUIDE_INFO_WIDTH * scale_x), (int) (GUIDE_INFO_HEIGHT * scale_y)}; SDL_Rect preview = {window_width - (int) (GUIDE_PREVIEW_WIDTH * scale_x), 0, (int) (GUIDE_PREVIEW_WIDTH * scale_x), (int) (GUIDE_PREVIEW_HEIGHT * scale_y)}; int mini_status_y = preview.y + preview.h; - int timeline_header_y = mini_status_y + mini_status_height; + int top_section_bottom = SDL_max(info_panel.y + info_panel.h, mini_status_y + mini_status_height); + int timeline_header_y = top_section_bottom + top_section_gap; int grid_y = timeline_header_y + (int) (GUIDE_STATUS_HEIGHT * scale_y); SDL_Rect mini_status_bar = {preview.x, mini_status_y, preview.w, mini_status_height}; SDL_Rect header_row = {0, timeline_header_y, window_width, (int) (GUIDE_STATUS_HEIGHT * scale_y)}; From c9da0bbefbb5486fa9756aeaa0c02dd520d57e8c Mon Sep 17 00:00:00 2001 From: markmental Date: Mon, 30 Mar 2026 14:11:30 -0400 Subject: [PATCH 10/10] asset cleanup --- screenshotguide.png | Bin 96296 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 screenshotguide.png diff --git a/screenshotguide.png b/screenshotguide.png deleted file mode 100644 index 4ed963beef04a9d7d1da730afaccc1d000850a28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96296 zcmeFZWmKD8w>BE26eyHn#Vy65xD>Y_#i0akae@{K6n7~EhoZruh0+kbxECuBpjdEe zu@-lik7s}H`##S;d!HZY|5;-sYmD5PBlntXu4~TgTI)`fwx%*6J~ci703dv!0@eip z9$*3hn8&#H?||v41={-#@2!fFI{@&w`>z*9D%WG0`wySKQ#5?%W$$e5;-zQ*&dCO# zZQ<_z*2V4JGX+Ks8*6(DMr|hx9~(Db&M8&^fD!NlET`vfy4~uP!J_POb|>{2(d3db z^C_E!naP?343tx0PLjjrqin6~#2_W0^nOEXhDAhFP0(^X(`!x>Mo5W8V(z93n(l~6 z#KQ^KS9yekA#d-+HveM*vT=P|(q^$c50@Zu{87Gnv`x2Qa;!Z?C@hMMN?iX^@U?WS2TP5RSK$(+-~#}3(M7Nc z1NntYxPr;Bb7vI!<#ml!tcS2(JM`XMwGv_BFs=&4uMD|*Qw$gvPJWY|XTbk5*tjP5 zZEG8bqvK|7?SrRK2Yvj%?lhkNuMs{G6fVX78gO;m_om&u&!>V)IL<@MhOYB;XO6sTb@B#yI4s~+js+;?+33b2;Jqh1B!N_1Lk(inU&;ZSK1#MzDG)kv~ z*Mol7_gZ)TuR|x#6kc=mB*8ZmB};cfsxaP<#NYWeNHY%kZV3gQ-Gg=-fx6m(9>V z$}NYIz@dBdRC7qzL~-i7g{($Z!G7`3o#|Wc?7`%re+Tkk@x0y4Oq2c3;0E^Nu>B|0 z!M}LG)t&$Ne#4_Ar?>xD4ZHIHPxGyrWf$HZ+S{uN$Q|os)SVG3iT4846Xe?N`<@H1 zj1_bxmDhBeNAIyLe$ufAoH63P9&rhB>hqFuKT5b=pNZW5)B5)fbm#sgN^3iQsAiVw z^dPtPxX4z+F#%~Cc1F2Am3y?7_u8lHbkNJG{W@}~{dgcK03CMPJf6wr*FF`n|6zl! zt}~=cIs0VxtZgrIFJS%QQsZxh3jdA*s4gE4!%24i!s)oz%^y4hz>#h1&L(frUEEne zs|}6PV2(_qMW5D_!T$I-OU>&A-lexagiAN)@q2;SkyHN1170#Ka&x${7Yspuc`x(4 zw_8omTpo!xYW(e*`NoX5-?k{1zvC<{^2RQn_S@$A4p*H$-^fS~ywX_s+_Kj5x$#AR z4)(b7n`wCFN3;F9^rgKmid>%ot9Xg4k@njTgWDUy$FIG>wd{}mW-r)m^063>!XMhc zhLg?HzdQSEdN8ltx_-BF`=AA}=-V%-C37~NJR-F|A>;jWZ@#|e_o~E}$BVyl3vW^S zF8>_*J3P{5k^i^xP*XACbB{oiYp>aXpyZ}GIgi0qgPY_0m3TW+*{r?0>qqVTCu$YV zr-ys~n~)6#nd7|ElD_uUr)C$Zlc`sp3!;lhyD~n@KWoKecJkV8Gu0}tF53y_F7`hM zU2Z-yJ(s9x+a6F0^xsjIzOEL0ToN|)^(6N0L@Pbu`f?}T>}*Z6eV0G7cVRWbcXD#- z)nOQe|HXQc^chCb{)Sn@Ch64e6+;f3;ixdd-=R;KA?R%UaodR6lE=cCbn}W|-sSP5 zgx73sj#|FQ<3yL=-n(234+CaSc0_M(kIW8TWXz^!Hizk2lU_5E`+1zV6Ra-H0wV?VAz;@-JQv-!vzf z9e3^Io!?UMUe`o2P!b6Tt>(SD*-5xwo>g-Rys~20zpA+XX28>S>OLan&b=VH9idUILvltExeydtbr{`Bvo9FJgr@cp} zM@`CKF@6MYTnD)X{649;+#%gPfQ<*;MSnCqx};d_0;Qk0*`N1%GYN^ z<)xbmx5W&1=B}?P2)+;Bc~2Px?wpxkAAdfUK5E-?%sVz<&y;I6pZggGM+Q>ky4u$SpdL#$!BT%BR1*t9O=K-Pei@UO#4ny-n(Co zpJlE}+3qgxd={$+@*9rta^Gzx?_La)uKpg^y4kCjxeRG{{nmB+b1+O9^KY^kM@Ep&eJz;PbSIp>-}%ZdA&CbTps<{JsqsL{PR

=N>*75}qP1Cl&PBeeItel$? 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 Xs$1F^vbzEGg6=D-D-`~2^6I|;TPZ${