Skip to content

Commit

Permalink
Merge branch 'mpv-player:master' into pipewire-cubic-volume
Browse files Browse the repository at this point in the history
  • Loading branch information
WhitePeter authored Feb 12, 2025
2 parents e8f0fe0 + f7a681b commit 6280163
Show file tree
Hide file tree
Showing 11 changed files with 517 additions and 151 deletions.
10 changes: 4 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,6 @@ jobs:
matrix:
sys:
- clang64
- mingw32
- mingw64
- ucrt64
defaults:
Expand All @@ -524,8 +523,10 @@ jobs:
update: true
install: git
pacboy: >-
angleproject:p
ca-certificates:p
cc:p
cppwinrt:p
ffmpeg:p
lcms2:p
libarchive:p
Expand All @@ -539,17 +540,14 @@ jobs:
ninja:p
pkgconf:p
python:p
rst2pdf:p
rubberband:p
shaderc:p
spirv-cross:p
uchardet:p
vapoursynth:p
vulkan-devel:p
- name: Install dependencies
if: ${{ matrix.sys != 'mingw32' }}
run: |
pacboy --noconfirm -S {angleproject,cppwinrt,rst2pdf,rubberband}:p
- name: Build with meson
id: build
run: |
Expand Down
3 changes: 0 additions & 3 deletions ci/build-msys2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
args=(
-D{cdda,d3d-hwaccel,d3d11,dvdnav,jpeg,lcms2,libarchive}=enabled
-D{libbluray,lua,shaderc,spirv-cross,uchardet,vapoursynth}=enabled
)

[[ "$SYS" != "mingw32" ]] && args+=(
-D{egl-angle-lib,egl-angle-win32,pdf-build,rubberband,win32-smtc}=enabled
)

Expand Down
91 changes: 91 additions & 0 deletions test/libmpv_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*
* This file is part of mpv.
*
* mpv is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* mpv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
*/

#include <inttypes.h>
#include <libmpv/client.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Stolen from osdep/compiler.h
#ifdef __GNUC__
#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format(printf, a1, a2)))
#define MP_NORETURN __attribute__((noreturn))
#else
#define PRINTF_ATTRIBUTE(a1, a2)
#define MP_NORETURN
#endif

// Broken crap with __USE_MINGW_ANSI_STDIO
#if defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)
#undef PRINTF_ATTRIBUTE
#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (gnu_printf, a1, a2)))
#endif

// Global handle.
static mpv_handle *ctx;
MP_NORETURN PRINTF_ATTRIBUTE(1, 2)

static inline void fail(const char *fmt, ...)
{
if (fmt) {
va_list va;
va_start(va, fmt);
vfprintf(stderr, fmt, va);
va_end(va);
}
exit(1);
}

static inline void exit_cleanup(void)
{
mpv_destroy(ctx);
}

static inline mpv_event *wrap_wait_event(void)
{
while (1) {
mpv_event *ev = mpv_wait_event(ctx, 1);
if (ev->event_id == MPV_EVENT_NONE)
continue;

if (ev->event_id == MPV_EVENT_LOG_MESSAGE) {
mpv_event_log_message *msg = (mpv_event_log_message*)ev->data;
printf("[%s:%s] %s", msg->prefix, msg->level, msg->text);
if (msg->log_level <= MPV_LOG_LEVEL_ERROR)
fail("error was logged");
} else {
return ev;
}
}
}

static inline void check_api_error(int status)
{
if (status < 0)
fail("mpv API error: %s\n", mpv_error_string(status));
}

static inline void initialize(void)
{
check_api_error(mpv_set_option_string(ctx, "vo", "null"));
check_api_error(mpv_set_option_string(ctx, "ao", "null"));
check_api_error(mpv_request_log_messages(ctx, "debug"));
check_api_error(mpv_initialize(ctx));
}
64 changes: 64 additions & 0 deletions test/libmpv_test_file_loading.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* This file is part of mpv.
*
* mpv is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* mpv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
*/

#include "libmpv_common.h"

static void test_file_loading(char *file)
{
const char *cmd[] = {"loadfile", file, NULL};
check_api_error(mpv_command(ctx, cmd));
bool loaded = false;
bool finished = false;
while (!finished) {
mpv_event *event = wrap_wait_event();
switch (event->event_id) {
case MPV_EVENT_FILE_LOADED:
// make sure it loads before exiting
loaded = true;
break;
case MPV_EVENT_END_FILE:
if (loaded)
finished = true;
break;
}
}
if (!finished)
fail("Unable to load test file!\n");
}

int main(int argc, char *argv[])
{
if (argc != 2)
return 1;
atexit(exit_cleanup);

ctx = mpv_create();
if (!ctx)
return 1;

initialize();

const char *fmt = "================ TEST: %s ================\n";
printf(fmt, "test_file_loading");
test_file_loading(argv[1]);
printf("================ SHUTDOWN ================\n");

mpv_command_string(ctx, "quit");
while (wrap_wait_event()->event_id != MPV_EVENT_SHUTDOWN) {}

return 0;
}
70 changes: 70 additions & 0 deletions test/libmpv_test_lavfi_complex.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* This file is part of mpv.
*
* mpv is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* mpv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
*/

#include "libmpv_common.h"

static void test_lavfi_complex(char *file)
{
const char *cmd[] = {"loadfile", file, NULL};
check_api_error(mpv_command(ctx, cmd));
bool finished = false;
bool loaded = false;
while (!finished) {
mpv_event *event = wrap_wait_event();
switch (event->event_id) {
case MPV_EVENT_FILE_LOADED:
// Add file as external and toggle lavfi-complex on.
if (!loaded) {
check_api_error(mpv_set_property_string(ctx, "external-files", file));
const char *add_cmd[] = {"video-add", file, "auto", NULL};
check_api_error(mpv_command(ctx, add_cmd));
check_api_error(mpv_set_property_string(ctx, "lavfi-complex", "[vid1] [vid2] vstack [vo]"));
}
loaded = true;
break;
case MPV_EVENT_END_FILE:
if (loaded)
finished = true;
break;
}
}
if (!finished)
fail("Lavfi complex failed!\n");
}

int main(int argc, char *argv[])
{
if (argc != 2)
return 1;
atexit(exit_cleanup);

ctx = mpv_create();
if (!ctx)
return 1;

initialize();

const char *fmt = "================ TEST: %s ================\n";
printf(fmt, "test_lavfi_complex");
test_lavfi_complex(argv[1]);
printf("================ SHUTDOWN ================\n");

mpv_command_string(ctx, "quit");
while (wrap_wait_event()->event_id != MPV_EVENT_SHUTDOWN) {}

return 0;
}
Loading

0 comments on commit 6280163

Please sign in to comment.