From 8c48f1d18b0af7b3eae998fa759590ef28e5ae30 Mon Sep 17 00:00:00 2001 From: leency Date: Sun, 19 Jul 2026 06:32:00 +0000 Subject: [PATCH] apps/fplay: major player updates, performance, usability and UI improvements, bugfixes (#560) Very briefly: - feat: add playback timer and MP3 album art support - feat: async file reading with adaptive cache for smoother playback - feat: smart frame skipping (preserves sync, prevents lags on slow drives) - feat: add OSD volume and Tab info overlay - feat: mouse wheel volume control, and basic hotkeys - feat: support >2GB files, automatic HW acceleration check - fix: crash/memory corruption on videos without audio or with unknown duration - fix: freeze issues and audio-video desync after seeking - fix: correct playback speed for silent videos and playback of files with corrupted timestamps - fix: auto-hide volume slider in narrow windows and restore window controls layout --------- Co-authored-by: Burer Reviewed-on: https://git.kolibrios.org/KolibriOS/kolibrios/pulls/560 Reviewed-by: Burer Reviewed-by: Mikhail Frolov Co-authored-by: leency --- contrib/media/fplay/app-dynamic.lds | 138 ++ contrib/media/fplay/audio.c | 7 +- contrib/media/fplay/build.sh | 129 ++ contrib/media/fplay/decoder.c | 50 +- contrib/media/fplay/fplay.c | 1258 ++++++++++++----- contrib/media/fplay/fplay.h | 8 +- contrib/media/fplay/opendial.asm | 2 + contrib/media/fplay/video.c | 1027 +++++++++++++- contrib/media/fplay/winlib/button.c | 23 +- contrib/media/fplay/winlib/caption.c | 6 +- contrib/media/fplay/winlib/fontlib.c | 45 +- contrib/media/fplay/winlib/panel.c | 114 ++ contrib/media/fplay/winlib/window.c | 12 + contrib/media/fplay/winlib/winlib.h | 2 + .../sources/Mesa/mesa-9.2.5/src/egl/Makefile | 5 +- .../Mesa/mesa-9.2.5/src/gallium/Makefile | 14 +- .../sources/Mesa/mesa-9.2.5/src/glsl/Makefile | 3 +- .../sources/Mesa/mesa-9.2.5/src/mapi/Makefile | 5 +- .../sources/Mesa/mesa-9.2.5/src/mesa/Makefile | 9 +- .../SDL-1.2.2_newlib/include/SDL_keysym.h | 1 + .../src/thread/SDL_sysmutex.c | 137 +- .../src/video/kolibrios/SDL_kolibri_events.c | 43 +- .../src/video/kolibrios/SDL_kolibri_video.c | 87 +- .../sdk/sources/ffmpeg/ffmpeg-2.8/library.mak | 3 +- .../sources/newlib/libc/include/kos32sys.h | 679 +++++++++ contrib/sdk/sources/pixlib-3/pixlib3.c | 48 +- contrib/sdk/sources/pixlib-3/pxgl.c | 3 - data/common/lib/pixlib-gl.dll | Bin 13568 -> 13312 bytes data/common/media/fplay | Bin 113781 -> 393328 bytes 29 files changed, 3265 insertions(+), 593 deletions(-) create mode 100644 contrib/media/fplay/app-dynamic.lds create mode 100644 contrib/media/fplay/build.sh create mode 100644 contrib/sdk/sources/newlib/libc/include/kos32sys.h diff --git a/contrib/media/fplay/app-dynamic.lds b/contrib/media/fplay/app-dynamic.lds new file mode 100644 index 000000000..045f53913 --- /dev/null +++ b/contrib/media/fplay/app-dynamic.lds @@ -0,0 +1,138 @@ +/*OUTPUT_FORMAT("binary")*/ +/* SEARCH_DIR("=/lib") */ +/* SEARCH_DIR("=/mingw32/lib") */ +ENTRY(__start) +SECTIONS +{ + .text 0x000000: + { + LONG(0x554e454D); + LONG(0x32305445); + LONG(1); + LONG(__start); + LONG(___iend); + LONG(___memsize); + LONG(___stacktop); + LONG(___cmdline); + LONG(___pgmname); /* full path */ + LONG(__subsystem__); + LONG(__idata_start) + LONG(__idata_end) + LONG(_main) + + *(.init) + *(.text) + *(SORT(.text$*)) + *(.text.*) + *(.glue_7t) + *(.glue_7) + ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; + LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0); + ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; + LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0); + *(.fini) + /* ??? Why is .gcc_exc here? */ + *(.gcc_exc) + PROVIDE (etext = .); + *(.gcc_except_table) + } + + .rdata ALIGN(16) : + { + *(.rdata) + *(SORT(.rdata$*)) + ___RUNTIME_PSEUDO_RELOC_LIST__ = .; + __RUNTIME_PSEUDO_RELOC_LIST__ = .; + *(.rdata_runtime_pseudo_reloc) + ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .; + __RUNTIME_PSEUDO_RELOC_LIST_END__ = .; + } + .CRT ALIGN(16) : + { + ___crt_xc_start__ = . ; + *(SORT(.CRT$XC*)) /* C initialization */ + ___crt_xc_end__ = . ; + ___crt_xi_start__ = . ; + *(SORT(.CRT$XI*)) /* C++ initialization */ + ___crt_xi_end__ = . ; + ___crt_xl_start__ = . ; + *(SORT(.CRT$XL*)) /* TLS callbacks */ + /* ___crt_xl_end__ is defined in the TLS Directory support code */ + ___crt_xp_start__ = . ; + *(SORT(.CRT$XP*)) /* Pre-termination */ + ___crt_xp_end__ = . ; + ___crt_xt_start__ = . ; + *(SORT(.CRT$XT*)) /* Termination */ + ___crt_xt_end__ = . ; + } + + .data ALIGN(16) : + { + PROVIDE ( __data_start__ = .) ; + *(.data) + *(.data2) + *(SORT(.data$*)) + *(.jcr) + __CRT_MT = .; + LONG(1); + PROVIDE ( __data_end__ = .) ; + *(.data_cygwin_nocopy) + ___iend = . ; + } + + .eh_frame BLOCK(16) : + { + PROVIDE (___EH_FRAME_BEGIN__ = .) ; + *(.eh_frame*) + ___FRAME_END__ = . ; + LONG(0); + } + + .idata ALIGN(16): + { + __idata_start = .; + SORT(*)(.idata$2) + SORT(*)(.idata$3) + /* These zeroes mark the end of the import list. */ + LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); + SORT(*)(.idata$4) + SORT(*)(.idata$5) + SORT(*)(.idata$6) + SORT(*)(.idata$7) + __idata_end = . ; + } + + bss ALIGN(16): + { + *(.bss) + *(COMMON) + . = ALIGN(16); + ___cmdline = .; + . = . + 256; + ___pgmname = .; + . = . + 1024 + 16; + ___stacktop = .; + ___memsize = . ; + } + + /DISCARD/ : + { + *(.debug$S) + *(.debug$T) + *(.debug$F) + *(.drectve) + *(.note.GNU-stack) + *(.comment) +/* *(.eh_frame) */ + *(.debug_abbrev) + *(.debug_info) + *(.debug_line) + *(.debug_frame) + *(.debug_loc) + *(.debug_pubnames) + *(.debug_aranges) + *(.debug_ranges) + } + +} + diff --git a/contrib/media/fplay/audio.c b/contrib/media/fplay/audio.c index c098befba..9c2f97e6a 100644 --- a/contrib/media/fplay/audio.c +++ b/contrib/media/fplay/audio.c @@ -305,7 +305,12 @@ int audio_thread(void *param) }; active = 1; sync_audio(hBuff, buffsize); - sound_state = PLAY; + /* Do NOT clobber a stop/pause command that arrived (e.g. a + * seek set PLAY_2_STOP) while we were restarting the buffer - + * only advance the PREPARE/resume path to PLAY. Otherwise the + * decoder's "wait for STOP" seek handshake would wait forever. */ + if(sound_state == PREPARE || sound_state == PAUSE_2_PLAY) + sound_state = PLAY; /* breaktrough */ diff --git a/contrib/media/fplay/build.sh b/contrib/media/fplay/build.sh new file mode 100644 index 000000000..899394e54 --- /dev/null +++ b/contrib/media/fplay/build.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +# +# Полная сборка FPlay (медиаплеер KolibriOS). +# Full build for the FPlay KolibriOS media player. +# +# Поднимает окружение kos32-тулчейна (PATH, fasm, путь к либам) и собирает +# ВСЕ объекты заново + линкует + objcopy в MENUET-бинарь. Голый `make` этого +# не делает: в Makefile нет -L и он ждёт тулчейн уже в PATH. +# +# Запуск из Git Bash / MSYS: +# ./build.sh - полная сборка (all) +# ./build.sh clean - удалить .o, бинарь, .map +# +# Пути можно переопределить переменными окружения, если тулчейн лежит иначе: +# TOOLCHAIN_BIN=... LIB_DIR=... FASM=... ./build.sh +# +set -u + +# --------------------------------------------------------------------------- +# Расположение инструментов (значения по умолчанию = как на этой машине) +# --------------------------------------------------------------------------- +TOOLCHAIN_BIN="${TOOLCHAIN_BIN:-/c/MinGW/msys/1.0/home/autobuild/tools/win32/bin}" +LIB_DIR="${LIB_DIR:-/c/MinGW/msys/1.0/home/autobuild/tools/win32/lib}" +FASM="${FASM:-/c/Kolibri/Infrastructure/C--/fasm.exe}" + +# Каталог скрипта = корень исходников fplay; работаем относительно него. +cd "$(dirname "$0")" || { echo "ERROR: cannot cd to script dir"; exit 1; } +SDK_DIR="$(cd ../../sdk && pwd)" || { echo "ERROR: SDK dir (../../sdk) not found"; exit 1; } + +export PATH="$TOOLCHAIN_BIN:$PATH" + +CC=kos32-gcc +LD=kos32-ld +OBJCOPY=kos32-objcopy +NAME=fplay + +# fasm: явный путь, иначе из PATH +if [ -x "$FASM" ]; then FASM_CMD="$FASM"; else FASM_CMD="fasm"; fi + +# --------------------------------------------------------------------------- +# Флаги (идентичны Makefile проекта) +# --------------------------------------------------------------------------- +CFLAGS="-U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fno-ident -std=c99 -fomit-frame-pointer -mno-ms-bitfields" +DEFINES="-DDEBUG=1 -D_GNU_SOURCE -DHAVE_VAAPI -DPACKAGE_NAME=\"Fplay-vaapi\"" +INCLUDES="-I. -I$SDK_DIR/sources/newlib/libc/include -I$SDK_DIR/sources/ffmpeg/ffmpeg-2.8" +INCLUDES="$INCLUDES -I$SDK_DIR/sources/freetype/include -I$SDK_DIR/sources/vaapi/libva-1.6.2" + +LIBS="-lavdevice.dll -lavformat.dll -lavcodec.dll -lavutil.dll -lswscale.dll" +LIBS="$LIBS -lswresample.dll -lsound -lpixlib3 -lfreetype.dll -lva.dll -lgcc -lc.dll" + +LDFLAGS="-static --subsystem native --stack 0x200000 -Map fplay.map -Tapp-dynamic.lds --image-base 0" + +# Исходники +C_SOURCES="audio.c decoder.c fplay.c vaapi.c video.c utils.c \ + winlib/button.c winlib/caption.c winlib/fontlib.c \ + winlib/frame.c winlib/panel.c winlib/window.c" +ASM_SOURCES="opendial.asm skin/skin.asm" + +# Объекты в том порядке линковки, что использует проект +OBJECTS="opendial.o audio.o decoder.o fplay.o vaapi.o video.o utils.o \ + skin/skin.o winlib/button.o winlib/caption.o winlib/fontlib.o \ + winlib/frame.o winlib/panel.o winlib/window.o" + +# --------------------------------------------------------------------------- +# clean +# --------------------------------------------------------------------------- +if [ "${1:-}" = "clean" ]; then + rm -f $OBJECTS "$NAME" fplay.map + echo "cleaned: objects, $NAME, fplay.map" + exit 0 +fi + +# --------------------------------------------------------------------------- +# Проверка инструментов +# --------------------------------------------------------------------------- +command -v "$CC" >/dev/null 2>&1 || { echo "ERROR: $CC not found (TOOLCHAIN_BIN=$TOOLCHAIN_BIN)"; exit 1; } +command -v "$LD" >/dev/null 2>&1 || { echo "ERROR: $LD not found (TOOLCHAIN_BIN=$TOOLCHAIN_BIN)"; exit 1; } +command -v "$OBJCOPY" >/dev/null 2>&1 || { echo "ERROR: $OBJCOPY not found (TOOLCHAIN_BIN=$TOOLCHAIN_BIN)"; exit 1; } +command -v "$FASM_CMD" >/dev/null 2>&1 || { echo "ERROR: fasm not found (FASM=$FASM)"; exit 1; } +[ -d "$LIB_DIR" ] || { echo "ERROR: LIB_DIR not found: $LIB_DIR"; exit 1; } + +echo "SDK_DIR = $SDK_DIR" +echo "toolchain = $TOOLCHAIN_BIN" +echo + +# --------------------------------------------------------------------------- +# Компиляция всех объектов заново (полная сборка) +# --------------------------------------------------------------------------- +fail=0 + +for src in $C_SOURCES; do + obj="${src%.c}.o" + printf ' CC %s\n' "$src" + $CC $CFLAGS $DEFINES $INCLUDES -o "$obj" "$src" || { echo " ^^ FAILED: $src"; fail=1; } +done + +for src in $ASM_SOURCES; do + obj="${src%.asm}.o" + printf ' ASM %s\n' "$src" + "$FASM_CMD" "$src" "$obj" || { echo " ^^ FAILED: $src"; fail=1; } +done + +if [ $fail -ne 0 ]; then + echo + echo "COMPILE FAILED - see errors above" + exit 1 +fi + +# --------------------------------------------------------------------------- +# Линковка + objcopy в бинарь MENUET +# --------------------------------------------------------------------------- +echo +printf ' LINK %s\n' "$NAME" +$LD $LDFLAGS -L"$LIB_DIR" -o "$NAME" $OBJECTS $LIBS || { echo "LINK FAILED"; exit 1; } + +printf ' BIN %s\n' "$NAME" +$OBJCOPY "$NAME" -O binary || { echo "OBJCOPY FAILED"; exit 1; } + +# --------------------------------------------------------------------------- +# Итог +# --------------------------------------------------------------------------- +size=$(stat -c %s "$NAME" 2>/dev/null || wc -c < "$NAME") +hdr=$(head -c 6 "$NAME" 2>/dev/null) +echo +echo "BUILD OK" +echo " file : $(pwd)/$NAME" +echo " size : $size bytes" +echo " header: $hdr" +[ "$hdr" = "MENUET" ] || echo " WARNING: header is not MENUET - check app-dynamic.lds" diff --git a/contrib/media/fplay/decoder.c b/contrib/media/fplay/decoder.c index 979768d92..520e7a8eb 100644 --- a/contrib/media/fplay/decoder.c +++ b/contrib/media/fplay/decoder.c @@ -14,6 +14,11 @@ #include "sound.h" #include "fplay.h" +/* 0 = decode everything, 1 = skip non-reference frames. Driven by the A/V + * sync loop in video.c (render_time) - the picture falling behind the audio + * clock raises it, catching up clears it. */ +volatile int g_skip_level = 0; + static struct decoder ffmpeg_decoder; static struct decoder* init_ffmpeg_decoder(vst_t *vst); @@ -107,28 +112,31 @@ static vframe_t *get_input_frame(vst_t *vst) static void put_output_frame(vst_t *vst, vframe_t *vframe) { - mutex_lock(&vst->output_lock); - if(list_empty(&vst->output_list)) - list_add_tail(&vframe->list, &vst->output_list); - else - { - vframe_t *cur; + vframe_t *cur; + int inserted = 0; - cur = list_first_entry(&vst->output_list,vframe_t,list); - if(vframe->pts < cur->pts) - list_add_tail(&vframe->list, &vst->output_list); - else + mutex_lock(&vst->output_lock); + + /* Keep the list sorted by pts: walk from the tail, insert after the first + * frame not newer than ours (>= keeps equal-pts frames in arrival order); + * no match = ours is the earliest (or the list is empty) - new head. + * The previous version added pre-head frames to the TAIL (unsorted) and, + * worse, a frame whose pts equalled every queued one matched nothing and + * was added to NO list at all - each such frame leaked one of the 4 + * decoder vframes for good, and four of them froze the video (happens + * with broken/duplicate container timestamps). */ + list_for_each_entry_reverse(cur, &vst->output_list, list) + { + if(vframe->pts >= cur->pts) { - list_for_each_entry_reverse(cur,&vst->output_list,list) - { - if(vframe->pts > cur->pts) - { - list_add(&vframe->list, &cur->list); - break; - }; - }; + list_add(&vframe->list, &cur->list); + inserted = 1; + break; }; }; + if(!inserted) + list_add(&vframe->list, &vst->output_list); + vst->frames_count++; mutex_unlock(&vst->output_lock); }; @@ -150,6 +158,12 @@ int decode_video(vst_t* vst) if( get_packet(&vst->q_video, &pkt) == 0 ) return 0; + /* Adaptive frame skipping: when the picture keeps falling behind the audio + * clock (set from render_time in video.c), ask the codec to skip the + * non-reference frames so decode gets lighter and the video keeps pace; + * back to full quality once it has caught up. */ + vst->vCtx->skip_frame = g_skip_level ? AVDISCARD_NONREF : AVDISCARD_DEFAULT; + frameFinished = 0; mutex_lock(&vst->gpu_lock); diff --git a/contrib/media/fplay/fplay.c b/contrib/media/fplay/fplay.c index 01bedd1d0..a2803f14b 100644 --- a/contrib/media/fplay/fplay.c +++ b/contrib/media/fplay/fplay.c @@ -1,385 +1,873 @@ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include "winlib/winlib.h" - -#include "sound.h" -#include "fplay.h" - -volatile enum player_state player_state = STOP; -volatile enum player_state decoder_state = PREPARE; -volatile enum player_state sound_state = STOP; - -uint32_t win_width, win_height; - -uint8_t *decoder_buffer; -extern int resampler_size; -extern int sample_rate; - -int64_t rewind_pos; - -int64_t stream_duration; - -volatile int threads_running = DECODER_THREAD; - -int main( int argc, char *argv[]) -{ - static vst_t vst; - int i, ret; - char *file_name, *dot; - - if(argc < 2) - { - vst.input_file = get_moviefile(); - if(vst.input_file == NULL) - { - printf("Please provide a movie file\n"); - return -1; - } - } - else vst.input_file = argv[1]; - - /* register all codecs, demux and protocols */ - - av_log_set_level(AV_LOG_FATAL); - - avcodec_register_all(); - avdevice_register_all(); - av_register_all(); - - if( avformat_open_input(&vst.fCtx, vst.input_file, NULL, NULL) < 0) - { - printf("Cannot open file %s\n\r", vst.input_file); - return -1; // Couldn't open file - }; - - vst.fCtx->flags |= AVFMT_FLAG_GENPTS; - - if(avformat_find_stream_info(vst.fCtx, NULL) < 0) - { - printf("Cannot find streams\n\r"); - return -1; - }; - - file_name = strrchr(vst.input_file,'/')+1; - dot = strrchr(file_name,'.'); - if(dot) - { - vst.input_name = malloc(dot-file_name+1); - memcpy(vst.input_name, file_name, dot-file_name); - vst.input_name[dot-file_name] = 0; - } - else vst.input_name = file_name; - - stream_duration = vst.fCtx->duration; - - vst.vStream = -1; - vst.aStream = -1; - - for(i=0; i < vst.fCtx->nb_streams; i++) - { - if(vst.fCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO - && vst.vStream < 0) - { - vst.vStream = i; - vst.video_time_base = vst.fCtx->streams[i]->time_base; - if(stream_duration == 0) - stream_duration = vst.fCtx->streams[i]->duration; - } - - if(vst.fCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO && - vst.aStream < 0) - { - vst.aStream = i; - if(stream_duration == 0) - stream_duration = vst.fCtx->streams[i]->duration; - } - } - - if(vst.vStream==-1) - { - printf("Video stream not detected\n\r"); - return -1; // Didn't find a video stream - }; - - - INIT_LIST_HEAD(&vst.input_list); - INIT_LIST_HEAD(&vst.output_list); - mutex_init(&vst.q_video.lock); - mutex_init(&vst.q_audio.lock); - mutex_init(&vst.gpu_lock); - mutex_init(&vst.decoder_lock); - mutex_init(&vst.input_lock); - mutex_init(&vst.output_lock); - - vst.vCtx = vst.fCtx->streams[vst.vStream]->codec; - vst.aCtx = vst.fCtx->streams[vst.aStream]->codec; - -// __asm__ __volatile__("int3"); - - if(init_video_decoder(&vst) != 0 ) - return -1; - - vst.aCtx->request_channel_layout = AV_CH_LAYOUT_STEREO; - vst.aCodec = avcodec_find_decoder(vst.aCtx->codec_id); - if(vst.aCodec) - { - if(avcodec_open2(vst.aCtx, vst.aCodec, NULL) >= 0 ) - { - WAVEHEADER whdr; - int fmt; - int channels; - - printf("audio stream rate %d channels %d format %d\n", - vst.aCtx->sample_rate, vst.aCtx->channels, vst.aCtx->sample_fmt ); - whdr.riff_id = 0x46464952; - whdr.riff_format = 0x45564157; - whdr.wFormatTag = 0x01; - whdr.nSamplesPerSec = vst.aCtx->sample_rate; - whdr.nChannels = 2; - whdr.wBitsPerSample = 16; - - sample_rate = vst.aCtx->sample_rate; - - vst.snd_format = test_wav(&whdr); - - if( init_audio(&vst) ) - { - decoder_buffer = (uint8_t*)av_mallocz(192000*2+64); - if( decoder_buffer != NULL ) - { - mutex_init(&astream.lock); - astream.count = 0; - astream.buffer = (char *)av_mallocz(192000*3); - if( astream.buffer != NULL ) - vst.has_sound = 1; - else - av_free(decoder_buffer); - } - if( vst.has_sound == 0) - { - printf("Not enough memory for audio buffers\n"); - } - } - } - else printf("Cannot open audio codec\n\r"); - } - else printf("Unsupported audio codec!\n"); - - mutex_lock(&vst.decoder_lock); - create_thread(video_thread, &vst, 1024*1024); - if(mutex_lock_timeout(&vst.decoder_lock, 3000) == 0) - return -1; - - decoder(&vst); - - -//__asm__ __volatile__("int3"); - - while( threads_running & - (AUDIO_THREAD | VIDEO_THREAD)) - delay(1); - - if(astream.lock.handle) - mutex_destroy(&astream.lock); - - vst.decoder->fini(&vst); - avcodec_close(vst.vCtx); - - mutex_destroy(&vst.q_video.lock); - mutex_destroy(&vst.q_audio.lock); - mutex_destroy(&vst.decoder_lock); - - return 0; -} - - -static int load_frame(vst_t *vst) -{ - AVPacket packet; - int err; - - err = av_read_frame(vst->fCtx, &packet); - if( err == 0) - { - if(packet.stream_index == vst->vStream) - put_packet(&vst->q_video, &packet); - else if( (packet.stream_index == vst->aStream) && - (vst->has_sound != 0) ) - { - put_packet(&vst->q_audio, &packet); - if(vst->audio_timer_valid == 0 && - packet.pts != AV_NOPTS_VALUE ) - { - vst->audio_timer_base = get_audio_base(vst) * packet.pts; - vst->audio_timer_valid = 1; - }; - } - else av_free_packet(&packet); - } - else if (err != AVERROR_EOF) - printf("av_read_frame: error %x\n", err); - - return err; -} - - - -static int fill_queue(vst_t* vst) -{ - int err = 0; - AVPacket packet; - - while( (vst->q_video.size < 4*1024*1024) && !err ) - err = load_frame(vst); - - return err; -}; - - -static void flush_all(vst_t* vst) -{ - AVPacket packet; - - avcodec_flush_buffers(vst->vCtx); - avcodec_flush_buffers(vst->aCtx); - while( get_packet(&vst->q_video, &packet) != 0) - av_free_packet(&packet); - - while( get_packet(&vst->q_audio, &packet)!= 0) - av_free_packet(&packet); - - flush_video(vst); - - astream.count = 0; -}; - -void decoder(vst_t* vst) -{ - int eof; - AVPacket packet; - int ret, vret, aret; - - int64_t min_pos, max_pos; - -// av_log_set_level(AV_LOG_DEBUG); - - while( player_state != CLOSED ) - { - int err; - - switch(decoder_state) - { - case PREPARE: - eof = fill_queue(vst); - - do - { - if( (vst->q_video.size < 4*1024*1024) && - (eof == 0) ) - { - eof = load_frame(vst); - } - decode_video(vst); - ret = decode_audio(vst->aCtx, &vst->q_audio); - }while(astream.count < resampler_size*2 && ret == 1); - - sound_state = PREPARE; - decoder_state = PLAY; - player_state = PLAY; - - case PLAY: - if( (vst->q_video.size < 4*1024*1024) && - (eof == 0) ) - { - eof = load_frame(vst); - } - vret = decode_video(vst); - aret = decode_audio(vst->aCtx, &vst->q_audio); - ret = vret | aret; - - if( eof && !ret) - { - decoder_state = STOP; - continue; - }; - - if( (vret & aret) == -1) - { - if( (vst->q_video.size < 4*1024*1024) && - (eof == 0) ) - { - eof = load_frame(vst); - yield(); - continue; - }; - delay(1); - continue; - } - yield(); - continue; - - case STOP: - delay(1); - continue; - - - case PLAY_2_STOP: - while(sound_state != STOP) - delay(1); - - flush_all(vst); - - if (vst->fCtx->start_time != AV_NOPTS_VALUE) - rewind_pos = vst->fCtx->start_time; - else - rewind_pos = 0; - - ret = avformat_seek_file(vst->fCtx, -1, INT64_MIN, - rewind_pos, INT64_MAX, 0); - - decoder_state = STOP; - continue; - - case REWIND: - while(sound_state != STOP) - yield(); - - flush_all(vst); - int opts = 0; - if(rewind_pos < 0) - { - rewind_pos = -rewind_pos; - opts = AVSEEK_FLAG_BACKWARD; - }; - - if (vst->fCtx->start_time != AV_NOPTS_VALUE) - rewind_pos += vst->fCtx->start_time; - -// printf("rewind %8"PRId64"\n", rewind_pos); - min_pos = rewind_pos - 1000000; - max_pos = rewind_pos + 1000000; - - ret = avformat_seek_file(vst->fCtx, -1, INT64_MIN, - rewind_pos, INT64_MAX, 0); - if (ret < 0) - { - printf("could not seek to position %f\n", - (double)rewind_pos / AV_TIME_BASE); - } - decoder_state = PREPARE; - continue; - } - }; -}; - + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "winlib/winlib.h" + +#include "sound.h" +#include "fplay.h" + +volatile enum player_state player_state = STOP; +volatile enum player_state decoder_state = PREPARE; +volatile enum player_state sound_state = STOP; + +uint32_t win_width, win_height; + +uint8_t *decoder_buffer; +extern int resampler_size; +extern int sample_rate; + +int64_t rewind_pos; + +int64_t stream_duration; + +/* Read-ahead queue limits, sized in main() from FREE RAM. On slow media (USB + * stick, reads slowing with file position) the only thing that hides a + * sustained read-speed shortfall is a deep buffer: the surplus accumulated + * while reading is fast carries playback through the stretches where it is + * slow - the same effect as pausing to let the reader catch up, but automatic. + * So take a healthy share of free RAM instead of a token few megabytes. + * Defaults = the old flat caps, until main() sizes them. */ +static int video_queue_limit = 4*1024*1024; +static int audio_queue_limit = 4*1024*1024; + +#define QUEUE_FLOOR (4*1024*1024) /* never below the old cap */ +#define VIDEO_QUEUE_CEILING (256*1024*1024) /* hard upper bound */ +#define AUDIO_QUEUE_CEILING (32*1024*1024) /* compressed audio is small */ + +/* KolibriOS syscall 18.16: size of free RAM in kilobytes. */ +static uint32_t get_free_ram_kb(void) +{ + uint32_t kb; + __asm__ __volatile__("int $0x40":"=a"(kb):"a"(18),"b"(16)); + return kb; +} + +/* --- Custom AVIOContext with a large I/O buffer ---------------------------- * + * KolibriOS file reads (syscall 70) are STATELESS: every read passes an + * absolute byte offset and the FAT driver re-walks the cluster chain from the + * file's first cluster to reach it - O(offset) per read - with only a tiny + * FAT-sector cache and no read-ahead on USB. ffmpeg's default file buffer is + * just 32 KB, so it issues dozens of these O(offset) reads per second, and the + * cost climbs the deeper into the file you play: smooth at the start, stalling + * from the middle on a USB stick. Reading in far larger chunks amortizes each + * chain-walk over ~1 MB instead of 32 KB, cutting the number of positioned + * reads (and thus the aggregate walk cost) by ~32x. */ +#define AVIO_BUF_SIZE (1024*1024) + +/* Large-file (>2 GB) support. newlib's file layer is 32-bit (_off_t is a signed + * long, ioh->offset is unsigned int), so lseek()/read() cannot address past + * 2 GB / 4 GB. We bypass newlib entirely: keep our own 64-bit file position and + * call KolibriOS syscall 70 (read file / get info) directly - its fileinfo + * block carries a 64-bit offset. Real reach past 4 GB then depends only on the + * filesystem driver (exFAT), not on the C library. */ +typedef struct +{ + const char *path; + int64_t pos; +}file_io_t; + +static file_io_t g_fio; + +/* syscall 70 fileinfo block (packed): +0 subfn, +4/+8 offset64, +12 size, + * +16 buffer, +20 zero, +21 path pointer. */ +struct fs70op +{ + uint32_t fn; + uint32_t off_lo; + uint32_t off_hi; + uint32_t size; + void *buf; + uint8_t zero; + const char *path; +}__attribute__((packed)); + +static int64_t fp_filesize(const char *path) +{ + struct fs70op op; + uint8_t bdfe[560]; /* file-info block: 40-byte header (64-bit + * size at +32) followed by the name */ + uint32_t status; + + op.fn = 5; /* subfn 5: get file/dir info */ + op.off_lo = 0; + op.off_hi = 0; + op.size = 0; + op.buf = bdfe; + op.zero = 0; + op.path = path; + + __asm__ __volatile__("int $0x40":"=a"(status):"a"(70),"b"(&op):"memory"); + if(status != 0) + return -1; + return *(int64_t*)(bdfe + 32); +} + +static int fp_read_packet(void *opaque, uint8_t *buf, int buf_size) +{ + file_io_t *f = opaque; + struct fs70op op; + uint32_t status, rw; + + op.fn = 0; /* subfn 0: read file */ + op.off_lo = (uint32_t) f->pos; + op.off_hi = (uint32_t)(f->pos >> 32); + op.size = buf_size; + op.buf = buf; + op.zero = 0; + op.path = f->path; + + __asm__ __volatile__("int $0x40":"=a"(status),"=b"(rw):"a"(70),"b"(&op):"memory"); + + if(rw > 0) + { + f->pos += rw; + return (int)rw; + } + return AVERROR_EOF; /* status 6 (EOF) or a read error */ +} + +static int64_t fp_seek(void *opaque, int64_t offset, int whence) +{ + file_io_t *f = opaque; + + whence &= ~AVSEEK_FORCE; + + if(whence == AVSEEK_SIZE) + return fp_filesize(f->path); + + if(whence == SEEK_CUR) + offset += f->pos; + else if(whence == SEEK_END) + { + int64_t sz = fp_filesize(f->path); + if(sz < 0) + return -1; + offset += sz; + } + /* SEEK_SET: offset is already absolute */ + + f->pos = offset; + return f->pos; +} + +volatile int threads_running = DECODER_THREAD; + +/* Set by the O hotkey (video.c): the file to play next. main() execs a fresh + * instance with it as its very last step, after the sound stream, demuxer and + * display pipeline have all been torn down. */ +char g_next_file[1024]; + +extern char __pgmname[]; /* full path of this executable (header) */ + +/* File reading runs on its own thread (read_thread) so a slow, blocking read - + * e.g. from a USB stick where each read is O(file-position) - never stalls + * audio/video decoding. The decoder consumes the mutex-protected packet queues; + * the reader fills them. These flags coordinate the two, and let the decoder + * park the reader while it flushes and seeks (av_read_frame and + * avformat_seek_file must not touch the demuxer concurrently). */ +static volatile int reader_run = 0; /* decoder -> reader: read or idle */ +static volatile int reader_eof = 0; /* reader -> decoder: end of file */ +static volatile int reader_paused = 0; /* reader -> decoder: idle, safe to seek */ + +/* Raw command-line buffer from the app header (linker symbol ___cmdline in + * app-dynamic.lds -> C name __cmdline). Note: newlib's startup (crt1.c + * split_cmdline) has ALREADY tokenized this buffer IN PLACE by the time main() + * runs - it overwrites the first space of every gap with '\0' and fills argv[]. + * So __cmdline is only reliable for its FIRST char (to tell whether the + * parameter was quoted); the file name(s) are recovered from argv[]. */ +extern char __cmdline[]; + +int main( int argc, char *argv[]) +{ + static vst_t vst; + int i, ret; + char *file_name, *dot; + + /* KolibriOS command-line convention: + * - a parameter WITHOUT quotes is a single string = one file path, taken + * whole (spaces and all); + * - a parameter that STARTS WITH a quote is one or several quoted file + * names. + * With no parameter, fall back to the open dialog. */ + { + char *raw = __cmdline; + + while(*raw == ' ' || *raw == '\t') /* first meaningful char */ + raw++; + + if(*raw == 0 || argc < 2) + { + vst.input_file = get_moviefile(); + if(vst.input_file == NULL) + { + printf("Please provide a movie file\n"); + return -1; + } + } + else if(*raw == '\"') + { + /* Quoted: newlib already split the quoted names into argv[] with + * the quotes removed and the spaces inside each name preserved, so + * argv[1] is the first file complete. fplay plays one file; + * argv[2..argc-1] would be a playlist. */ + vst.input_file = argv[1]; + } + else + { + /* Unquoted: the whole line is ONE path. newlib destructively split + * it on spaces (a '\0' over the first space of each gap), so stitch + * the argv tokens back together in place - every embedded '\0' from + * argv[1] to the end of the last token becomes a space again. It + * left any extra spaces of a gap intact, so the original spacing is + * restored exactly. */ + char *end = argv[argc - 1] + strlen(argv[argc - 1]); + char *s; + + for(s = argv[1]; s < end; s++) + if(*s == 0) + *s = ' '; + + vst.input_file = argv[1]; + } + } + + /* register all codecs, demux and protocols */ + + av_log_set_level(AV_LOG_FATAL); + + avcodec_register_all(); + avdevice_register_all(); + av_register_all(); + + /* Open with a large custom, 64-bit I/O layer (fp_*): a big buffer to + * minimize the number of KolibriOS positioned reads (each O(offset) in the + * FAT driver), and a 64-bit file position so files >2 GB work (newlib's + * file layer is only 32-bit). */ + { + unsigned char *iobuf; + AVIOContext *avio; + + if(fp_filesize(vst.input_file) < 0) + { + printf("Cannot open file %s\n\r", vst.input_file); + return -1; + } + + g_fio.path = vst.input_file; + g_fio.pos = 0; + + iobuf = av_malloc(AVIO_BUF_SIZE); + avio = avio_alloc_context(iobuf, AVIO_BUF_SIZE, 0, + &g_fio, + fp_read_packet, NULL, fp_seek); + + vst.fCtx = avformat_alloc_context(); + vst.fCtx->pb = avio; + vst.fCtx->flags |= AVFMT_FLAG_CUSTOM_IO; + + if( avformat_open_input(&vst.fCtx, vst.input_file, NULL, NULL) < 0) + { + printf("Cannot open file %s\n\r", vst.input_file); + return -1; // Couldn't open file + }; + } + + vst.fCtx->flags |= AVFMT_FLAG_GENPTS; + + if(avformat_find_stream_info(vst.fCtx, NULL) < 0) + { + printf("Cannot find streams\n\r"); + return -1; + }; + + file_name = strrchr(vst.input_file,'/')+1; + dot = strrchr(file_name,'.'); + if(dot) + { + vst.input_name = malloc(dot-file_name+1); + memcpy(vst.input_name, file_name, dot-file_name); + vst.input_name[dot-file_name] = 0; + } + else vst.input_name = file_name; + + /* An unknown duration is AV_NOPTS_VALUE - a huge NEGATIVE int64, not 0 + * (e.g. mkv/webm rips muxed live carry no duration at all). Sanitize every + * source to "0 = unknown", or the progress bar and the time display get + * garbage like -596523:-14. */ + stream_duration = vst.fCtx->duration; + if(stream_duration < 0) + stream_duration = 0; + + vst.vStream = -1; + vst.aStream = -1; + + for(i=0; i < vst.fCtx->nb_streams; i++) + { + if(vst.fCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO + && vst.vStream < 0) + { + vst.vStream = i; + vst.video_time_base = vst.fCtx->streams[i]->time_base; + if(stream_duration == 0 && vst.fCtx->streams[i]->duration > 0) + stream_duration = vst.fCtx->streams[i]->duration; + } + + if(vst.fCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO && + vst.aStream < 0) + { + vst.aStream = i; + if(stream_duration == 0 && vst.fCtx->streams[i]->duration > 0) + stream_duration = vst.fCtx->streams[i]->duration; + } + } + + if(vst.vStream==-1) + { + printf("Video stream not detected\n\r"); + return -1; // Didn't find a video stream + }; + + /* Size the read-ahead queues from FREE RAM: the video queue gets 1/4 of + * it, the audio queue 1/32 (compressed audio is tiny - 32 MB is ~20 min). + * On slow media the deep buffer is what keeps playback smooth: while the + * source reads fast the reader banks a surplus, and playback then rides + * that surplus through the slow stretches (the automatic version of the + * pause-and-let-it-buffer trick). Floors keep the old 4 MB behaviour on a + * RAM-starved machine; ceilings stop a big machine from hoarding. + * NB: this is a read-ahead buffer of *compressed* packets - it does NOT + * make a stream decodable if the CPU cannot decode it in real time. */ + { + int64_t lim, alim; + uint32_t free_kb = get_free_ram_kb(); + + lim = (int64_t)free_kb * 1024 / 4; /* 1/4 of free RAM */ + alim = (int64_t)free_kb * 1024 / 32; /* 1/32 of free RAM */ + + if(lim < QUEUE_FLOOR) lim = QUEUE_FLOOR; + if(lim > VIDEO_QUEUE_CEILING) lim = VIDEO_QUEUE_CEILING; + if(alim < QUEUE_FLOOR) alim = QUEUE_FLOOR; + if(alim > AUDIO_QUEUE_CEILING) alim = AUDIO_QUEUE_CEILING; + + video_queue_limit = (int)lim; + audio_queue_limit = (int)alim; + + printf("read-ahead: video %d KB, audio %d KB (free RAM %u KB)\n", + video_queue_limit/1024, audio_queue_limit/1024, free_kb); + } + + + INIT_LIST_HEAD(&vst.input_list); + INIT_LIST_HEAD(&vst.output_list); + mutex_init(&vst.q_video.lock); + mutex_init(&vst.q_audio.lock); + mutex_init(&vst.gpu_lock); + mutex_init(&vst.decoder_lock); + mutex_init(&vst.input_lock); + mutex_init(&vst.output_lock); + + vst.vCtx = vst.fCtx->streams[vst.vStream]->codec; + /* aStream stays -1 for a video-only file (e.g. a phone clip with no audio + * track); streams[-1] would fault. Leave aCtx NULL and skip all audio. */ + vst.aCtx = (vst.aStream >= 0) + ? vst.fCtx->streams[vst.aStream]->codec + : NULL; + +// __asm__ __volatile__("int3"); + + if(init_video_decoder(&vst) != 0 ) + return -1; + + if(vst.aCtx) + { + vst.aCtx->request_channel_layout = AV_CH_LAYOUT_STEREO; + vst.aCodec = avcodec_find_decoder(vst.aCtx->codec_id); + } + if(vst.aCtx && vst.aCodec) + { + if(avcodec_open2(vst.aCtx, vst.aCodec, NULL) >= 0 ) + { + WAVEHEADER whdr; + int fmt; + int channels; + + printf("audio stream rate %d channels %d format %d\n", + vst.aCtx->sample_rate, vst.aCtx->channels, vst.aCtx->sample_fmt ); + whdr.riff_id = 0x46464952; + whdr.riff_format = 0x45564157; + whdr.wFormatTag = 0x01; + whdr.nSamplesPerSec = vst.aCtx->sample_rate; + whdr.nChannels = 2; + whdr.wBitsPerSample = 16; + + sample_rate = vst.aCtx->sample_rate; + + vst.snd_format = test_wav(&whdr); + + if( init_audio(&vst) ) + { + decoder_buffer = (uint8_t*)av_mallocz(192000*2+64); + if( decoder_buffer != NULL ) + { + mutex_init(&astream.lock); + astream.count = 0; + astream.buffer = (char *)av_mallocz(192000*3); + if( astream.buffer != NULL ) + vst.has_sound = 1; + else + av_free(decoder_buffer); + } + if( vst.has_sound == 0) + { + printf("Not enough memory for audio buffers\n"); + } + } + } + else printf("Cannot open audio codec\n\r"); + } + else if(vst.aCtx == NULL) + printf("No audio stream\n"); + else printf("Unsupported audio codec!\n"); + + mutex_lock(&vst.decoder_lock); + create_thread(video_thread, &vst, 1024*1024); + if(mutex_lock_timeout(&vst.decoder_lock, 3000) == 0) + return -1; + + create_thread(read_thread, &vst, 1024*1024); + + decoder(&vst); + + +//__asm__ __volatile__("int3"); + + /* wait for the reader too, so it is out of av_read_frame before we close + * the codecs / free the format context below */ + while( threads_running & + (AUDIO_THREAD | VIDEO_THREAD | READER_THREAD)) + delay(1); + + if(astream.lock.handle) + mutex_destroy(&astream.lock); + + vst.decoder->fini(&vst); + avcodec_close(vst.vCtx); + + mutex_destroy(&vst.q_video.lock); + mutex_destroy(&vst.q_audio.lock); + mutex_destroy(&vst.decoder_lock); + + /* O hotkey: relaunch the player with the newly chosen file, now that + * everything (sound stream, DRM, demuxer, window) is released - the new + * instance starts as cleanly as one launched from the file manager. */ + if(g_next_file[0] != 0) + { + struct + { + uint32_t fn; /* +0 = 7 (execute) */ + uint32_t flags; /* +4 0 = no debug */ + const char *args; /* +8 command line */ + uint32_t r12; /* +12 reserved */ + uint32_t r16; /* +16 reserved */ + uint8_t zero; /* +20 */ + const char *path; /* +21 program path */ + }__attribute__((packed)) op; + int status; + + /* Pass the path unquoted - a single string, which main() takes whole + * (the "unquoted = one file path" convention), exactly like a file + * manager launching one file. */ + op.fn = 7; + op.flags = 0; + op.args = g_next_file; + op.r12 = 0; + op.r16 = 0; + op.zero = 0; + op.path = __pgmname; + + __asm__ __volatile__("int $0x40":"=a"(status):"a"(70),"b"(&op):"memory"); + if(status < 0) + printf("restart failed: %d\n", status); + } + + return 0; +} + + +static int load_frame(vst_t *vst) +{ + AVPacket packet; + int err; + + err = av_read_frame(vst->fCtx, &packet); + if( err == 0) + { + if(packet.stream_index == vst->vStream) + put_packet(&vst->q_video, &packet); + else if( (packet.stream_index == vst->aStream) && + (vst->has_sound != 0) ) + { + put_packet(&vst->q_audio, &packet); + if(vst->audio_timer_valid == 0 && + packet.pts != AV_NOPTS_VALUE ) + { + vst->audio_timer_base = get_audio_base(vst) * packet.pts; + vst->audio_timer_valid = 1; + }; + } + else av_free_packet(&packet); + } + else if (err != AVERROR_EOF) + printf("av_read_frame: error %x\n", err); + + return err; +} + + + +/* Whether the demuxer should read another packet. The read is throttled to + * real time by the video queue filling up, but only q_video was ever bounded. + * q_audio has no consumer-side backpressure on the FEED (decode_audio refuses + * to DRAIN once astream is full, but load_frame keeps pushing), so whenever the + * video byte-rate falls below real time - a slow software-blitter decode, a + * low-bitrate stretch, or a video track that ends before the audio - q_video + * never reaches its cap, reading never stops, and q_audio grows without bound. + * On KolibriOS that steadily raises heap pressure and every av_malloc in the + * decode path, so fps sags further into a long file. Cap BOTH queues. + * video_queue_limit is bitrate-sized in main(); the audio cap stays flat. */ +static int want_more_data(vst_t* vst) +{ + return (vst->q_video.size < video_queue_limit) && + (vst->q_audio.size < audio_queue_limit); +} + +/* Dedicated file-reading thread. Fills the packet queues whenever the decoder + * has enabled it (reader_run) and the queues have room. A blocking read here + * cannot stall decode/present, which run on other threads. + * + * PACING: the reader must NOT run flat out. Every positioned read costs a + * long in-kernel FAT chain walk (O(file position)) plus the data copy, and + * with a deep RAM cache the cap stays unreached for minutes - an unthrottled + * reader then hogs the CPU continuously, starving the decoder thread (which + * also refills the audio ring) and the audio thread: the sound stutters MORE + * with a bigger cache, not less. So the reader always yield()s between + * packets (anyone who wants the CPU gets it first) and takes a 10 ms breath + * at regular intervals - rare while the reserve is thin (catch up quickly), + * frequent once a comfortable reserve exists (cruise). */ +#define READER_LOW_WATERMARK (16*1024*1024) +#define READER_STARVED (2*1024*1024) + +int read_thread(void *param) +{ + vst_t *vst = param; + int since_rest = 0; + + __sync_or_and_fetch(&threads_running, READER_THREAD); + + while( player_state != CLOSED ) + { + int rest_every; + + if( !reader_run ) + { + reader_paused = 1; /* acknowledge: idle, safe to seek */ + delay(1); + continue; + } + reader_paused = 0; + + if( reader_eof || !want_more_data(vst) ) + { + delay(1); /* at EOF or queues full: back off */ + continue; + } + + if( load_frame(vst) != 0 ) /* AVERROR_EOF or a read error */ + { + reader_eof = 1; + continue; + } + + /* Near-empty queue = the decoder is about to run dry (slow medium: + * USB stick, network): read flat out, yield()ing so decode/audio can + * always preempt, but skip the 10 ms breaths - they only slow the + * refill down exactly when every packet matters. The breaths resume + * once a couple of seconds of reserve exist. */ + if(vst->q_video.size < READER_STARVED) + { + since_rest = 0; + yield(); + } + else + { + rest_every = (vst->q_video.size < READER_LOW_WATERMARK) ? 16 : 4; + if(++since_rest >= rest_every) + { + since_rest = 0; + delay(1); /* guaranteed CPU for decode/audio */ + } + else + yield(); + } + } + + /* Signal "parked" on exit as well, so a reader_pause() racing shutdown + * (window closed mid-seek) unblocks and knows the reader is out of + * av_read_frame - otherwise it would either hang or, with a CLOSED escape, + * let the decoder seek fCtx concurrently with a live read. */ + reader_paused = 1; + __sync_and_and_fetch(&threads_running, ~READER_THREAD); + return 0; +} + +/* Park the reader and wait until it is provably idle (out of av_read_frame), + * so the decoder can flush the queues and seek the demuxer without racing it. + * The reader sets reader_paused when it parks (reader_run==0) AND when it exits + * on CLOSED, so this always terminates - bounded by one in-flight read. */ +static void reader_pause(void) +{ + reader_run = 0; + while( reader_paused == 0 ) + delay(1); +} + +/* Re-arm the reader from the file's current (post-seek) position. */ +static void reader_resume(void) +{ + reader_eof = 0; + reader_paused = 0; + reader_run = 1; +} + + +static void flush_all(vst_t* vst) +{ + AVPacket packet; + + avcodec_flush_buffers(vst->vCtx); + if(vst->aCtx) /* NULL for a video-only file */ + avcodec_flush_buffers(vst->aCtx); + while( get_packet(&vst->q_video, &packet) != 0) + av_free_packet(&packet); + + while( get_packet(&vst->q_audio, &packet)!= 0) + av_free_packet(&packet); + + flush_video(vst); + + /* Force the reader to re-anchor the sound clock from the FIRST audio + * packet of the new position (load_frame updates audio_timer_base only + * while audio_timer_valid==0). The audio thread clears this flag in its + * PLAY_2_STOP - but only when it was actively playing, and not at all + * when wait_sound_stopped() timed out past a wedged audio thread. A stale + * flag leaves audio_timer_base at the PRE-seek position, SetTimeBase then + * anchors the master clock minutes away from the new frames, and the + * video free-runs unpaced (the post-seek 45-fps desync). The reader is + * parked here (reader_pause), so this write cannot race load_frame. */ + vst->audio_timer_valid = 0; + + /* Zero the PCM staging buffer under its lock. This USED to rely on the + * sound_state==STOP handshake proving the audio thread was quiescent, but + * wait_sound_stopped() may now give up on a wedged audio thread (infinite + * GetNotify) and let us proceed WITHOUT that guarantee. Every other + * astream.count accessor (decode_audio + the audio thread) already takes + * astream.lock, so taking it here makes the reset mutually exclusive with + * them - the race is closed, not merely moved. Safe for video-only files + * too: has_sound==0 means no audio thread, so the lock is uncontended and + * mutex_lock takes the fast path without touching the (uninit) handle. */ + mutex_lock(&astream.lock); + astream.count = 0; + mutex_unlock(&astream.lock); +}; + +/* Wait for the audio thread to acknowledge a stop (sound_state==STOP) before we + * flush astream and seek. Two failure modes, two defences: + * + * 1. A rapid second seek can make the audio thread overwrite our PLAY_2_STOP + * with PLAY on its restart fall-through (audio.c), losing the command. So + * every ~100 ms we re-assert PLAY_2_STOP; a live audio thread acknowledges + * it on its next loop iteration. + * + * 2. The audio thread can wedge PERMANENTLY in its infinite GetNotify (syscall + * 68.14): a seek's ResetBuffer(SND_RESET_ALL) drops the stream from the + * mixer playlist, and on real hardware the sound-card DMA can then underrun + * and stop raising completion events, which the engine never re-arms (a + * later PlayBuffer does not re-issue dev_play). A thread blocked in + * GetNotify never re-reads sound_state, so re-assertion is powerless and we + * would spin here forever -> the decoder never leaves REWIND and the video + * freezes. So bound the wait: after ~500 ms with no STOP, force the state to + * STOP and proceed. This is race-free because flush_all() now zeroes astream + * under astream.lock, and leaving STOP (not PLAY_2_STOP) means a late-waking + * audio thread parks in case STOP instead of clobbering the PREPARE the + * decoder is about to issue. Video always recovers; audio resumes on the + * next PREPARE if the ring is still alive (the wedge was transient). */ +static void wait_sound_stopped(vst_t* vst) +{ + int spin = 0, total = 0; + + while(vst->has_sound && sound_state != STOP && player_state != CLOSED) + { + delay(1); + if(++spin >= 10) + { + sound_state = PLAY_2_STOP; + spin = 0; + } + if(++total >= 50) + { + sound_state = STOP; + break; + } + } +} + +void decoder(vst_t* vst) +{ + int ret, vret, aret; + int guard; + int64_t min_pos, max_pos; + +// av_log_set_level(AV_LOG_DEBUG); + + while( player_state != CLOSED ) + { + switch(decoder_state) + { + case PREPARE: + reader_resume(); /* start filling the queues */ + + /* Prime the audio buffer, then start playback. The reader fills + * the queues asynchronously, so wait when there is nothing to + * decode yet. But do NOT block here forever: during PREPARE the + * output frames are not recycled (that only happens under PLAY), + * so q_video can fill to its cap and stop the reader before it + * reaches the audio packets - priming would then never complete. + * The stall guard bounds the wait (~1 s of idle time) and drops + * into PLAY, where frames recycle, q_video drains and the reader + * resumes. Also bail immediately on shutdown. */ + guard = 0; + do + { + vret = decode_video(vst); + aret = decode_audio(vst->aCtx, &vst->q_audio); + if( vret <= 0 && aret <= 0 ) + { + delay(1); + guard++; + } + }while(player_state != CLOSED && + astream.count < resampler_size*2 && + !(reader_eof && vst->q_audio.count == 0) && + guard < 100); + + if(player_state == CLOSED) + continue; + + sound_state = PREPARE; + decoder_state = PLAY; + player_state = PLAY; + + case PLAY: + vret = decode_video(vst); + + /* AUDIO FIRST: drain the audio queue until the PCM ring is + * full (decode_audio self-limits via astream.count) instead of + * rationing one packet per video frame. When the video codec + * is slower than real time (e.g. VP9 on an old CPU takes + * 100+ ms a frame), one-audio-packet-per-iteration starves the + * sound to a fraction of real time and it stutters even + * though audio decode itself is nearly free. Sound must never + * depend on how fast the video decodes. */ + do + { + aret = decode_audio(vst->aCtx, &vst->q_audio); + }while(aret == 1); + + ret = vret | aret; + + if( reader_eof && !ret && + vst->q_video.count == 0 && vst->q_audio.count == 0) + { + decoder_state = STOP; + continue; + }; + + if( vret == 1 ) /* decoded a video frame */ + { + yield(); + continue; + } + + delay(1); /* queues empty (reader catching up) or full */ + continue; + + case STOP: + delay(1); + continue; + + + case PLAY_2_STOP: + wait_sound_stopped(vst); + if(player_state == CLOSED) + continue; + + reader_pause(); /* stop the reader before touching fCtx */ + flush_all(vst); + + if (vst->fCtx->start_time != AV_NOPTS_VALUE) + rewind_pos = vst->fCtx->start_time; + else + rewind_pos = 0; + + ret = avformat_seek_file(vst->fCtx, -1, INT64_MIN, + rewind_pos, INT64_MAX, 0); + + reader_eof = 0; /* reader stays parked until next PREPARE */ + decoder_state = STOP; + continue; + + case REWIND: + wait_sound_stopped(vst); + if(player_state == CLOSED) + continue; + + reader_pause(); /* stop the reader before touching fCtx */ + flush_all(vst); + + if(rewind_pos < 0) + { + rewind_pos = -rewind_pos; + }; + + if (vst->fCtx->start_time != AV_NOPTS_VALUE) + rewind_pos += vst->fCtx->start_time; + +// printf("rewind %8"PRId64"\n", rewind_pos); + min_pos = rewind_pos - 1000000; + max_pos = rewind_pos + 1000000; + + ret = avformat_seek_file(vst->fCtx, -1, INT64_MIN, + rewind_pos, INT64_MAX, 0); + if (ret < 0) + { + printf("could not seek to position %f\n", + (double)rewind_pos / AV_TIME_BASE); + } + reader_eof = 0; + decoder_state = PREPARE; /* PREPARE re-arms the reader */ + continue; + } + }; +}; + diff --git a/contrib/media/fplay/fplay.h b/contrib/media/fplay/fplay.h index e6f871aea..5ccf3ccbe 100644 --- a/contrib/media/fplay/fplay.h +++ b/contrib/media/fplay/fplay.h @@ -49,6 +49,7 @@ struct render uint32_t layout; bitmap_t *bitmap[4]; bitmap_t *last_bitmap; + vframe_t *last_frame; /* last decoded frame, kept for redraw on resize */ uint32_t ctx_format; int target; @@ -160,8 +161,11 @@ struct vstate struct decoder *decoder; int snd_format; volatile int frames_count; + /* written by the reader thread (=1) and the audio thread (=0); keep it in + * its own word (not a shared bitfield) so those writes don't race on a + * read-modify-write of neighbouring flags */ + volatile int audio_timer_valid; unsigned int has_sound:1; - unsigned int audio_timer_valid:1; unsigned int blit_bitmap:1; /* hardware RGBA blitter */ unsigned int blit_texture:1; /* hardware RGBA blit and scale */ unsigned int blit_planar:1; /* hardbare YUV blit and scale */ @@ -171,6 +175,7 @@ struct vstate #define DECODER_THREAD 1 #define AUDIO_THREAD 2 #define VIDEO_THREAD 4 +#define READER_THREAD 8 extern volatile int threads_running; extern astream_t astream; @@ -189,6 +194,7 @@ int audio_thread(void *param); void set_audio_volume(int left, int right); int video_thread(void *param); +int read_thread(void *param); void flush_video(vst_t* vst); int init_video_decoder(vst_t *vst); diff --git a/contrib/media/fplay/opendial.asm b/contrib/media/fplay/opendial.asm index d80689263..45f204c21 100644 --- a/contrib/media/fplay/opendial.asm +++ b/contrib/media/fplay/opendial.asm @@ -137,9 +137,11 @@ dd filefilter.end - filefilter db 'mpg',0 db 'mpeg',0 db 'mkv',0 + db 'mp3',0 db 'mp4',0 db 'webm',0 db 'wmv',0 + db 'vob',0 .end: db 0 diff --git a/contrib/media/fplay/video.c b/contrib/media/fplay/video.c index 45043fcf0..721daa1ce 100644 --- a/contrib/media/fplay/video.c +++ b/contrib/media/fplay/video.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include @@ -25,6 +27,34 @@ struct SwsContext *cvt_ctx = NULL; render_t *main_render; +/* Prefer the hardware blitter, but trust it only after it proves itself: at + * startup video_thread runs a present self-test (draw through the GL path, + * read the pixels back through the kernel, compare). If the test fails - as + * on Intel GMA 3150 under the KMS driver, where EGL/Mesa initialize fine but + * the GL present never reaches the visible framebuffer - this flag is cleared + * and the render is rebuilt on the software kernel blitter, which always + * presents correctly under both KMS and the legacy display driver. */ +int g_want_hw = 1; /* self-test may clear this at startup */ + +int g_show_fps = 0; /* Tab toggles the fps overlay */ +/* Default OFF: fn18.14 spins in the kernel polling VGA port 0x3DA, and if the + * vblank bit ever stops toggling (non-VGA state, driver quirk) the wait never + * returns - the video thread runs the window event loop, so the WHOLE window + * freezes (seen on real hardware right after a seek, when the first post-seek + * frame hits the blit). V enables it for setups where 0x3DA is reliable. */ +int g_vsync = 0; /* V toggles: wait for retrace before sw blit */ + +extern volatile int g_skip_level; /* decoder.c: adaptive frame-skip level */ + +/* KolibriOS syscall 18.14: block until the start of the monitor's vertical + * retrace (polls VGA port 0x3DA). Starting the frame blit here lets it land on + * screen ahead of the scanning ray, removing the tearing seen on the software + * blitter, which writes straight into the visible framebuffer. */ +static void wait_retrace(void) +{ + __asm__ __volatile__("int $0x40"::"a"(18), "b"(14)); +} + void get_client_rect(rect_t *rc); void run_render(window_t *win, void *render); void window_update_layout(window_t *win); @@ -79,11 +109,238 @@ static void player_stop() render_draw_client(main_render); }; +/* Toggle between NORMAL and FULLSCREEN. Used by the Enter key and by the + * middle mouse button. */ +static void toggle_fullscreen(window_t *win) +{ + int screensize; + + if(win->win_state == NORMAL) + { + win->saved = win->rc; + win->saved_state = win->win_state; + + screensize = GetScreenSize(); + __asm__ __volatile__( + "int $0x40" + ::"a"(67), "b"(0), "c"(0), + "d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) ); + win->win_state = FULLSCREEN; + window_update_layout(win); + } + else if(win->win_state == FULLSCREEN) + { + __asm__ __volatile__( + "int $0x40" + ::"a"(67), "b"(win->saved.l), "c"(win->saved.t), + "d"(win->saved.r-win->saved.l-1),"S"(win->saved.b-win->saved.t-1)); + win->win_state = win->saved_state; + window_update_layout(win); + + /* Leaving fullscreen: window_update_layout re-renders the caption and + * the panel into their pixmaps and the child controls blit themselves, + * but nothing blits the panel BACKGROUNDS to the screen - fn67 does + * not deliver a redraw event here, so without these the controls + * float on black until the next external window refresh. */ + blit_caption(&win->caption); + blit_panel(&win->panel); + } +} + +/* Seek by delta microseconds relative to the current position. Mirrors the + * progress-bar click path (ID_PROGRESS): a negative rewind_pos tells the + * decoder to seek backwards. Bound to the Left/Right arrow keys (+-5 s). */ +static void seek_relative(window_t *win, int64_t delta) +{ + progress_t *prg = win->panel.prg; + int64_t target; + + if(player_state == REWIND) + return; + if(player_state != PLAY && player_state != PAUSE) + return; + if(prg->max <= 1.0f) /* unknown duration - no reliable seeks */ + return; + + target = (int64_t)prg->current + delta; + if(target < 0) + target = 0; + if(prg->max > 0.0f && target > (int64_t)prg->max) + target = (int64_t)prg->max; + + rewind_pos = target; + player_state = REWIND; + decoder_state = REWIND; + sound_state = PLAY_2_STOP; + + if((float)rewind_pos < prg->current) + { + prg->current = rewind_pos; + rewind_pos = -rewind_pos; + } + else + prg->current = rewind_pos; + + win->panel.play_btn->img_default = res_pause_btn; + win->panel.play_btn->img_hilite = res_pause_btn; + win->panel.play_btn->img_pressed = res_pause_btn_pressed; + send_message(&prg->ctrl, MSG_PAINT, 0, 0); +} + +extern char g_next_file[1024]; /* fplay.c: exec'd after full teardown */ +char *get_moviefile(); + +static int g_saved_vol = -1; /* slider pos saved while muted, -1 = not muted */ + +/* "VOL: XX%" overlay, shown in the video area for 1.5 s after every volume + * change (drawn by draw_fps_into alongside the Tab info block). */ +static int g_vol_pct = 0; +static uint32_t g_vol_until = 0; /* tick count the overlay expires at */ + +static int vol_overlay_active(void) +{ + /* signed diff survives tick wraparound */ + return g_vol_until != 0 && + (int32_t)(g_vol_until - get_tick_count()) > 0; +} + +/* Set the volume slider to an absolute position (0..96) and apply it. */ +static void set_volume_pos(window_t *win, int pos) +{ + slider_t *sld = win->panel.sld; + int level; + + if(pos < 0) pos = 0; + if(pos > 96) pos = 96; + + /* arm the overlay even when the position did not move (Up at max, etc.) - + * the user asked for volume feedback, show the current value */ + g_vol_pct = (pos*100 + 48)/96; + g_vol_until = get_tick_count() + 150; /* 1.5 s */ + + if(pos == sld->pos) + return; + + sld->pos = pos; + level = sld->min + sld->pos * (sld->max - sld->min)/96; + + set_audio_volume(level, level); + win->panel.lvl->vol = level; + send_message(&sld->ctrl, MSG_PAINT, 0, 0); +} + +/* Nudge the volume by delta steps (mouse wheel, Up/Down keys). A manual change + * cancels a pending mute-restore. */ +static void change_volume(window_t *win, int delta) +{ + g_saved_vol = -1; + set_volume_pos(win, win->panel.sld->pos + delta); +} + +/* M: toggle mute - drop the volume to zero, remember the level, restore it. */ +static void toggle_mute(window_t *win) +{ + if(g_saved_vol < 0) + { + g_saved_vol = win->panel.sld->pos; + set_volume_pos(win, 0); + } + else + { + int v = g_saved_vol; + g_saved_vol = -1; + set_volume_pos(win, v); + } +} + +/* 1/2/3: resize the window so the video area is num/den of its native size. */ +static void resize_video(window_t *win, int num, int den) +{ + int vw, vh, ww, wh; + + if(main_render == NULL) + return; + + vw = (int)main_render->ctx_width * num / den; + vh = (int)main_render->ctx_height * num / den; + if(vw < 64) vw = 64; + if(vh < 48) vh = 48; + + ww = vw; + wh = vh + CAPTION_HEIGHT + PANEL_HEIGHT; + + win->win_state = NORMAL; /* leave a maximized/fullscreen state */ + + __asm__ __volatile__( + "int $0x40" + ::"a"(67), "b"(win->rc.l), "c"(win->rc.t), "d"(ww-1), "S"(wh-1)); + + window_update_layout(win); +} + +/* O: pick a file in the open dialog, then restart the player with it. + * The new instance is NOT spawned here: this one still owns the sound + * stream, the DRM/vaapi context and the display pipeline, and a second + * instance initializing those against a live sibling dies before it even + * creates its window. Instead save the choice and shut down normally - + * main() execs the new instance as its very last step, when everything is + * released, exactly like a fresh launch from the file manager. + * + * get_moviefile() BLOCKS until the child open-dialog process returns, so it + * must NOT run on the window/video thread (this handler's thread) - that + * would freeze the picture the whole time the dialog is open. Run it on its + * own thread; the video keeps playing behind the dialog. g_dialog_running + * guards against a second O launching a second dialog over the shared static + * dialog state. */ +static volatile int g_dialog_running = 0; + +static int open_dialog_thread(void *param) +{ + window_t *win = param; + char *newfile = get_moviefile(); + + if(newfile != NULL && newfile[0] != 0) /* not cancelled */ + { + strncpy(g_next_file, newfile, sizeof(g_next_file)-1); + g_next_file[sizeof(g_next_file)-1] = 0; + + /* publish g_next_file BEFORE the close flag the main loop polls, so + * main() cannot tear down and read a half-written path */ + __asm__ __volatile__("":::"memory"); + win->win_command = WIN_CLOSED; + } + + g_dialog_running = 0; + return 0; +} + +static void open_file(window_t *win) +{ + if(g_dialog_running) /* dialog already open */ + return; + + g_dialog_running = 1; + + if(create_thread(open_dialog_thread, win, 128*1024) < 0) + { + /* could not spawn - fall back to the old blocking path so O still + * works (video freezes meanwhile, as before) */ + g_dialog_running = 0; + open_dialog_thread(win); + } +} + int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) { window_t *win = (window_t*)ctrl; static int spc_down = 0; static int ent_down = 0; + static int tab_down = 0; + static int m_down = 0; + static int o_down = 0; + static int v_down = 0; + static int num_down = 0; + static int e0_key = 0; /* set after a 0xE0 extended-key prefix */ switch(msg) { @@ -96,7 +353,12 @@ int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) break; case MSG_KEY: - switch((short)arg2) + { + short scan = (short)arg2; + int ext = e0_key; /* was this scancode E0-prefixed? */ + e0_key = (scan == 0xE0); /* prefix applies to the NEXT key */ + + switch(scan) { case 0x39: if(spc_down == 0) @@ -113,34 +375,7 @@ int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) case 0x1C: if(ent_down == 0) { - int screensize; - if(win->win_state == NORMAL) - { - win->saved = win->rc; - win->saved_state = win->win_state; - - screensize = GetScreenSize(); - __asm__ __volatile__( - "int $0x40" - ::"a"(67), "b"(0), "c"(0), - "d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) ); - win->win_state = FULLSCREEN; - window_update_layout(win); - } - else if(win->win_state == FULLSCREEN) - { - __asm__ __volatile__( - "int $0x40" - ::"a"(67), "b"(win->saved.l), "c"(win->saved.t), - "d"(win->saved.r-win->saved.l-1),"S"(win->saved.b-win->saved.t-1)); - win->win_state = win->saved_state; - window_update_layout(win); -// if(win->saved_state == MAXIMIZED) -// { -// blit_caption(&win->caption); -// blit_panel(&win->panel); -// } - } + toggle_fullscreen(win); ent_down = 1; }; break; @@ -148,7 +383,107 @@ int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) case 0x9C: ent_down = 0; break; + + case 0x4B: /* Left arrow - rewind 5 s */ + if(ext) + seek_relative(win, -5000000LL); + break; + + case 0x4D: /* Right arrow - forward 5 s */ + if(ext) + seek_relative(win, 5000000LL); + break; + + case 0x48: /* Up arrow - louder */ + if(ext) + change_volume(win, 6); + break; + + case 0x50: /* Down arrow - quieter */ + if(ext) + change_volume(win, -6); + break; + + case 0x32: /* M - toggle mute */ + if(m_down == 0) + { + m_down = 1; + toggle_mute(win); + } + break; + + case 0xB2: /* M released */ + m_down = 0; + break; + + case 0x18: /* O - open file */ + if(o_down == 0) + { + o_down = 1; + open_file(win); + } + break; + + case 0x98: /* O released */ + o_down = 0; + break; + + case 0x02: /* 1 - 50% of native size */ + if(num_down == 0) + { + num_down = 1; + resize_video(win, 1, 2); + } + break; + + case 0x03: /* 2 - 100% (native) size */ + if(num_down == 0) + { + num_down = 1; + resize_video(win, 1, 1); + } + break; + + case 0x04: /* 3 - 200% of native size */ + if(num_down == 0) + { + num_down = 1; + resize_video(win, 2, 1); + } + break; + + case 0x82: /* 1 / 2 / 3 released */ + case 0x83: + case 0x84: + num_down = 0; + break; + + case 0x2F: /* V - toggle vsync (anti-tearing) */ + if(v_down == 0) + { + v_down = 1; + g_vsync = !g_vsync; + } + break; + + case 0xAF: /* V released */ + v_down = 0; + break; + + case 0x0F: /* Tab - cycle the info overlay: + * 1 = full info, 2 = bare fps, 0 = off */ + if(tab_down == 0) + { + tab_down = 1; + g_show_fps = (g_show_fps + 1) % 3; + } + break; + + case 0x8F: /* Tab released */ + tab_down = 0; + break; }; + } case MSG_DRAW_CLIENT: if(main_render) @@ -157,6 +492,19 @@ int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) }; break; + case MSG_MBTNDOWN: + /* Middle mouse button toggles fullscreen, same as the Enter key. */ + toggle_fullscreen(win); + break; + + case MSG_WHEELUP: /* wheel up -> louder */ + change_volume(win, 6); + break; + + case MSG_WHEELDOWN: /* wheel down -> quieter */ + change_volume(win, -6); + break; + case MSG_LBTNDOWN: if(player_state == PAUSE) @@ -217,7 +565,10 @@ int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) break; case ID_PROGRESS: - if(player_state != REWIND) + /* max<=1 means the duration is unknown: there is no + * position to seek to, so ignore progress-bar clicks + * (matches the arrow-key seek guard). */ + if(player_state != REWIND && win->panel.prg->max > 1.0f) { progress_t *prg = (progress_t*)arg2; @@ -266,14 +617,192 @@ int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) return 0; }; +static int g_fps_value = 0; /* frames displayed in the last second */ + +/* Count displayed frames; refresh g_fps_value once per second. */ +static void fps_tick(void) +{ + static int frames = 0; + static uint32_t last = 0; + uint32_t now = get_tick_count(); /* 1/100 s ticks */ + + frames++; + if(last == 0) + last = now; + if(now - last >= 100) /* one second elapsed */ + { + g_fps_value = frames * 100 / (now - last); + frames = 0; + last = now; + } +} + +/* Bake the info overlay straight into the 32bpp BGRA frame buffer (data/pitch), + * so it is part of the picture and survives the blit. fn4 can render into a + * user buffer (flag C=1, bit 27) whose layout is [dword w][dword h][pixels], + * with the pixels inline right after the 8-byte header - pixlib's bitmap is not + * laid out that way, so we render into a small scratch buffer with a + * transparent (alpha 0) background and colour-key it onto the frame: the kernel + * marks glyph pixels with alpha 0xFF, everything else stays 0. + * + * Tab cycles g_show_fps: 1 = full info block (fps, codecs, bitrate, source and + * output resolution), 2 = bare fps number, 0 = hidden. */ +#define FPS_OVL_W 256 +#define FPS_OVL_H 160 +#define FPS_LINE_H 20 + +/* one line of text into the scratch buffer: fn4, ecx = 0x89.RRGGBB -> + * A=1 asciiz, FF=0 (6x9), C=1 user buffer, SSS=1 (x2 size); green */ +static void ovl_line(uint32_t *ovl, const char *s, int y) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(4), "b"((2 << 16) | y), "c"(0x8900FF00), + "d"(s), "S"(strlen(s)), "D"(ovl) + :"memory"); +} + +static void draw_fps_into(render_t *render, uint8_t *data, uint32_t pitch, + int dst_w, int dst_h) +{ + static uint32_t ovl[2 + FPS_OVL_W*FPS_OVL_H]; /* header + pixels */ + uint32_t *px = ovl + 2; + char buf[64]; + int i, x, y, w, h; + + ovl[0] = FPS_OVL_W; + ovl[1] = FPS_OVL_H; + for(i = 0; i < FPS_OVL_W*FPS_OVL_H; i++) + px[i] = 0; /* transparent background */ + + int ty = 2; + + if(g_show_fps == 1) /* full info block */ + { + vst_t *vst = render->vst; + + sprintf(buf, "FPS: %d", g_fps_value); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + + sprintf(buf, "video: %s", vst->decoder->name); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + + sprintf(buf, "audio: %s", vst->aCodec ? vst->aCodec->name : "none"); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + + if(vst->fCtx->bit_rate > 0) /* only when known */ + { + sprintf(buf, "bitrate: %d kbps", (int)(vst->fCtx->bit_rate/1000)); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + } + + sprintf(buf, "src: %dx%d", + (int)render->ctx_width, (int)render->ctx_height); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + + sprintf(buf, "out: %dx%d", render->rcvideo.r, render->rcvideo.b); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + } + else if(g_show_fps == 2) /* bare fps number */ + { + sprintf(buf, "%d", g_fps_value); + ovl_line(ovl, buf, ty); ty += FPS_LINE_H; + } + + if(vol_overlay_active()) /* volume feedback */ + { + sprintf(buf, "VOL: %d%%", g_vol_pct); + ovl_line(ovl, buf, ty); + } + + w = FPS_OVL_W < dst_w ? FPS_OVL_W : dst_w; + h = FPS_OVL_H < dst_h ? FPS_OVL_H : dst_h; + + for(y = 0; y < h; y++) + { + uint32_t *d = (uint32_t*)(data + y*pitch); + uint32_t *s = px + y*FPS_OVL_W; + for(x = 0; x < w; x++) + if(s[x] & 0xFF000000) /* a glyph pixel */ + d[x] = s[x]; + } +} + +/* Refresh the elapsed/total time in the panel, but only when the whole second + * changes (drawing is not free). Driven from prg->current (microseconds), + * which advances for both video and audio-only (MP3) playback. */ +static void update_time_display(render_t *render) +{ + static int last_sec = -1; + progress_t *prg = render->win->panel.prg; + int elapsed; + + if(render->win->win_state == FULLSCREEN) + return; + + elapsed = (int)(prg->current / 1000000.0f); + if(elapsed == last_sec) + return; + last_sec = elapsed; + + draw_panel_time(&render->win->panel, elapsed, (int)(prg->max / 1000000.0f)); +} + +/* While the volume overlay is up (or has just expired and must be erased), + * re-blit the last frame so the overlay shows and disappears even when no new + * frames are being drawn - pause, stopped, MP3 cover art. Throttled to ~10 Hz; + * during normal playback the regular frame flow composites it instead. Re-uses + * the same last_frame re-draw as render_adjust_size(). */ +static void vol_overlay_refresh(render_t *render) +{ + static uint32_t last = 0; + static int shown = 0; + int active = vol_overlay_active(); + uint32_t now; + + if(!active && !shown) + return; + if(render->last_frame == NULL) + return; + + now = get_tick_count(); + if(active && now - last < 10) + return; + + last = now; + shown = active; /* one extra draw after expiry erases it */ + render->draw(render, render->last_frame); +} + +/* Frame-pacing state (render_time). The master clock is the sound stream + * (GetTimeStamp: time_base + played-time, milliseconds). When it is not + * usable - no audio track, or the post-seek window before the audio thread + * re-anchors it with SetTimeBase, or a wedged audio thread that never will - + * frames are paced against the wall clock instead (fn26.9 ticks, anchored so + * that the current frame is due immediately), and pacing returns to the + * audio clock as soon as it agrees with the frame timestamps again. */ +static int g_wall_pace = 0; /* pacing by wall clock, not sound clock */ +static double g_wall_bias = 0; /* pts == wall_ms + bias => frame due */ +static double g_held_pts = -1.0; /* head frame we are waiting to become due */ +static uint32_t g_held_tick = 0; /* tick the wait on it started */ +static double g_last_ctime = 0; /* last sound-clock sample... */ +static uint32_t g_last_ctick = 0; /* ...and the tick it changed (liveness) */ + void render_time(render_t *render) { - progress_t *prg = main_render->win->panel.prg; - level_t *lvl = main_render->win->panel.lvl; - vst_t *vst = main_render->vst; + progress_t *prg; + level_t *lvl; + vst_t *vst; double ctime; /* milliseconds */ double fdelay; /* milliseconds */ + /* Always work with the current global render pointer. */ + render = main_render; + + prg = render->win->panel.prg; + lvl = render->win->panel.lvl; + vst = render->vst; + if(player_state == CLOSED) { render->win->win_command = WIN_CLOSED; @@ -281,6 +810,11 @@ void render_time(render_t *render) } else if((player_state == PAUSE) || (player_state == REWIND)) { + /* pacing anchors are stale after a pause or a seek */ + g_wall_pace = 0; + g_held_pts = -1.0; + if(player_state == PAUSE) /* not during REWIND: frames in flux */ + vol_overlay_refresh(render); delay(1); return; } @@ -291,6 +825,7 @@ void render_time(render_t *render) } else if(player_state != PLAY) { + vol_overlay_refresh(render); delay(1); return; }; @@ -299,37 +834,203 @@ void render_time(render_t *render) if(list_empty(&vst->output_list)) { mutex_unlock(&vst->output_lock); + + /* Cover-art audio (an MP3 whose video stream is a single ATTACHED_PIC + * frame) produces no further video frames, so the frame branch below + * that advances the bar from vframe->pts never runs again. Drive it + * from the audio master clock instead. Do this ONLY for cover art: for + * real video the master clock is real elapsed time, which for a slow + * codec that cannot keep up races far past the shown frame AND past the + * duration (0:56/0:04) - real video must track vframe->pts alone. + * get_master_clock() is ms; prg->current shares prg->max's unit (us). */ + if(vst->has_sound && player_state == PLAY && + main_render->win->win_state != FULLSCREEN && + (vst->fCtx->streams[vst->vStream]->disposition + & AV_DISPOSITION_ATTACHED_PIC)) + { + double ctime = get_master_clock(); + if(ctime > 0.0) + { + prg->current = ctime * 1000; + if(prg->max > 1.0f && prg->current > prg->max) + prg->current = prg->max; + send_message(&prg->ctrl, PRG_PROGRESS, 0, 0); + update_time_display(main_render); + } + } + vol_overlay_refresh(render); /* cover art: no frame flow to draw it */ delay(1); } else { vframe_t *vframe; - int sys_time; + double pts; + double wall_ms; + uint32_t now; + /* PEEK the head frame - it is popped only once it is due. A frame + * that is early stays in the queue and we return after a 10 ms nap, + * so the video thread (= the window event loop) is never held for + * long, the frame is presented exactly on time, and the video can + * never run ahead of the clock (the post-seek 45-fps desync). Only + * this thread removes frames, so the head can change under us only + * to an EARLIER frame (the decoder inserts sorted by pts). */ + vframe = list_first_entry(&vst->output_list, vframe_t, list); + pts = vframe->pts; + mutex_unlock(&vst->output_lock); + + now = get_tick_count(); + wall_ms = now * 10.0; + + if(vst->has_sound == 0) + { + /* no audio track = no master clock at all: wall-pace the video + * from the first frame (before, it free-ran at decode speed) */ + if(g_wall_pace == 0) + { + g_wall_pace = 1; + g_wall_bias = pts - wall_ms; + } + fdelay = pts - (wall_ms + g_wall_bias); + + /* a backward pts jump (stream wrap, concatenated segments) would + * leave every following frame "late" and free-run: re-anchor */ + if(fdelay < -3000.0) + { + g_wall_bias = pts - wall_ms; + fdelay = 0.0; + } + } + else + { + int clock_live; + + ctime = get_master_clock(); + + /* While the ring is really playing the sound clock interpolates + * sample-accurately, so consecutive reads always differ; a value + * that has not moved for 300 ms of wall time = frozen clock + * (stopped ring, wedged audio thread). */ + if(ctime != g_last_ctime) + { + g_last_ctime = ctime; + g_last_ctick = now; + } + clock_live = (now - g_last_ctick) < 30; + + fdelay = pts - ctime; /* vs the sound clock */ + + if(g_wall_pace) + { + if(fdelay > -500.0 && fdelay < 500.0) + g_wall_pace = 0; /* clocks agree again - back to audio */ + else + { + if(clock_live) + { + /* the sound clock is alive but disagrees: slew our + * anchor toward it (~200 ms/s) so the offset drains + * instead of being locked in - video that fell far + * behind a slow decoder catches up and re-syncs */ + double target = ctime - wall_ms; + + if(g_wall_bias > target + 2.0) + g_wall_bias -= 2.0; + else if(g_wall_bias < target - 2.0) + g_wall_bias += 2.0; + else + g_wall_bias = target; + } + fdelay = pts - (wall_ms + g_wall_bias); + + if(fdelay < -3000.0) /* backward pts jump */ + { + g_wall_bias = pts - wall_ms; + fdelay = 0.0; + } + } + } + else if(fdelay > 3000.0 || fdelay < -3000.0) + { + /* clock nowhere near the frames (post-seek window before the + * audio thread re-anchors it, or it never will): wall-pace + * from here, this frame due now */ + g_wall_pace = 1; + g_wall_bias = pts - wall_ms; + fdelay = 0.0; + } + } + + if(fdelay > 15.0) + { + if(pts != g_held_pts) + { + g_held_pts = pts; + g_held_tick = now; + } + /* Frozen-clock escape: the same frame refusing to become due for + * a second WHILE the sound clock is not moving means nobody will + * ever release it - wall-pace from it. A frame legitimately due + * far in the future (sub-1-fps timelapse) keeps waiting: its + * clock IS advancing. */ + if(g_wall_pace == 0 && + now - g_held_tick > 100 && now - g_last_ctick > 100) + { + g_wall_pace = 1; + g_wall_bias = pts - wall_ms; + fdelay = 0.0; + } + else + { + delay(1); + return; + } + } + g_held_pts = -1.0; + + /* the frame is due (or late) - now pop it */ + mutex_lock(&vst->output_lock); vframe = list_first_entry(&vst->output_list, vframe_t, list); list_del(&vframe->list); vst->frames_count--; mutex_unlock(&vst->output_lock); - ctime = get_master_clock(); - fdelay = (vframe->pts - ctime); - - if(fdelay > 15.0) - { - delay((int)fdelay/10); - }; + /* Adaptive B-frame skip (applied in decode_video): fall >300 ms behind + * the audio clock -> let the codec drop non-reference frames to lighten + * decode and keep pace; within 80 ms again -> full quality. Files the + * CPU can decode in real time keep fdelay near 0 and never trip it. + * + * ONLY when the decode itself is the bottleneck, i.e. packets are + * piling up in q_video undecoded. When the queue is empty the video is + * late because the READER cannot deliver (slow USB stick, FAT walk) - + * skipping then just discards frames that did arrive and HALVES the + * shown fps (30->16) without helping at all. */ + if(fdelay < -300.0 && vst->q_video.count > 8) + g_skip_level = 1; + else if(fdelay > -80.0 || vst->q_video.count <= 2) + g_skip_level = 0; // printf("output index: %d pts: %f pkt_pts %f pkt_dts %f\n", // vframe->index,vframe->pts,vframe->pkt_pts,vframe->pkt_dts); main_render->draw(main_render, vframe); + /* Remember this frame so render_adjust_size() can re-scale it into the + * resized bitmap. Matters for a static cover-art frame that is never + * redrawn on its own; for live video it is simply the newest frame. */ + main_render->last_frame = vframe; + + fps_tick(); /* update the displayed-frames counter */ + if(main_render->win->win_state != FULLSCREEN) { prg->current = vframe->pts * 1000; + if(prg->max > 1.0f && prg->current > prg->max) + prg->current = prg->max; lvl->current = vframe->index & 1 ? sound_level_1 : sound_level_0; send_message(&prg->ctrl, PRG_PROGRESS, 0, 0); + update_time_display(main_render); if(main_render->win->panel.layout) send_message(&lvl->ctrl, MSG_PAINT, 0, 0); @@ -343,6 +1044,152 @@ void render_time(render_t *render) } } +/* ------------------------------------------------------------------------- * + * Runtime self-test of the hardware present path. + * + * Whether the GL blitter's output actually reaches the visible screen cannot + * be known in advance: pxInit() succeeding only proves that EGL/Mesa set + * themselves up, not that the final GL->scanout present works (e.g. on Intel + * GMA 3150 under the KMS driver everything initializes, yet nothing becomes + * visible). So we verify it directly: draw a solid-color test frame through + * the hardware blitter, then read the pixels back through the kernel + * (syscall 36 reads the real, composited framebuffer - under KMS the LFB is + * remapped onto the DRM scanout, so it returns what is truly on screen) and + * compare. Two phases with two different colors prove the screen actually + * follows our commands rather than accidentally containing the probe color. + * + * Details dictated by how pxgl works: + * - hw_blit ignores its coordinate arguments and always stretches the whole + * bitmap over the whole client rect at (window_x, window_y+CAPTION_HEIGHT), + * so the probe paints the entire client area and samples inside it; + * - glFlush() submits the batch asynchronously, so the readback is polled; + * - each phase uses a FRESHLY created bitmap: a new GEM object starts in the + * CPU domain and is clflushed on first use, while later CPU writes to the + * same bitmap are never flushed again - on non-LLC GPUs (Gen3/Gen4) the + * GPU could then sample stale data and break the test; + * - the kernel's readback is never polluted by the mouse cursor (under KMS + * the cursor is a hardware overlay plane, under VESA fn36 substitutes the + * saved under-cursor pixels). + * ------------------------------------------------------------------------- */ + +#define PROBE_BM_SIZE 32 /* probe bitmap side, stretched over client */ +#define PROBE_BLOCK 8 /* readback sample block side */ +#define PROBE_TOLERANCE 24 /* per-channel color tolerance */ +#define PROBE_TRIES 30 /* x 10 ms = up to 300 ms per phase */ + +/* syscall 36: read a screen area; buffer gets 3 bytes per pixel (B,G,R), + * rows top-down, no padding; x/y are absolute screen coordinates. */ +static void read_screen_area(void *buf, int x, int y, int w, int h) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(36), "b"(buf), "c"((w << 16) | h), "d"((x << 16) | y) + :"memory"); +} + +static int probe_block_matches(int x, int y, uint32_t color) +{ + uint8_t buf[PROBE_BLOCK*PROBE_BLOCK*3]; + int eb = color & 0xFF; + int eg = (color >> 8) & 0xFF; + int er = (color >> 16) & 0xFF; + int i, d, bad = 0; + + read_screen_area(buf, x, y, PROBE_BLOCK, PROBE_BLOCK); + + for(i = 0; i < PROBE_BLOCK*PROBE_BLOCK; i++) + { + uint8_t *p = buf + i*3; + + d = p[0] - eb; if(d < 0) d = -d; + if(d > PROBE_TOLERANCE) { bad++; continue; } + d = p[1] - eg; if(d < 0) d = -d; + if(d > PROBE_TOLERANCE) { bad++; continue; } + d = p[2] - er; if(d < 0) d = -d; + if(d > PROBE_TOLERANCE) bad++; + } + /* allow a few outliers just in case */ + return bad <= PROBE_BLOCK*PROBE_BLOCK/16; +} + +/* One probe phase: blit a solid-color frame through the current (hardware) + * blitter and poll two sample blocks inside the client rect until they show + * that color. The blit is re-issued and the window position re-read on every + * iteration, so a window that gets moved or briefly obscured mid-probe + * converges instead of pinning a false failure. Returns 1 when the color + * reached the screen. */ +static int probe_phase(render_t *render, uint32_t color) +{ + bitmap_t *bm; + uint8_t *data; + uint32_t pitch; + int i, j, tries; + + bm = pxCreateBitmap(PROBE_BM_SIZE, PROBE_BM_SIZE); + if(bm == NULL) + return 0; + + data = pxLockBitmap(bm, &pitch); + if(data == NULL) + { + pxDestroyBitmap(bm); + return 0; + } + + for(i = 0; i < PROBE_BM_SIZE; i++) + { + uint32_t *row = (uint32_t*)(data + i*pitch); + for(j = 0; j < PROBE_BM_SIZE; j++) + row[j] = 0xFF000000 | color; + } + + for(tries = 0; tries < PROBE_TRIES; tries++) + { + char proc_info[1024]; + int wx, wy; + + /* dst coordinates are ignored on the hw path: the blit stretches the + * bitmap over the whole client rect at the window's current position */ + mutex_lock(&render->vst->gpu_lock); + pxBlitBitmap(bm, 0, CAPTION_HEIGHT, + render->win_width, render->win_height, 0, 0); + mutex_unlock(&render->vst->gpu_lock); + + delay(1); + + /* sample where the blit actually painted: fresh window position from + * fn9, same source hw_blit itself uses */ + get_proc_info(proc_info); + wx = *(int*)(proc_info+34); + wy = *(int*)(proc_info+38); + + if(probe_block_matches(wx + 8, wy + CAPTION_HEIGHT + 8, color) && + probe_block_matches(wx + render->win_width/2, + wy + CAPTION_HEIGHT + render->win_height/2, + color)) + { + pxDestroyBitmap(bm); + return 1; + } + } + + pxDestroyBitmap(bm); + return 0; +} + +static int hw_present_works(render_t *render) +{ + /* client area too small to place the sample blocks - cannot verify, + * keep the hardware path rather than degrade it untested */ + if(render->win_width < 32 || render->win_height < 32) + return 1; + + if(probe_phase(render, 0x2060A0) == 0) + return 0; + + return probe_phase(render, 0xA03020); +} + int video_thread(void *param) { vst_t *vst = param; @@ -353,7 +1200,11 @@ int video_thread(void *param) MainWindow = create_window(vst->input_name,0, 10,10,vst->vCtx->width,vst->vCtx->height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc); - MainWindow->panel.prg->max = stream_duration; + /* only when known: 0 means the container carries no duration; keep the + * create_progress() default then, and the bar/time display degrade + * gracefully instead of dividing by garbage */ + if(stream_duration > 0) + MainWindow->panel.prg->max = stream_duration; show_window(MainWindow, NORMAL); @@ -365,6 +1216,39 @@ int video_thread(void *param) return 0; }; + /* The hardware path initialized - now verify its output really reaches + * the screen (see the probe block above). If it does not, rebuild the + * render on the software kernel blitter, which always presents. The + * decoder is still parked on decoder_lock here, so the GPU is ours. */ + if(main_render->caps != 0) + { + if(hw_present_works(main_render)) + printf("HW blitter present check passed\n"); + else + { + printf("HW blitter present check FAILED, using software\n"); + + /* The software blitter cannot show GPU-decoded (vaapi) frames; + * they are skipped in draw_sw_picture. With a broken present + * they were invisible anyway, but say so in the log. */ + if(vst->decoder->is_hw) + printf("warning: vaapi decoder is active, video will not be visible\n"); + + destroy_render(main_render); /* while the hw driver is active */ + main_render = NULL; + pxFini(); /* tear down EGL, reset to sw */ + g_want_hw = 0; + + main_render = create_render(vst, MainWindow, HW_TEX_BLIT|HW_BIT_BLIT); + if(main_render == NULL) + { + mutex_unlock(&vst->decoder_lock); + printf("Cannot create render\n\r"); + return 0; + } + } + } + __sync_or_and_fetch(&threads_running,VIDEO_THREAD); render_draw_client(main_render); @@ -389,6 +1273,8 @@ int video_thread(void *param) } destroy_render(main_render); + main_render = NULL; + pxFini(); /* tear down hardware driver / EGL context */ fini_winlib(); player_state = CLOSED; return 0; @@ -418,7 +1304,7 @@ render_t *create_render(vst_t *vst, window_t *win, uint32_t flags) render->ctx_height = vst->vCtx->height; render->ctx_format = vst->vCtx->pix_fmt; - render->caps = pxInit(1); + render->caps = pxInit(g_want_hw); right = win->w; bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT; @@ -509,7 +1395,7 @@ void destroy_render(render_t *render) if(render->caps & (HW_BIT_BLIT|HW_TEX_BLIT)) /* hw blitter */ pxDestroyBitmap(render->bitmap[1]); - pxFini(); + free(render); }; void render_set_size(render_t *render, int width, int height) @@ -627,6 +1513,15 @@ void render_adjust_size(render_t *render, window_t *win) if(render->caps & HW_BIT_BLIT) /* hw blitter */ pxResizeBitmap(render->bitmap[1], new_w, new_h); + /* pxResizeBitmap only reallocates the target - the pixels are not rescaled. + * A live video repaints them with the next decoded frame, but an audio file + * with cover art yields a single static frame that is never redrawn, so it + * would appear broken until the next seek. Re-scale the retained frame into + * the freshly sized bitmap. (HW_TEX_BLIT returns above: its bitmap is + * context-sized and the GPU rescales on blit, so no redraw is needed.) */ + if(render->last_frame != NULL && !render->last_frame->is_hw_pic) + render->draw(render, render->last_frame); + return; }; @@ -716,6 +1611,9 @@ void draw_hw_picture(render_t *render, vframe_t *vframe) picture->linesize, 0, render->ctx_height, data, linesize); // printf("sws_scale\n"); + if(g_show_fps || vol_overlay_active()) + draw_fps_into(render, bitmap_data, bitmap_pitch, dst_width, dst_height); + mutex_lock(&render->vst->gpu_lock); if(render->caps & HW_TEX_BLIT) @@ -758,6 +1656,13 @@ void draw_sw_picture(render_t *render, vframe_t *vframe) render->win->win_state == ROLLED) return; + /* A hardware-decoded frame lives in GPU memory and has no CPU-side + * picture, so the software blitter cannot present it. This happens when + * pxInit falls back to software while vaapi decoding is active - skip the + * frame rather than scale garbage. */ + if(vframe->is_hw_pic) + return; + picture = &vframe->picture; cvt_ctx = sws_getCachedContext(cvt_ctx, @@ -786,6 +1691,14 @@ void draw_sw_picture(render_t *render, vframe_t *vframe) sws_scale(cvt_ctx, (const uint8_t* const *)picture->data, picture->linesize, 0, render->ctx_height, data, linesize); + if(g_show_fps || vol_overlay_active()) + draw_fps_into(render, bitmap_data, bitmap_pitch, + render->rcvideo.r, render->rcvideo.b); + + /* sync the framebuffer write to vblank to avoid tearing (see wait_retrace) */ + if(g_vsync) + wait_retrace(); + if(render->win->win_state == FULLSCREEN) pxBlitBitmap(render->bitmap[0],render->rcvideo.l,render->rcvideo.t, render->rcvideo.r, render->rcvideo.b,0,0); @@ -810,17 +1723,37 @@ void render_draw_client(render_t *render) else y = CAPTION_HEIGHT; - if(player_state == PAUSE) + if(render->last_bitmap != NULL) + { + /* An MP3 with embedded album art yields exactly one video frame: + * render_time() blits the cover once, then output_list stays empty + * forever and main_render->draw() is never called again. On an OS + * repaint do_sys_draw() erases the whole client area to black and + * nothing else repaints rcvideo, so the cover turns into a black + * "hole". Re-present the last frame here so it survives every repaint + * in every player state. For hardware-decoded (vaapi is_hw_pic) frames + * draw_hw_picture() returns before setting last_bitmap, so it stays + * NULL and this branch is a no-op - behaviour is unchanged there. */ + mutex_lock(&render->vst->gpu_lock); + pxBlitBitmap(render->last_bitmap, render->rcvideo.l, y + render->rcvideo.t, + render->rcvideo.r, render->rcvideo.b, 0, 0); + mutex_unlock(&render->vst->gpu_lock); + } + else if(player_state == PAUSE) { // if(vst->vframe[vst->vfx].ready == 1 ) // main_render->draw(main_render, &vst->vframe[vst->vfx].picture); // else - draw_bar(0, y, render->win_width, + draw_bar(0, render->rcvideo.t + y, render->win_width, render->rcvideo.b, 0); } else if( player_state == STOP ) { - draw_bar(0,y, render->win_width, + /* start at rcvideo.t so the bar covers the actual video rows; the + * rows above are painted by the HAS_TOP branch below. Without the + * offset a letterboxed (screen-clamped) layout left a horizontal + * strip of the client unpainted. */ + draw_bar(0, render->rcvideo.t + y, render->win_width, render->rcvideo.b, 0); }; diff --git a/contrib/media/fplay/winlib/button.c b/contrib/media/fplay/winlib/button.c index 5063fe3ed..bf5171624 100644 --- a/contrib/media/fplay/winlib/button.c +++ b/contrib/media/fplay/winlib/button.c @@ -277,7 +277,22 @@ int draw_progress(progress_t *prg, int background) }; }; - len = prg->current*prg->ctrl.w/(prg->max - prg->min); + /* max<=1 means the duration is unknown: keep the fill bar EMPTY rather + * than showing a bogus full bar. Otherwise compute and CLAMP the fill in + * float before the int conversion (with an unknown duration the unclamped + * product would overflow len and run the fill loop past the pixmap). */ + if(prg->max <= 1.0f) + len = 0; + else + { + float flen = prg->current*prg->ctrl.w/(prg->max - prg->min); + + if(flen < 0.0f) + flen = 0.0f; + if(flen > prg->ctrl.w) + flen = prg->ctrl.w; + len = (int)flen; + } src = res_prg_level; @@ -473,6 +488,12 @@ int sld_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) slider_t *sld = (slider_t*)ctrl; int pos; + /* the window is too narrow for the volume slider - the panel (parent) + * spans the window, so its width is the window width; skip drawing AND + * interaction (hover would otherwise flip the panel layout) */ + if(ctrl->parent->w < 320) + return 0; + switch( msg ) { case MSG_PAINT: diff --git a/contrib/media/fplay/winlib/caption.c b/contrib/media/fplay/winlib/caption.c index 5f3804a10..73716233f 100644 --- a/contrib/media/fplay/winlib/caption.c +++ b/contrib/media/fplay/winlib/caption.c @@ -99,11 +99,13 @@ void update_caption_size(window_t *win) cpt->close_btn->ctrl.rc.r = cpt->close_btn->ctrl.rc.l + cpt->close_btn->ctrl.w; - cpt->minimize_btn->ctrl.rc.l = win->w - 27 - 18 - 5; + /* Order (left -> right): minimize, fullscreen, close. + * minimize is the leftmost of the three, fullscreen sits in the middle. */ + cpt->minimize_btn->ctrl.rc.l = win->w - 27 - 18 - 18 - 5 - 5; cpt->minimize_btn->ctrl.rc.r = cpt->minimize_btn->ctrl.rc.l + cpt->minimize_btn->ctrl.w; - cpt->full_btn->ctrl.rc.l = win->w - 27 - 18 -18 - 5 - 5; + cpt->full_btn->ctrl.rc.l = win->w - 27 - 18 - 5; cpt->full_btn->ctrl.rc.r = cpt->full_btn->ctrl.rc.l + cpt->full_btn->ctrl.w; }; diff --git a/contrib/media/fplay/winlib/fontlib.c b/contrib/media/fplay/winlib/fontlib.c index d8518d68e..a226180d0 100644 --- a/contrib/media/fplay/winlib/fontlib.c +++ b/contrib/media/fplay/winlib/fontlib.c @@ -83,7 +83,11 @@ int draw_text_ext(void *pixmap, uint32_t pitch, FT_Face face, char *text, rect_t x = rc->l << 6; y = rc->b; - w = (rc->r - rc->l) << 6; + /* right edge in 26.6 fixed point; x is an absolute position, so the + * fit check below must compare against the edge, not the width - + * otherwise any text placed at a large x (e.g. right-aligned) would + * fail the very first check and nothing would be drawn */ + w = rc->r << 6; while( ch = *text++ ) { @@ -96,13 +100,15 @@ int draw_text_ext(void *pixmap, uint32_t pitch, FT_Face face, char *text, rect_t x += delta.x ; } - if( x + face->glyph->advance.x > w) - break; - + /* load FIRST, then check the fit with THIS glyph's advance - the old + * order tested against the stale advance of the previous glyph */ err = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( err ) continue; + if( x + face->glyph->advance.x > w) + break; + err = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_NORMAL ); if ( err ) continue; @@ -118,6 +124,37 @@ int draw_text_ext(void *pixmap, uint32_t pitch, FT_Face face, char *text, rect_t }; +int text_width_ext(FT_Face face, char *text) +{ + FT_UInt glyph_index; + FT_Bool use_kerning = FT_HAS_KERNING( face ); + FT_UInt previous = 0; + int x = 0; + char ch; + + while( ch = *text++ ) + { + glyph_index = FT_Get_Char_Index( face, ansi2utf32(ch) ); + + if( use_kerning && previous && glyph_index ) + { + FT_Vector delta; + FT_Get_Kerning( face, previous, glyph_index, FT_KERNING_DEFAULT, &delta ); + x += delta.x; + } + if( FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ) ) + continue; + + x += face->glyph->advance.x; + previous = glyph_index; + } + /* round UP: truncating loses the fractional part, the string then does + * not quite fit into the measured width and the renderer's fit check + * silently drops the last glyph ("3:20" -> "3:2") */ + return (x + 63) >> 6; /* 26.6 fixed point -> pixels */ +} + + int init_fontlib() { int err; diff --git a/contrib/media/fplay/winlib/panel.c b/contrib/media/fplay/winlib/panel.c index 50822c46f..0ae8aaeb4 100644 --- a/contrib/media/fplay/winlib/panel.c +++ b/contrib/media/fplay/winlib/panel.c @@ -32,6 +32,7 @@ extern int res_stop_btn_pressed[]; //extern int res_minimize_btn_pressed[]; void update_panel_size(window_t *win); +static void render_time_text(panel_t *panel); int panel_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2); @@ -220,6 +221,10 @@ void draw_panel(panel_t *panel) send_message(child, MSG_PAINT, 0, 0); child = (ctrl_t*)child->link.next; }; + + /* a full panel repaint just erased the time text in the pixmap; put it + * back so it does not blink out until the next second ticks over */ + render_time_text(panel); }; int panel_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) @@ -261,6 +266,12 @@ int panel_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) } break; + case MSG_WHEELUP: + case MSG_WHEELDOWN: + /* let the window handle the wheel (volume) wherever it is over + * the panel, not only above a particular child control */ + return send_message(get_parent_window(ctrl), msg, arg1, arg2); + case MSG_COMMAND: switch((short)arg1) { @@ -293,3 +304,106 @@ void blit_panel(panel_t *panel) panel->ctrl.w, panel->ctrl.h, ctx->pixmap_pitch); }; +extern int win_font; +int draw_text_ext(void *pixmap, uint32_t pitch, int face, char *text, rect_t *rc, int color); +int text_width_ext(int face, char *text); + +/* elapsed / total time, bottom-right of the panel, in the same white as the + * window-caption text. Rendered straight into the panel pixmap (like the + * caption text) so it blits cleanly with no per-digit artefacts; the + * panel-body gradient is restored under it first so old text is erased. */ +#define TIME_COLOR 0xFFFFFF /* white - same as the caption title text */ +#define TIME_MAXW 120 +#define TIME_Y0 25 +#define TIME_Y1 44 +#define TIME_BASE 40 + +static void fmt_time(char *buf, int sec) +{ + int h, m, s; + + if(sec < 0) /* clamp BEFORE splitting into h/m/s */ + sec = 0; + + h = sec / 3600; + m = (sec / 60) % 60; + s = sec % 60; + + if(h) + sprintf(buf, "%d:%02d:%02d", h, m, s); + else + sprintf(buf, "%d:%02d", m, s); +} + +/* last shown values, so a full panel repaint can restore the text instead of + * leaving a blank until the next second ticks over */ +static int time_elapsed = -1; +static int time_total = 0; + +/* render the cached time into the panel pixmap (no blit) */ +static void render_time_text(panel_t *panel) +{ + ctx_t *ctx = &panel->ctx; + int *pixmap = (int*)ctx->pixmap_data; + int pitch4 = ctx->pixmap_pitch / 4; + int panw = panel->ctrl.w; + char buf[48], es[20], ts[20]; + rect_t rc; + int x, y, x0, x1, tw; + + if(time_elapsed < 0) /* nothing shown yet */ + return; + if(panw < 260) /* too narrow: would clash with the left */ + return; + + fmt_time(es, time_elapsed); + if(time_total > 0) + { + fmt_time(ts, time_total); + sprintf(buf, "%s / %s", es, ts); + } + else + strcpy(buf, es); /* duration unknown: elapsed only */ + + x1 = panw - 12; + x0 = x1 - TIME_MAXW; + + /* restore the panel-body gradient under the text (one colour per row) */ + for(y = TIME_Y0; y < TIME_Y1; y++) + { + int c = res_panel_body[y]; + int *row = pixmap + y*pitch4; + for(x = x0; x < x1; x++) + row[x] = c; + } + + tw = text_width_ext(win_font, buf); /* right-align to x1 */ + if(tw > TIME_MAXW) + tw = TIME_MAXW; + + rc.l = x1 - tw; + rc.t = TIME_Y0; + rc.r = x1; + rc.b = TIME_BASE; + draw_text_ext(ctx->pixmap_data, ctx->pixmap_pitch, win_font, buf, &rc, TIME_COLOR); +} + +void draw_panel_time(panel_t *panel, int elapsed, int total) +{ + ctx_t *ctx = &panel->ctx; + int panw = panel->ctrl.w; + int x0 = panw - 12 - TIME_MAXW; + + time_elapsed = elapsed; + time_total = total; + + render_time_text(panel); + + if(panw < 260) + return; + + Blit(ctx->pixmap_data, panel->draw.l + x0, panel->draw.t + TIME_Y0, + x0, TIME_Y0, TIME_MAXW, TIME_Y1 - TIME_Y0, + panw, PANEL_HEIGHT, ctx->pixmap_pitch); +} + diff --git a/contrib/media/fplay/winlib/window.c b/contrib/media/fplay/winlib/window.c index bd7e21a7b..8ed1499ce 100644 --- a/contrib/media/fplay/winlib/window.c +++ b/contrib/media/fplay/winlib/window.c @@ -637,6 +637,18 @@ void update_rect(ctrl_t *ctrl) int ctx_w, ctx_h; int src_x, src_y; + /* In fullscreen the caption and panel are hidden, so no control should + * blit itself onto the screen - otherwise e.g. the fullscreen button + * repaints over the video after the switch. Walk up to the root window + * and bail out while it is fullscreen. */ + { + ctrl_t *root = ctrl; + while(root->parent) + root = root->parent; + if(((window_t*)root)->win_state == FULLSCREEN) + return; + } + src_x = ctrl->rc.l - ctrl->ctx->offset_x; src_y = ctrl->rc.t - ctrl->ctx->offset_y; diff --git a/contrib/media/fplay/winlib/winlib.h b/contrib/media/fplay/winlib/winlib.h index 03c4e2fc6..226156913 100644 --- a/contrib/media/fplay/winlib/winlib.h +++ b/contrib/media/fplay/winlib/winlib.h @@ -107,7 +107,9 @@ void init_winlib(void); void draw_caption(caption_t *cpt); void draw_panel(panel_t *panel); +void draw_panel_time(panel_t *panel, int elapsed, int total); void blit_caption(caption_t *cpt); +void blit_panel(panel_t *panel); int init_caption(window_t *win); int init_panel(window_t *win); diff --git a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/egl/Makefile b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/egl/Makefile index dceb9fe21..096ca1255 100644 --- a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/egl/Makefile +++ b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/egl/Makefile @@ -55,7 +55,8 @@ EGL_OBJS = $(patsubst %.c, %.o, $(EGL_SRC)) all: libegl.dll libegl.dll: $(EGL_OBJS) Makefile - $(LD) $(LDFLAGS) -o $@ $(MESA_SRC)/../egl.def $(EGL_OBJS) $(LIBS) + $(file >egl.objs.rsp,$(EGL_OBJS)) + $(LD) $(LDFLAGS) -o $@ $(MESA_SRC)/../egl.def @egl.objs.rsp $(LIBS) # $(STRIP) $@ # sed -e "s/ @[^ ]*//" egl1.def > egl.def mv -f $@ $(SDK_DIR)/bin @@ -65,4 +66,4 @@ libegl.dll: $(EGL_OBJS) Makefile $(CC) $(CFLAGS) $(MESA_DEFS) $(EGL_DEFS) $(INC_EGL) -o $@ $< - \ No newline at end of file + \ No newline at end of file diff --git a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/gallium/Makefile b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/gallium/Makefile index f526a14fe..af41db41c 100644 --- a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/gallium/Makefile +++ b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/gallium/Makefile @@ -175,19 +175,23 @@ I965_OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(I965_SRC))) all: libgallium.a gbm_gallium_drm.dll libgallium.a: $(GALLIUM_OBJS) Makefile - $(AR) crs $@ $(GALLIUM_OBJS) + $(file >gallium.objs.rsp,$(GALLIUM_OBJS)) + $(AR) crs $@ @gallium.objs.rsp mv -f $@ $(INSTALLDIR) gbm_gallium_drm.dll: libgallium.a $(GBM_OBJS) Makefile - $(LD) $(LDFLAGS) -o $@ $(GBM_OBJS) gbm.def $(LIBS) + $(file >gbm.objs.rsp,$(GBM_OBJS)) + $(LD) $(LDFLAGS) -o $@ @gbm.objs.rsp gbm.def $(LIBS) mv -f $@ $(SDK_DIR)/bin - + i965_dri.drv: $(I965_OBJS) $(MESA_OBJS) dri.def Makefile - $(LD) $(LDFLAGS) -o $@ $(I965_OBJS) $(MESA_OBJS) dri.def $(LIBS) + $(file >i965.objs.rsp,$(I965_OBJS) $(MESA_OBJS)) + $(LD) $(LDFLAGS) -o $@ @i965.objs.rsp dri.def $(LIBS) mv -f $@ $(SDK_DIR)/bin osmesa.dll: $(MESA_OBJS) $(OSMESA_OBJS) osmesa.def Makefile - $(LD) $(LDFLAGS) --out-implib libosmesa.dll.a -o $@ $(MESA_OBJS) $(OSMESA_OBJS) osmesa.def $(LIBS) + $(file >osmesa.objs.rsp,$(MESA_OBJS) $(OSMESA_OBJS)) + $(LD) $(LDFLAGS) --out-implib libosmesa.dll.a -o $@ @osmesa.objs.rsp osmesa.def $(LIBS) mv -f libosmesa.dll.a $(INSTALLDIR) mv -f $@ $(SDK_DIR)/bin diff --git a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/glsl/Makefile b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/glsl/Makefile index 14dd91892..ee3afa626 100644 --- a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/glsl/Makefile +++ b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/glsl/Makefile @@ -113,7 +113,8 @@ GLSL_OBJS = $(patsubst %.cpp, %.o, $(patsubst %.c, %.o, $(GLSL_SRC))) all: libglsl.a libglsl.a : $(GLSL_OBJS) Makefile - $(AR) crs libglsl.a $(GLSL_OBJS) + $(file >libglsl.objs.rsp,$(GLSL_OBJS)) + $(AR) crs libglsl.a @libglsl.objs.rsp mv -f libglsl.a $(INSTALLDIR) %.o : %.c Makefile diff --git a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mapi/Makefile b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mapi/Makefile index d2b901fb4..380ee0f88 100644 --- a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mapi/Makefile +++ b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mapi/Makefile @@ -37,7 +37,8 @@ LIBGL_OBJS = $(patsubst %.c, %.o, $(patsubst %.S, %.o, $(LIBGL_SRC))) all: libGL.dll libGL.dll: $(LIBGL_OBJS) Makefile - $(LD) $(LDFLAGS) -o $@ mesa.def $(LIBGL_OBJS) $(LIBS) + $(file >libgl.objs.rsp,$(LIBGL_OBJS)) + $(LD) $(LDFLAGS) -o $@ mesa.def @libgl.objs.rsp $(LIBS) # $(STRIP) $@ mv -f $@ $(SDK_DIR)/bin mv -f libGL.dll.a $(INSTALLDIR) @@ -48,4 +49,4 @@ libGL.dll: $(LIBGL_OBJS) Makefile %.o : %.S Makefile $(CC) -c -U_WIN32 -I $(MESA_SRC)/mesa -o $@ $< - \ No newline at end of file + \ No newline at end of file diff --git a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mesa/Makefile b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mesa/Makefile index 6e76ddbea..3650a3ba0 100644 --- a/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mesa/Makefile +++ b/contrib/sdk/sources/Mesa/mesa-9.2.5/src/mesa/Makefile @@ -424,17 +424,20 @@ I915_OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(I915_SRC))) all: osmesa.dll i965_dri.drv i915_dri.drv i965_dri.drv: $(I965_OBJS) $(MESA_OBJS) dri.def Makefile - $(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(I965_OBJS) $(MESA_OBJS) dri.def $(LIBS) + $(file >i965.objs.rsp,$(I965_OBJS) $(MESA_OBJS)) + $(LD) $(LDFLAGS) $(LIBPATH) -o $@ @i965.objs.rsp dri.def $(LIBS) # $(STRIP) $@ mv -f $@ $(SDK_DIR)/bin i915_dri.drv: $(I915_OBJS) $(MESA_OBJS) dri.def Makefile - $(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(I915_OBJS) $(MESA_OBJS) dri.def $(LIBS) + $(file >i915.objs.rsp,$(I915_OBJS) $(MESA_OBJS)) + $(LD) $(LDFLAGS) $(LIBPATH) -o $@ @i915.objs.rsp dri.def $(LIBS) # $(STRIP) $@ mv -f $@ $(SDK_DIR)/bin osmesa.dll: $(MESA_OBJS) $(OSMESA_OBJS) osmesa.def Makefile - $(LD) $(LDFLAGS) --out-implib libosmesa.dll.a -o $@ $(MESA_OBJS) $(OSMESA_OBJS) osmesa.def $(LIBS) + $(file >osmesa.objs.rsp,$(MESA_OBJS) $(OSMESA_OBJS)) + $(LD) $(LDFLAGS) --out-implib libosmesa.dll.a -o $@ @osmesa.objs.rsp osmesa.def $(LIBS) mv -f libosmesa.dll.a $(INSTALLDIR) mv -f $@ $(SDK_DIR)/bin diff --git a/contrib/sdk/sources/SDL-1.2.2_newlib/include/SDL_keysym.h b/contrib/sdk/sources/SDL-1.2.2_newlib/include/SDL_keysym.h index cd1a3cd19..2cd5aad65 100755 --- a/contrib/sdk/sources/SDL-1.2.2_newlib/include/SDL_keysym.h +++ b/contrib/sdk/sources/SDL-1.2.2_newlib/include/SDL_keysym.h @@ -284,6 +284,7 @@ typedef enum { SDLK_MENU = 319, SDLK_POWER = 320, /* Power Macintosh power key */ SDLK_EURO = 321, /* Some european keyboards */ + SDLK_UNDO = 322, /* Atari keyboard has Undo */ /* Add any other keys here */ diff --git a/contrib/sdk/sources/SDL-1.2.2_newlib/src/thread/SDL_sysmutex.c b/contrib/sdk/sources/SDL-1.2.2_newlib/src/thread/SDL_sysmutex.c index 325ada81c..9fa037ad5 100755 --- a/contrib/sdk/sources/SDL-1.2.2_newlib/src/thread/SDL_sysmutex.c +++ b/contrib/sdk/sources/SDL-1.2.2_newlib/src/thread/SDL_sysmutex.c @@ -24,10 +24,29 @@ */ -/* An implementation of mutexes using semaphores */ +/* + * KolibriOS mutex implementation. + * + * SDL here is built with -DDISABLE_THREADS, which would normally turn + * SDL semaphores into stubs (returning NULL) and SDL mutexes into no-ops. + * However, the KolibriOS audio backend (SDL_kolibri_audio.c) runs the SDL + * audio callback in a REAL kernel thread created with _ksys_create_thread. + * Applications such as ScummVM use SDL mutexes (via Common::Mutex) to guard + * shared state (the audio mixer, software music drivers, ...) against + * concurrent access from that audio thread and the main thread. With no-op + * mutexes this synchronization silently disappears, leading to races and + * crashes (e.g. a function pointer read while being overwritten -> a call + * through a near-null pointer). + * + * So we provide a genuine, recursive mutex here, implemented as a small + * spinlock that yields the CPU to other threads while waiting. It does not + * rely on SDL semaphores (which stay stubbed out under DISABLE_THREADS). + */ #include #include +#include +#include #include "SDL_error.h" #include "SDL_thread.h" @@ -35,28 +54,23 @@ struct SDL_mutex { - int recursive; - Uint32 owner; - SDL_sem *sem; + volatile int guard; /* spinlock guarding the fields below */ + volatile uint32_t owner; /* tid of the owning thread, 0 if free */ + volatile int recursive; /* current lock/recursion depth */ }; +static uint32_t kos_current_tid(void) +{ + ksys_thread_t ti; + _ksys_thread_info(&ti, KSYS_THIS_SLOT); + return ti.pid; +} + /* Create a mutex */ SDL_mutex *SDL_CreateMutex(void) { - SDL_mutex *mutex; - - /* Allocate mutex memory */ - mutex = (SDL_mutex *)malloc(sizeof(*mutex)); - if ( mutex ) { - /* Create the mutex semaphore, with initial value 1 */ - mutex->sem = SDL_CreateSemaphore(1); - mutex->recursive = 0; - mutex->owner = 0; - if ( ! mutex->sem ) { - free(mutex); - mutex = NULL; - } - } else { + SDL_mutex *mutex = (SDL_mutex *)calloc(1, sizeof(*mutex)); + if ( ! mutex ) { SDL_OutOfMemory(); } return mutex; @@ -66,71 +80,56 @@ SDL_mutex *SDL_CreateMutex(void) void SDL_DestroyMutex(SDL_mutex *mutex) { if ( mutex ) { - if ( mutex->sem ) { - SDL_DestroySemaphore(mutex->sem); - } free(mutex); } } -/* Lock the semaphore */ +/* Lock the mutex (recursive) */ int SDL_mutexP(SDL_mutex *mutex) { -#ifdef DISABLE_THREADS - return 0; -#else - Uint32 this_thread; + uint32_t me; - if ( mutex == NULL ) { - SDL_SetError("Passed a NULL mutex"); - return -1; + /* Some SDL subsystems (e.g. the event queue) never allocate a mutex + under DISABLE_THREADS and pass NULL here. Those are only touched from + the main thread, so treat a NULL mutex as a silent no-op instead of + flooding errors. Real mutexes (the mixer's, ...) are non-NULL and are + genuinely locked below. */ + if ( mutex == NULL ) + return 0; + + me = kos_current_tid(); + for ( ;; ) { + /* acquire the short internal guard */ + while ( __sync_lock_test_and_set(&mutex->guard, 1) ) + _ksys_thread_yield(); + + if ( mutex->owner == 0 || mutex->owner == me ) { + mutex->owner = me; + ++mutex->recursive; + __sync_lock_release(&mutex->guard); + return 0; + } + + /* owned by another thread: drop the guard, yield and retry */ + __sync_lock_release(&mutex->guard); + _ksys_thread_yield(); } - - this_thread = SDL_ThreadID(); - if ( mutex->owner == this_thread ) { - ++mutex->recursive; - } else { - /* The order of operations is important. - We set the locking thread id after we obtain the lock - so unlocks from other threads will fail. - */ - SDL_SemWait(mutex->sem); - mutex->owner = this_thread; - mutex->recursive = 0; - } - - return 0; -#endif /* DISABLE_THREADS */ } /* Unlock the mutex */ int SDL_mutexV(SDL_mutex *mutex) { -#ifdef DISABLE_THREADS - return 0; -#else - if ( mutex == NULL ) { - SDL_SetError("Passed a NULL mutex"); - return -1; + if ( mutex == NULL ) + return 0; /* no-op for NULL mutexes (see SDL_mutexP) */ + + while ( __sync_lock_test_and_set(&mutex->guard, 1) ) + _ksys_thread_yield(); + + if ( mutex->recursive > 0 ) { + if ( --mutex->recursive == 0 ) + mutex->owner = 0; } - /* If we don't own the mutex, we can't unlock it */ - if ( SDL_ThreadID() != mutex->owner ) { - SDL_SetError("mutex not owned by this thread"); - return -1; - } - - if ( mutex->recursive ) { - --mutex->recursive; - } else { - /* The order of operations is important. - First reset the owner so another thread doesn't lock - the mutex and set the ownership before we reset it, - then release the lock semaphore. - */ - mutex->owner = 0; - SDL_SemPost(mutex->sem); - } + __sync_lock_release(&mutex->guard); return 0; -#endif /* DISABLE_THREADS */ } diff --git a/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_events.c b/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_events.c index 82291644a..326e05d81 100755 --- a/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_events.c +++ b/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_events.c @@ -190,16 +190,47 @@ void kos_PumpEvents(_THIS) static uint32_t old_mouse_but = 0; mouse_pos = _ksys_get_mouse_pos(KSYS_MOUSE_WINDOW_POS); + /* In fullscreen the game is centered, so translate the + window-relative mouse position into game coordinates. */ + mouse_pos.x -= this->hidden->vx_ofs; + mouse_pos.y -= this->hidden->vy_ofs; if (mouse_pos.x >= 0 && mouse_pos.x < this->hidden->win_size_x && mouse_pos.y >= 0 && mouse_pos.y < this->hidden->win_size_y || - this->input_grab != SDL_GRAB_OFF) { + this->input_grab == SDL_GRAB_ON) { - if (this->input_grab != SDL_GRAB_OFF) { - center_pos.x = mouse_pos.x-this->hidden->win_size_x/2; - center_pos.y = mouse_pos.y-this->hidden->win_size_y/2; - if (center_pos.x || center_pos.y) { - SDL_PrivateMouseMotion(0, 1, center_pos.x, center_pos.y); + if (this->input_grab == SDL_GRAB_ON) { + /* Relative deltas from the PREVIOUS cursor position, + not from the window center: an absolute pointing + device (QEMU usb-tablet, VirtualBox) snaps the + cursor back after every warp, so center-based + deltas grow with the distance and scale with fps. + Re-center only near the border (keeps a real + relative mouse turning); the first event after a + warp only re-seeds prev_pos so the snap-back jump + of a tablet never becomes a delta. */ + static ksys_pos_t prev_pos; + static int prev_valid = 0; + if (prev_valid) { + int adx, ady; + center_pos.x = mouse_pos.x - prev_pos.x; + center_pos.y = mouse_pos.y - prev_pos.y; + adx = center_pos.x < 0 ? -center_pos.x : center_pos.x; + ady = center_pos.y < 0 ? -center_pos.y : center_pos.y; + /* teleport-sized jump = warp echo, not motion */ + if (adx > this->hidden->win_size_x/2 || + ady > this->hidden->win_size_y/2) + center_pos.x = center_pos.y = 0; + if (center_pos.x || center_pos.y) + SDL_PrivateMouseMotion(0, 1, center_pos.x, center_pos.y); + } + prev_pos = mouse_pos; + prev_valid = 1; + if (mouse_pos.x < this->hidden->win_size_x/8 || + mouse_pos.x >= this->hidden->win_size_x - this->hidden->win_size_x/8 || + mouse_pos.y < this->hidden->win_size_y/8 || + mouse_pos.y >= this->hidden->win_size_y - this->hidden->win_size_y/8) { kos_CheckMouseMode(this); + prev_valid = 0; } } else { SDL_PrivateMouseMotion(0, 0, mouse_pos.x, mouse_pos.y); diff --git a/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_video.c b/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_video.c index e50fc27cf..b0bfe6c69 100755 --- a/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_video.c +++ b/contrib/sdk/sources/SDL-1.2.2_newlib/src/video/kolibrios/SDL_kolibri_video.c @@ -13,38 +13,55 @@ static SDL_VideoDevice * vm_suf=NULL; static int was_initialized = 0; static int scrn_size_defined = 0; +static int is_fullscreen = 0; static int has_null_cursor=0; static void* null_cursor; -#define WINDOW_BORDER_H 5 -#define WINDOW_BORDER_W 10 +#define WINDOW_BORDER_H 4 +#define WINDOW_BORDER_W 9 ksys_pos_t screen_size = {0}; void kos_SDL_RepaintWnd(void) { - int win_pos_x, win_pos_y; - int win_size_w = vm_suf->hidden->win_size_x+WINDOW_BORDER_W; - int win_size_h = vm_suf->hidden->win_size_y+_ksys_get_skin_height()+WINDOW_BORDER_H; + int win_pos_x = 0, win_pos_y = 0; + int win_size_w, win_size_h; - if (!screen_size.val) { + if (!screen_size.val) screen_size = _ksys_screen_size(); - win_pos_x = screen_size.x/2-win_size_w/2; - win_pos_y = screen_size.y/2-win_size_h/2; + + if (is_fullscreen) { + win_pos_x = 0; + win_pos_y = 0; + win_size_w = screen_size.x + 1; + win_size_h = screen_size.y + 1; + } else { + win_size_w = vm_suf->hidden->win_size_x + WINDOW_BORDER_W; + win_size_h = vm_suf->hidden->win_size_y + _ksys_get_skin_height() + WINDOW_BORDER_H; + win_pos_x = screen_size.x/2 - win_size_w/2; + win_pos_y = screen_size.y/2 - win_size_h/2; } _ksys_start_draw(); - if (vm_suf->hidden->fullscreen) - // borderless window (style Y=1); the surface fills the screen - _ksys_create_window(0, 0, vm_suf->hidden->win_size_x, vm_suf->hidden->win_size_y, vm_suf->hidden->__title, 0, 0x31); - else - // skinned window (Y=4), flag C=1: don't fill the work area + if (is_fullscreen) { + /* style 0x01: type I window (Y=1) "only define area, draw nothing" - + no skin/caption. We paint a black background ourselves and blit + the game centered (vx_ofs, vy_ofs). */ + _ksys_create_window(win_pos_x, win_pos_y, win_size_w, win_size_h, vm_suf->hidden->__title, 0, 0x01); + _ksys_draw_bar(0, 0, win_size_w, win_size_h, 0); + if (vm_suf && vm_suf->hidden->__video_buffer) + _ksys_draw_bitmap(vm_suf->hidden->__video_buffer, + vm_suf->hidden->vx_ofs, vm_suf->hidden->vy_ofs, + vm_suf->hidden->win_size_x, vm_suf->hidden->win_size_y); + } else { + /* style 0x74: skinned fixed-size window (Y=4) with caption (A) and + client-relative coords (B), plus bit C ("don't fill the working + area") so the OS does not paint an opaque background. */ _ksys_create_window(win_pos_x, win_pos_y, win_size_w, win_size_h, vm_suf->hidden->__title, 0, 0x74); - - if (vm_suf && vm_suf->hidden->__video_buffer) { - _ksys_draw_bitmap(vm_suf->hidden->__video_buffer, 0, 0, - vm_suf->hidden->win_size_x, vm_suf->hidden->win_size_y); + if (vm_suf && vm_suf->hidden->__video_buffer) + _ksys_draw_bitmap(vm_suf->hidden->__video_buffer, 0, 0, + vm_suf->hidden->win_size_x, vm_suf->hidden->win_size_y); } _ksys_end_draw(); } @@ -66,8 +83,9 @@ static void kos_UnlockHWSurface(_THIS,SDL_Surface * surface) {/*STUB*/} static void kos_DirectUpdate(_THIS,int numrects,SDL_Rect * rects) { if (numrects) { - _ksys_draw_bitmap(this->hidden->__video_buffer, 0,0, - vm_suf->hidden->win_size_x,vm_suf->hidden->win_size_y); + _ksys_draw_bitmap(this->hidden->__video_buffer, + this->hidden->vx_ofs, this->hidden->vy_ofs, + this->hidden->win_size_x, this->hidden->win_size_y); } } @@ -99,14 +117,12 @@ SDL_Surface *kos_SetVideoMode(_THIS, SDL_Surface *current, int width, int height if (bpp!=24) return NULL; current->flags=flags; - this->hidden->fullscreen = (flags & SDL_FULLSCREEN) ? 1 : 0; current->w=width; current->h=height; current->pitch=width*(bpp>>3); - char info[128]; - sprintf(info, "SetVideoMode %dx%d bpp=%d fullscreen=%d flags=%08x\n", - current->w, current->h, bpp, this->hidden->fullscreen, (unsigned)flags); + char info[100]; + sprintf(info, "width = %d, height = %d, pitch = %d, bpp = %d\n", current->w, current->h, current->pitch, bpp); _ksys_debug_puts(info); current->pixels=this->hidden->__video_buffer=realloc(this->hidden->__video_buffer, current->pitch*current->h); @@ -120,9 +136,21 @@ SDL_Surface *kos_SetVideoMode(_THIS, SDL_Surface *current, int width, int height this->hidden->win_size_y=height; vm_suf=this; + is_fullscreen = (flags & SDL_FULLSCREEN) ? 1 : 0; + if (!screen_size.val) + screen_size = _ksys_screen_size(); + if (is_fullscreen) { + int sw = screen_size.x + 1, sh = screen_size.y + 1; + this->hidden->vx_ofs = (sw > width) ? (sw - width)/2 : 0; + this->hidden->vy_ofs = (sh > height) ? (sh - height)/2 : 0; + } else { + this->hidden->vx_ofs = 0; + this->hidden->vy_ofs = 0; + } + if (was_initialized) { - if (this->hidden->fullscreen) { - _ksys_change_window(0, 0, width, height); + if (is_fullscreen) { + _ksys_change_window(0, 0, screen_size.x + 1, screen_size.y + 1); } else { unsigned newheight = height+_ksys_get_skin_height()+WINDOW_BORDER_H; unsigned newwidth = width+WINDOW_BORDER_W; @@ -130,6 +158,7 @@ SDL_Surface *kos_SetVideoMode(_THIS, SDL_Surface *current, int width, int height int win_pos_y = screen_size.y/2-newheight/2; _ksys_change_window(win_pos_x, win_pos_y, newwidth, newheight); } + kos_SDL_RepaintWnd(); } else { _ksys_set_event_mask(0x27); was_initialized=1; @@ -173,7 +202,7 @@ static int kos_VideoInit(_THIS,SDL_PixelFormat * vformat) static int kos_FlipHWSurface(_THIS,SDL_Surface * surface) { - _ksys_draw_bitmap(surface->pixels, 0, 0, surface->w,surface->h); + _ksys_draw_bitmap(surface->pixels, this->hidden->vx_ofs, this->hidden->vy_ofs, surface->w,surface->h); return 0; } @@ -227,7 +256,11 @@ void kos_FreeWMCursor(_THIS, WMcursor* cursor) void kos_CheckMouseMode(_THIS) { - if (this->input_grab == SDL_GRAB_OFF) + /* Only recenter the pointer for an EXPLICIT grab (Ctrl+M mouselook). + SDL forces input_grab = SDL_GRAB_FULLSCREEN in fullscreen, but ScummVM + (and point-and-click games) need an absolute cursor there, so we do not + recenter for that case. */ + if (this->input_grab != SDL_GRAB_ON) return; ksys_thread_t thread_info; int top = _ksys_thread_info(&thread_info, KSYS_THIS_SLOT); diff --git a/contrib/sdk/sources/ffmpeg/ffmpeg-2.8/library.mak b/contrib/sdk/sources/ffmpeg/ffmpeg-2.8/library.mak index 4287c08be..af6da2c39 100644 --- a/contrib/sdk/sources/ffmpeg/ffmpeg-2.8/library.mak +++ b/contrib/sdk/sources/ffmpeg/ffmpeg-2.8/library.mak @@ -57,7 +57,8 @@ $(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR) $(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SLIBOBJS) $(SUBDIR)lib$(NAME).ver $(SLIB_CREATE_DEF_CMD) - $$(LD) $(SHFLAGS) $(LDFLAGS) $(LDLIBFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS) + $$(file >$(SUBDIR)link_objs.rsp,$$(filter %.o,$$^)) + $$(LD) $(SHFLAGS) $(LDFLAGS) $(LDLIBFLAGS) $$(LD_O) @$(SUBDIR)link_objs.rsp $(FFEXTRALIBS) $(SLIB_EXTRA_CMD) $(Q)cd ./$(SUBDIR) && $(LN_S) $(SLIBNAME_WITH_MAJOR) $(SLIBNAME) cd .. diff --git a/contrib/sdk/sources/newlib/libc/include/kos32sys.h b/contrib/sdk/sources/newlib/libc/include/kos32sys.h new file mode 100644 index 000000000..8bc7b12fc --- /dev/null +++ b/contrib/sdk/sources/newlib/libc/include/kos32sys.h @@ -0,0 +1,679 @@ +#ifndef __KOS_32_SYS_H__ +#define __KOS_32_SYS_H__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//#ifdef CONFIG_DEBUF +// #define DBG(format,...) printf(format,##__VA_ARGS__) +//#else +// #define DBG(format,...) +//#endif + +#define TYPE_3_BORDER_WIDTH 5 +#define WIN_STATE_MINIMIZED 0x02 +#define WIN_STATE_ROLLED 0x04 + +typedef unsigned int color_t; + +typedef union __attribute__((packed)) +{ + uint32_t val; + struct + { + short x; + short y; + }; +}pos_t; + +typedef union __attribute__((packed)) +{ + uint32_t val; + struct + { + uint8_t state; + uint8_t code; + uint16_t ctrl_key; + }; +}oskey_t; + +typedef struct +{ + unsigned handle; + unsigned io_code; + void *input; + int inp_size; + void *output; + int out_size; +}ioctl_t; + +#pragma pack(push, 1) +struct proc_info +{ + unsigned long cpu_usage; + unsigned short pos_in_stack; + unsigned short slot; + unsigned short reserved2; + char name[12]; + unsigned long address; + unsigned long memory_usage; + unsigned long ID; + unsigned long left,top; + unsigned long width,height; + unsigned short thread_state; + unsigned short reserved3; + unsigned long cleft, ctop, cwidth, cheight; + unsigned char window_state; + unsigned char reserved4[1024-71]; +}; +#pragma pack(pop) + +struct kolibri_system_colors { + color_t frame_area; + color_t grab_bar; + color_t grab_bar_button; + color_t grab_button_text; + color_t grab_text; + color_t work_area; + color_t work_button; + color_t work_button_text; + color_t work_text; + color_t work_graph; +}; + +static inline void begin_draw(void) +{ + __asm__ __volatile__( + "int $0x40" ::"a"(12),"b"(1)); +}; + +static inline +void end_draw(void) +{ + __asm__ __volatile__( + "int $0x40" ::"a"(12),"b"(2)); +}; + +static inline void +put_image(uint16_t x_coord, uint16_t y_coord, + uint16_t size_x, uint16_t size_y, void *img) +{ + __asm__ __volatile__("int $0x40" + ::"a"(25), + "b"(img), + "c"(size_x<<16 | size_y), + "d"(x_coord<<16 | y_coord)); +}; + + +static inline +void sys_create_window(int x, int y, int w, int h, const char *name, + color_t workcolor, uint32_t style) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(0), + "b"((x << 16) | ((w-1) & 0xFFFF)), + "c"((y << 16) | ((h-1) & 0xFFFF)), + "d"((style << 24) | (workcolor & 0xFFFFFF)), + "D"(name), + "S"(0) : "memory"); +}; + +#define OLD -1 +static inline +void sys_change_window(int new_x, int new_y, int new_w, int new_h) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(67), "b"(new_x), "c"(new_y), "d"(new_w),"S"(new_h) + ); +} + +static inline +void define_button(uint32_t x_w, uint32_t y_h, uint32_t id, uint32_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(8), + "b"(x_w), + "c"(y_h), + "d"(id), + "S"(color)); +}; + +static inline +void draw_line(int xs, int ys, int xe, int ye, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(38), "d"(color), + "b"((xs << 16) | xe), + "c"((ys << 16) | ye)); +} + +static inline +void draw_bar(int x, int y, int w, int h, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(13), "d"(color), + "b"((x << 16) | w), + "c"((y << 16) | h)); +} + +static inline +void draw_bitmap(void *bitmap, int x, int y, int w, int h) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(7), "b"(bitmap), + "c"((w << 16) | h), + "d"((x << 16) | y)); +} + +static inline +void draw_text_sys(const char *text, int x, int y, int len, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(4),"d"(text), + "b"((x << 16) | y), + "S"(len),"c"(color) + :"memory"); +} + +/* +void define_button_text(int x, int y, int w, int h, uint32_t id, uint32_t color, char* text) +{ + define_button(x * 65536 + w, y * 65536 + h, id, color); + + int tx = ((((-strlen(text))*8)+w)/2)+x; + int ty = h/2-7+y; + + draw_text_sys(text, tx, ty, strlen(text), 0x90000000); +}; +*/ + +static inline +uint32_t get_skin_height(void) +{ + uint32_t height; + + __asm__ __volatile__( + "int $0x40 \n\t" + :"=a"(height) + :"a"(48),"b"(4)); + return height; +}; + +static inline void BeginDraw(void) __attribute__ ((alias ("begin_draw"))); +static inline void EndDraw(void) __attribute__ ((alias ("end_draw"))); +static inline void DrawWindow(int x, int y, int w, int h, const char *name, + color_t workcolor, uint32_t style) + __attribute__ ((alias ("sys_create_window"))); +static inline void DefineButton(void) __attribute__ ((alias ("define_button"))); +static inline void DrawLine(int xs, int ys, int xe, int ye, color_t color) + __attribute__ ((alias ("draw_line"))); +static inline void DrawBar(int x, int y, int w, int h, color_t color) + __attribute__ ((alias ("draw_bar"))); +static inline void DrawBitmap(void *bitmap, int x, int y, int w, int h) + __attribute__ ((alias ("draw_bitmap"))); +static inline uint32_t GetSkinHeight(void) __attribute__ ((alias ("get_skin_height"))); + + +#define POS_SCREEN 0 +#define POS_WINDOW 1 + +static inline +pos_t get_mouse_pos(int origin) +{ + pos_t val; + + __asm__ __volatile__( + "int $0x40 \n\t" + "rol $16, %%eax" + :"=a"(val) + :"a"(37),"b"(origin)); + return val; +} + +static inline +uint32_t get_mouse_buttons(void) +{ + uint32_t val; + + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(37),"b"(2)); + return val; +}; + +static inline +uint32_t get_mouse_wheels(void) +{ + uint32_t val; + + __asm__ __volatile__( + "int $0x40 \n\t" + :"=a"(val) + :"a"(37),"b"(7)); + return val; +}; + +static inline uint32_t load_cursor(void *path, uint32_t flags) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(37), "b"(4), "c"(path), "d"(flags)); + return val; +} + +static inline uint32_t set_cursor(uint32_t cursor) +{ + uint32_t old; + __asm__ __volatile__( + "int $0x40" + :"=a"(old) + :"a"(37), "b"(5), "c"(cursor)); + return old; +}; + + +#define EVM_REDRAW 1 +#define EVM_KEY 2 +#define EVM_BUTTON 4 +#define EVM_EXIT 8 +#define EVM_BACKGROUND 16 +#define EVM_MOUSE 32 +#define EVM_IPC 64 +#define EVM_STACK 128 +#define EVM_DEBUG 256 +#define EVM_STACK2 512 +#define EVM_MOUSE_FILTER 0x80000000 +#define EVM_CURSOR_FILTER 0x40000000 + +static inline uint32_t set_wanted_events_mask(uint32_t event_mask) +{ + uint32_t old_event_mask; + __asm__ __volatile__( + "int $0x40" + :"=a"(old_event_mask) + :"a"(40),"b"(event_mask)); + + return old_event_mask; +}; + +static inline int destroy_cursor(uint32_t cursor) +{ + int ret; + __asm__ __volatile__( + "int $0x40" + :"=a"(ret) + :"a"(37), "b"(6), "c"(cursor) + :"memory"); + return ret; +}; + +static inline pos_t GetMousePos(int origin) __attribute__ ((alias ("get_mouse_pos"))); +static inline uint32_t GetMouseButtons(void) __attribute__ ((alias ("get_mouse_buttons"))); +static inline uint32_t GetMouseWheels(void) __attribute__ ((alias ("get_mouse_wheels"))); + +static inline uint32_t LoadCursor(void *path, uint32_t flags) __attribute__ ((alias ("load_cursor"))); +static inline uint32_t SetCursor(uint32_t cursor) __attribute__ ((alias ("set_cursor"))); +static inline int DestroyCursor(uint32_t cursor) __attribute__ ((alias ("destroy_cursor"))); + + +static inline +uint32_t wait_for_event(uint32_t time) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(23), "b"(time)); + return val; +}; + +static inline uint32_t check_os_event(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(11)); + return val; +}; + +static inline uint32_t get_os_event(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(10)); + return val; +}; +static inline uint32_t GetOsEvent(void) __attribute__ ((alias ("get_os_event"))); + +static inline +uint32_t get_tick_count(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(26),"b"(9)); + return val; +}; + +static inline +uint64_t get_ns_count(void) +{ + uint64_t val; + __asm__ __volatile__( + "int $0x40" + :"=A"(val) + :"a"(26), "b"(10)); + return val; +}; + +static inline +oskey_t get_key(void) +{ + oskey_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(2)); + return val; +} + +static inline +uint32_t get_os_button(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(17)); + return val>>8; +}; + +static inline uint32_t +heap_init(void) +{ + uint32_t heapsize; + + __asm__ __volatile__( + "int $0x40" + :"=a"(heapsize) + :"a"(68),"b"(11) + ); + + return heapsize; +} + +static inline uint32_t get_service(char *name) +{ + uint32_t retval = 0; + __asm__ __volatile__( + "int $0x40" + :"=a"(retval) + :"a"(68),"b"(16),"c"(name) + :"memory"); + + return retval; +}; + +static inline int call_service(ioctl_t *io) +{ + int retval; + + __asm__ __volatile__( + "int $0x40" + :"=a"(retval) + :"a"(68),"b"(17),"c"(io) + :"memory","cc"); + + return retval; +}; + + +static inline void yield(void) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(68), "b"(1)); +}; + +static inline void delay(uint32_t time) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(5), "b"(time) + :"memory"); +}; + +static inline +void *user_alloc(size_t size) +{ + void *val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(12),"c"(size)); + return val; +} + +static inline +int user_free(void *mem) +{ + int val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(13),"c"(mem)); + return val; +} + +static inline +void* user_realloc(void *mem, size_t size) +{ + void *val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(20),"c"(size),"d"(mem) + :"memory"); + + return val; +}; + +static inline +int *user_unmap(void *base, size_t offset, size_t size) +{ + int *val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(26),"c"(base),"d"(offset),"S"(size)); + return val; +}; + +static inline void *UserAlloc(size_t size) __attribute__ ((alias ("user_alloc"))); +static inline int UserFree(void *mem) __attribute__ ((alias ("user_free"))); +static inline void* UserRealloc(void *mem, size_t size) __attribute__ ((alias ("user_realloc"))); +static inline int *UserUnmap(void *base, size_t offset, size_t size) __attribute__ ((alias ("user_unmap"))); + +typedef union +{ + struct + { + void *data; + size_t size; + }; + unsigned long long raw; +}ufile_t; + +static inline ufile_t load_file(const char *path) +{ + ufile_t uf; + + __asm__ __volatile__ ( + "int $0x40" + :"=A"(uf.raw) + :"a" (68), "b"(27),"c"(path)); + + return uf; +}; +static inline ufile_t LoadFile(const char *path) __attribute__ ((alias ("load_file"))); + +static inline int GetScreenSize(void) +{ + int retval; + + __asm__ __volatile__( + "int $0x40" + :"=a"(retval) + :"a"(61), "b"(1)); + return retval; +} + +static inline +pos_t max_screen_size() +{ + pos_t size; + pos_t size_tmp; + __asm__ __volatile__( + "int $0x40" + :"=a"(size_tmp) + :"a"(14)); + size.x = size_tmp.y; + size.y = size_tmp.x; + return size; +}; + +static inline void get_system_colors(struct kolibri_system_colors *color_table) +{ + __asm__ volatile ("int $0x40" + : + :"a"(48),"b"(3),"c"(color_table),"d"(40) + ); +} + +static inline void get_proc_info(char *info) +{ + __asm__ __volatile__( + "int $0x40" + : + :"a"(9), "b"(info), "c"(-1) + :"memory"); +}; +static inline void GetProcInfo(char *info) __attribute__ ((alias ("get_proc_info"))); + + +struct blit_call +{ + int dstx; + int dsty; + int w; + int h; + + int srcx; + int srcy; + int srcw; + int srch; + + void *bitmap; + int stride; +}; + +static inline void Blit(void *bitmap, int dst_x, int dst_y, + int src_x, int src_y, int w, int h, + int src_w, int src_h, int stride) +{ + volatile struct blit_call bc; + + bc.dstx = dst_x; + bc.dsty = dst_y; + bc.w = w; + bc.h = h; + bc.srcx = src_x; + bc.srcy = src_y; + bc.srcw = src_w; + bc.srch = src_h; + bc.stride = stride; + bc.bitmap = bitmap; + + __asm__ __volatile__( + "int $0x40" + ::"a"(73),"b"(0),"c"(&bc.dstx)); +}; + +#define TLS_KEY_PID 0 +#define TLS_KEY_TID 4 +#define TLS_KEY_LOW_STACK 8 +#define TLS_KEY_HIGH_STACK 12 +#define TLS_KEY_LIBC 16 + +unsigned int tls_alloc(void); +int tls_free(unsigned int key); + +static inline int tls_set(unsigned int key, void *val) +{ + int ret = -1; + if(key < 4096) + { + __asm__ __volatile__( + "movl %0, %%fs:(%1)" + ::"r"(val),"r"(key)); + ret = 0; + } + return ret; +}; + +static inline void *tls_get(unsigned int key) +{ + void *val = (void*)-1; + if(key < 4096) + { + __asm__ __volatile__( + "movl %%fs:(%1), %0" + :"=r"(val) + :"r"(key)); + }; + return val; +} + + +int create_thread(int (*proc)(void *param), void *param, int stack_size); + +void* load_library(const char *name); + +void* get_proc_address(void *handle, const char *proc_name); + +void enumerate_libraries(int (*callback)(void *handle, const char* name, + uint32_t base, uint32_t size, void *user_data), + void *user_data); + +#ifdef __cplusplus +} +#endif + + +#endif + + + + + diff --git a/contrib/sdk/sources/pixlib-3/pixlib3.c b/contrib/sdk/sources/pixlib-3/pixlib3.c index 762899fb3..1fe52cbce 100644 --- a/contrib/sdk/sources/pixlib-3/pixlib3.c +++ b/contrib/sdk/sources/pixlib-3/pixlib3.c @@ -213,24 +213,38 @@ static struct pix_driver sw_driver = }; +static struct pix_driver *hw_driver; /* cached GL/EGL driver */ +static int hw_state; /* 0 = untried, 1 = ok, 2 = failed */ + uint32_t pxInit(int hw) { void *lib; struct pix_driver *(*drventry)(uint32_t service); + struct pix_driver *drv; uint32_t api_version; ioctl_t io; - if(driver != NULL) - return driver->driver_caps; - - driver = &sw_driver; - - if(hw == 0) + if(hw == 0) /* caller forces software */ + { + driver = &sw_driver; return 0; + } - if (fd != 0) - return driver->driver_caps; + if(hw_state == 1) /* hw already initialized */ + { + driver = hw_driver; + return hw_driver->driver_caps; + } + + if(hw_state == 2) /* hw probed before and failed */ + { + driver = &sw_driver; + return 0; + } + + hw_state = 2; /* pessimistic until we succeed */ + driver = &sw_driver; fd = get_service("DISPLAY"); if (fd == 0) @@ -259,12 +273,13 @@ uint32_t pxInit(int hw) if( drventry == NULL) goto fail; - driver = drventry(fd); - if(driver == NULL) - { - driver = &sw_driver; + drv = drventry(fd); + if(drv == NULL) goto fail; - }; + + hw_driver = drv; + hw_state = 1; + driver = hw_driver; if (driver->driver_caps) printf("2D caps %s%s%s\n", @@ -283,7 +298,10 @@ fail: void pxFini() { - if (driver->fini) - driver->fini(); + if (hw_driver && hw_driver->fini) + hw_driver->fini(); + hw_driver = NULL; + hw_state = 0; + driver = &sw_driver; }; diff --git a/contrib/sdk/sources/pixlib-3/pxgl.c b/contrib/sdk/sources/pixlib-3/pxgl.c index 4d30fab81..6031e38e6 100644 --- a/contrib/sdk/sources/pixlib-3/pxgl.c +++ b/contrib/sdk/sources/pixlib-3/pxgl.c @@ -57,7 +57,6 @@ err_0: static int update_fb(struct render *px, int name, int pitch) { GLenum status; - EGLImageKHR screen; EGLint attribs[] = { EGL_WIDTH, px->scr_width, @@ -77,8 +76,6 @@ static int update_fb(struct render *px, int name, int pitch) if(px->screen == EGL_NO_IMAGE_KHR) goto err_0; - px->screen = screen; - glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, px->texture[TEX_SCREEN],0); diff --git a/data/common/lib/pixlib-gl.dll b/data/common/lib/pixlib-gl.dll index 5b39940c9f694e14b6982c714136c54841dc3460..e218c4eab91d3d95027e23414fdea77248c43ba4 100644 GIT binary patch delta 1031 zcmX|9e{2&~9Dnb6r)86FZgm~A-CA~IY_#?6)~??5?%g7*3NAPoL%=OYB&%*tH^?C- z23ahP*0Rv<88c!SA(>46*g|pv$~2^zBpChxqfwEW2(pAi#7s?eA&d2UtnnqE_x--l z=llJ>@B1-2IQn|#L!WeE%OEO^8_3aEj+r{t1cV6S0NGPd*p6~IyRd~ZFx|uSR0WOx zcMMP#d6+5zP4pwY32&rl@$>Wyew5ZQF5F6kOr68PAddnVfJC=5Gq{7YHUVeMux&ra zm2`$}tbGJTbg7fKmn>`9l$)n3?E1$#d2iyPv-jmYr`!l-O2gE-7>9S5$+86-m)a~C zZ_oipvumju>acvr7(#_ECqmlyhY{Krpwo`}icO#;F76QXypK(LZZ z2QLI60M_;i`im#(yjH4S1$rvhw^}_|f2H<2OL&p@TQ!{^rom6avexy2Cu%C5k|M`4SHP9>XZ8EgF5me^d&SQ z2wTOYqAaDQp|BCohUcEFkwtk}{y@GYUzhL6oDx)?QC?C`Di@Ud%G&79(Z8ZQ)!XXh z8n3;e?b2S;Mzn->QoE`Bt*vMraS)LxWHad^+et4OCI&f6=E-I9ExAs9C3nf6fov=M4lnGTrov@zn3{7VR`+r8!Hedh% delta 1111 zcmX|AeN0R>WMxs77-RNfR?ma!OU^sz{(k3o z?$^2fd;7b`hg_FD;tq88TSoSZJdQ6$l>iVhD?-x5#}8YMwxNkDkMVsRJHS7g?@t&n zCxDgR@VgJJk{#zBVpjfsHqYtY7IqI`1!F&7Z13ZM?g!(+0_|lD+(bw)|v!Ic` zSY$-hxbv(>EZ`Q|kf>MvR%7l$&P3q|hoe2_e5-dMvIZqg=q6hg3;24%a!RUrKFDxM zfzuuY1?+mtO#6DIS@xucSX;>xMdv~P-@47xen^0^ZIOLd5^)xqGC=cTU&GP%_3HN0 z3xy7ocuKA|YdV1(fp{>TYG;3yUgbFUW0{`Y42L$DPGn}AnOjn2859dvTMI(w?fJ~% zz>S>Omj`a-Z5sOwpp+bBgOZB}_mLDb-LKO2YBO&zeMmg%Sq~g1tJj0>6oz1hWV2aN z!Zm>4SyzFn>vc7NOQu}oT$!;iVZO>Gn-ekNha*g~=LV;+YGjO@)X3d+y zFN2@fo~d1^_1A5y+gTT{8?LJi&xWr@ZbvL?x$04M^_V)N&Z!sG7VQ+hPH$6-Uaos| z{fK@{pV8;^i#n1JItzG8&u=&IFh0YeTJ}vC!$z)zGcbymMZ(*OVf diff --git a/data/common/media/fplay b/data/common/media/fplay index 7fda7f76e06c9957f0975cd970de257f0a5a9e9d..8c38ff91d012d394b4a4d0b1eae1dd99557348fe 100644 GIT binary patch literal 393328 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 Y0KHK9+Ko3`3CF;KaeO4L&392$;1ONa4 literal 113781 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 z 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