diff options
Diffstat (limited to '')
-rw-r--r-- | libmpv2/libmpv2-sys/include/render.h | 844 |
1 files changed, 428 insertions, 416 deletions
diff --git a/libmpv2/libmpv2-sys/include/render.h b/libmpv2/libmpv2-sys/include/render.h index 563e05f..872da7a 100644 --- a/libmpv2/libmpv2-sys/include/render.h +++ b/libmpv2/libmpv2-sys/include/render.h @@ -17,156 +17,159 @@ #include "client.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -/** - * Overview - * -------- - * - * This API can be used to make mpv render using supported graphic APIs (such - * as OpenGL). It can be used to handle video display. - * - * The renderer needs to be created with mpv_render_context_create() before - * you start playback (or otherwise cause a VO to be created). Then (with most - * backends) mpv_render_context_render() can be used to explicitly render the - * current video frame. Use mpv_render_context_set_update_callback() to get - * notified when there is a new frame to draw. - * - * Preferably rendering should be done in a separate thread. If you call - * normal libmpv API functions on the renderer thread, deadlocks can result - * (these are made non-fatal with timeouts, but user experience will obviously - * suffer). See "Threading" section below. - * - * You can output and embed video without this API by setting the mpv "wid" - * option to a native window handle (see "Embedding the video window" section - * in the client.h header). In general, using the render API is recommended, - * because window embedding can cause various issues, especially with GUI - * toolkits and certain platforms. - * - * Supported backends - * ------------------ - * - * OpenGL: via MPV_RENDER_API_TYPE_OPENGL, see render_gl.h header. - * Software: via MPV_RENDER_API_TYPE_SW, see section "Software renderer" - * - * Threading - * --------- - * - * You are recommended to do rendering on a separate thread than normal libmpv - * use. - * - * The mpv_render_* functions can be called from any thread, under the - * following conditions: - * - only one of the mpv_render_* functions can be called at the same time - * (unless they belong to different mpv cores created by mpv_create()) - * - never can be called from within the callbacks set with - * mpv_set_wakeup_callback() or mpv_render_context_set_update_callback() - * - if the OpenGL backend is used, for all functions the OpenGL context - * must be "current" in the calling thread, and it must be the same OpenGL - * context as the mpv_render_context was created with. Otherwise, undefined - * behavior will occur. - * - the thread does not call libmpv API functions other than the mpv_render_* - * functions, except APIs which are declared as safe (see below). Likewise, - * there must be no lock or wait dependency from the render thread to a - * thread using other libmpv functions. Basically, the situation that your - * render thread waits for a "not safe" libmpv API function to return must - * not happen. If you ignore this requirement, deadlocks can happen, which - * are made non-fatal with timeouts; then playback quality will be degraded, - * and the message - * mpv_render_context_render() not being called or stuck. - * is logged. If you set MPV_RENDER_PARAM_ADVANCED_CONTROL, you promise that - * this won't happen, and must absolutely guarantee it, or a real deadlock - * will freeze the mpv core thread forever. - * - * libmpv functions which are safe to call from a render thread are: - * - functions marked with "Safe to be called from mpv render API threads." - * - client.h functions which don't have an explicit or implicit mpv_handle - * parameter - * - mpv_render_* functions; but only for the same mpv_render_context pointer. - * If the pointer is different, mpv_render_context_free() is not safe. (The - * reason is that if MPV_RENDER_PARAM_ADVANCED_CONTROL is set, it may have - * to process still queued requests from the core, which it can do only for - * the current context, while requests for other contexts would deadlock. - * Also, it may have to wait and block for the core to terminate the video - * chain to make sure no resources are used after context destruction.) - * - if the mpv_handle parameter refers to a different mpv core than the one - * you're rendering for (very obscure, but allowed) - * - * Note about old libmpv version: - * - * Before API version 1.105 (basically in mpv 0.29.x), simply enabling - * MPV_RENDER_PARAM_ADVANCED_CONTROL could cause deadlock issues. This can - * be worked around by setting the "vd-lavc-dr" option to "no". - * In addition, you were required to call all mpv_render*() API functions - * from the same thread on which mpv_render_context_create() was originally - * run (for the same the mpv_render_context). Not honoring it led to UB - * (deadlocks, use of invalid mp_thread handles), even if you moved your GL - * context to a different thread correctly. - * These problems were addressed in API version 1.105 (mpv 0.30.0). - * - * Context and handle lifecycle - * ---------------------------- - * - * Video initialization will fail if the render context was not initialized yet - * (with mpv_render_context_create()), or it will revert to a VO that creates - * its own window. - * - * Currently, there can be only 1 mpv_render_context at a time per mpv core. - * - * Calling mpv_render_context_free() while a VO is using the render context is - * active will disable video. - * - * You must free the context with mpv_render_context_free() before the mpv core - * is destroyed. If this doesn't happen, undefined behavior will result. - * - * Software renderer - * ----------------- - * - * MPV_RENDER_API_TYPE_SW provides an extremely simple (but slow) renderer to - * memory surfaces. You probably don't want to use this. Use other render API - * types, or other methods of video embedding. - * - * Use mpv_render_context_create() with MPV_RENDER_PARAM_API_TYPE set to - * MPV_RENDER_API_TYPE_SW. - * - * Call mpv_render_context_render() with various MPV_RENDER_PARAM_SW_* fields - * to render the video frame to an in-memory surface. The following fields are - * required: MPV_RENDER_PARAM_SW_SIZE, MPV_RENDER_PARAM_SW_FORMAT, - * MPV_RENDER_PARAM_SW_STRIDE, MPV_RENDER_PARAM_SW_POINTER. - * - * This method of rendering is very slow, because everything, including color - * conversion, scaling, and OSD rendering, is done on the CPU, single-threaded. - * In particular, large video or display sizes, as well as presence of OSD or - * subtitles can make it too slow for realtime. As with other software rendering - * VOs, setting "sw-fast" may help. Enabling or disabling zimg may help, - * depending on the platform. - * - * In addition, certain multimedia job creation measures like HDR may not work - * properly, and will have to be manually handled by for example inserting - * filters. - * - * This API is not really suitable to extract individual frames from video etc. - * (basically non-playback uses) - there are better libraries for this. It can - * be used this way, but it may be clunky and tricky. - * - * Further notes: - * - MPV_RENDER_PARAM_FLIP_Y is currently ignored (unsupported) - * - MPV_RENDER_PARAM_DEPTH is ignored (meaningless) - */ + /** + * Overview + * -------- + * + * This API can be used to make mpv render using supported graphic APIs (such + * as OpenGL). It can be used to handle video display. + * + * The renderer needs to be created with mpv_render_context_create() before + * you start playback (or otherwise cause a VO to be created). Then (with + * most backends) mpv_render_context_render() can be used to explicitly + * render the current video frame. Use + * mpv_render_context_set_update_callback() to get notified when there is a + * new frame to draw. + * + * Preferably rendering should be done in a separate thread. If you call + * normal libmpv API functions on the renderer thread, deadlocks can result + * (these are made non-fatal with timeouts, but user experience will + * obviously suffer). See "Threading" section below. + * + * You can output and embed video without this API by setting the mpv "wid" + * option to a native window handle (see "Embedding the video window" section + * in the client.h header). In general, using the render API is recommended, + * because window embedding can cause various issues, especially with GUI + * toolkits and certain platforms. + * + * Supported backends + * ------------------ + * + * OpenGL: via MPV_RENDER_API_TYPE_OPENGL, see render_gl.h header. + * Software: via MPV_RENDER_API_TYPE_SW, see section "Software renderer" + * + * Threading + * --------- + * + * You are recommended to do rendering on a separate thread than normal + * libmpv use. + * + * The mpv_render_* functions can be called from any thread, under the + * following conditions: + * - only one of the mpv_render_* functions can be called at the same time + * (unless they belong to different mpv cores created by mpv_create()) + * - never can be called from within the callbacks set with + * mpv_set_wakeup_callback() or mpv_render_context_set_update_callback() + * - if the OpenGL backend is used, for all functions the OpenGL context + * must be "current" in the calling thread, and it must be the same OpenGL + * context as the mpv_render_context was created with. Otherwise, + * undefined behavior will occur. + * - the thread does not call libmpv API functions other than the + * mpv_render_* functions, except APIs which are declared as safe (see + * below). Likewise, there must be no lock or wait dependency from the render + * thread to a thread using other libmpv functions. Basically, the situation + * that your render thread waits for a "not safe" libmpv API function to + * return must not happen. If you ignore this requirement, deadlocks can + * happen, which are made non-fatal with timeouts; then playback quality will + * be degraded, and the message mpv_render_context_render() not being called + * or stuck. is logged. If you set MPV_RENDER_PARAM_ADVANCED_CONTROL, you + * promise that this won't happen, and must absolutely guarantee it, or a + * real deadlock will freeze the mpv core thread forever. + * + * libmpv functions which are safe to call from a render thread are: + * - functions marked with "Safe to be called from mpv render API threads." + * - client.h functions which don't have an explicit or implicit mpv_handle + * parameter + * - mpv_render_* functions; but only for the same mpv_render_context + * pointer. If the pointer is different, mpv_render_context_free() is not + * safe. (The reason is that if MPV_RENDER_PARAM_ADVANCED_CONTROL is set, it + * may have to process still queued requests from the core, which it can do + * only for the current context, while requests for other contexts would + * deadlock. Also, it may have to wait and block for the core to terminate + * the video chain to make sure no resources are used after context + * destruction.) + * - if the mpv_handle parameter refers to a different mpv core than the one + * you're rendering for (very obscure, but allowed) + * + * Note about old libmpv version: + * + * Before API version 1.105 (basically in mpv 0.29.x), simply enabling + * MPV_RENDER_PARAM_ADVANCED_CONTROL could cause deadlock issues. This + * can be worked around by setting the "vd-lavc-dr" option to "no". In + * addition, you were required to call all mpv_render*() API functions from + * the same thread on which mpv_render_context_create() was originally run + * (for the same the mpv_render_context). Not honoring it led to UB + * (deadlocks, use of invalid mp_thread handles), even if you moved your + * GL context to a different thread correctly. These problems were addressed + * in API version 1.105 (mpv 0.30.0). + * + * Context and handle lifecycle + * ---------------------------- + * + * Video initialization will fail if the render context was not initialized + * yet (with mpv_render_context_create()), or it will revert to a VO that + * creates its own window. + * + * Currently, there can be only 1 mpv_render_context at a time per mpv core. + * + * Calling mpv_render_context_free() while a VO is using the render context + * is active will disable video. + * + * You must free the context with mpv_render_context_free() before the mpv + * core is destroyed. If this doesn't happen, undefined behavior will result. + * + * Software renderer + * ----------------- + * + * MPV_RENDER_API_TYPE_SW provides an extremely simple (but slow) renderer to + * memory surfaces. You probably don't want to use this. Use other render API + * types, or other methods of video embedding. + * + * Use mpv_render_context_create() with MPV_RENDER_PARAM_API_TYPE set to + * MPV_RENDER_API_TYPE_SW. + * + * Call mpv_render_context_render() with various MPV_RENDER_PARAM_SW_* fields + * to render the video frame to an in-memory surface. The following fields + * are required: MPV_RENDER_PARAM_SW_SIZE, MPV_RENDER_PARAM_SW_FORMAT, + * MPV_RENDER_PARAM_SW_STRIDE, MPV_RENDER_PARAM_SW_POINTER. + * + * This method of rendering is very slow, because everything, including color + * conversion, scaling, and OSD rendering, is done on the CPU, + * single-threaded. In particular, large video or display sizes, as well as + * presence of OSD or subtitles can make it too slow for realtime. As with + * other software rendering VOs, setting "sw-fast" may help. Enabling or + * disabling zimg may help, depending on the platform. + * + * In addition, certain multimedia job creation measures like HDR may not + * work properly, and will have to be manually handled by for example + * inserting filters. + * + * This API is not really suitable to extract individual frames from video + * etc. (basically non-playback uses) - there are better libraries for this. + * It can be used this way, but it may be clunky and tricky. + * + * Further notes: + * - MPV_RENDER_PARAM_FLIP_Y is currently ignored (unsupported) + * - MPV_RENDER_PARAM_DEPTH is ignored (meaningless) + */ -/** - * Opaque context, returned by mpv_render_context_create(). - */ -typedef struct mpv_render_context mpv_render_context; + /** + * Opaque context, returned by mpv_render_context_create(). + */ + typedef struct mpv_render_context mpv_render_context; -/** - * Parameters for mpv_render_param (which is used in a few places such as - * mpv_render_context_create(). - * - * Also see mpv_render_param for conventions and how to use it. - */ -typedef enum mpv_render_param_type { + /** + * Parameters for mpv_render_param (which is used in a few places such as + * mpv_render_context_create(). + * + * Also see mpv_render_param for conventions and how to use it. + */ + typedef enum mpv_render_param_type + { /** * Not a valid value, but also used to terminate a params array. Its value * is always guaranteed to be 0 (even if the ABI changes in the future). @@ -230,9 +233,8 @@ typedef enum mpv_render_param_type { MPV_RENDER_PARAM_AMBIENT_LIGHT = 7, /** * X11 Display, sometimes used for hwdec. Valid for - * mpv_render_context_create(). The Display must stay valid for the lifetime - * of the mpv_render_context. - * Type: Display* + * mpv_render_context_create(). The Display must stay valid for the + * lifetime of the mpv_render_context. Type: Display* */ MPV_RENDER_PARAM_X11_DISPLAY = 8, /** @@ -243,8 +245,8 @@ typedef enum mpv_render_param_type { */ MPV_RENDER_PARAM_WL_DISPLAY = 9, /** - * Better control about rendering and enabling some advanced features. Valid - * for mpv_render_context_create(). + * Better control about rendering and enabling some advanced features. + * Valid for mpv_render_context_create(). * * This conflates multiple requirements the API user promises to abide if * this option is enabled: @@ -252,13 +254,13 @@ typedef enum mpv_render_param_type { * - The API user's render thread, which is calling the mpv_render_*() * functions, never waits for the core. Otherwise deadlocks can happen. * See "Threading" section. - * - The callback set with mpv_render_context_set_update_callback() can now - * be called even if there is no new frame. The API user should call the - * mpv_render_context_update() function, and interpret the return value + * - The callback set with mpv_render_context_set_update_callback() can + * now be called even if there is no new frame. The API user should call + * the mpv_render_context_update() function, and interpret the return value * for whether a new frame should be rendered. - * - Correct functionality is impossible if the update callback is not set, - * or not set soon enough after mpv_render_context_create() (the core can - * block while waiting for you to call mpv_render_context_update(), and + * - Correct functionality is impossible if the update callback is not + * set, or not set soon enough after mpv_render_context_create() (the core + * can block while waiting for you to call mpv_render_context_update(), and * if the update callback is not correctly set, it will deadlock, or * block for too long). * @@ -308,8 +310,8 @@ typedef enum mpv_render_param_type { * recommended to use the target time value in mpv_render_frame_info to * wait yourself, or to set the "video-timing-offset" to 0 instead. * - * Disabling this without doing anything in addition will result in A/V sync - * being slightly off. + * Disabling this without doing anything in addition will result in A/V + * sync being slightly off. */ MPV_RENDER_PARAM_BLOCK_FOR_TARGET_TIME = 12, /** @@ -343,7 +345,7 @@ typedef enum mpv_render_param_type { * DRM display, contains drm display handles. * Valid for mpv_render_context_create(). * Type : struct mpv_opengl_drm_params_v2* - */ + */ MPV_RENDER_PARAM_DRM_DISPLAY_V2 = 16, /** * MPV_RENDER_API_TYPE_SW only: rendering target surface size, mandatory. @@ -363,8 +365,8 @@ typedef enum mpv_render_param_type { * * Valid values are: * "rgb0", "bgr0", "0bgr", "0rgb" - * 4 bytes per pixel RGB, 1 byte (8 bit) per component, component bytes - * with increasing address from left to right (e.g. "rgb0" has r at + * 4 bytes per pixel RGB, 1 byte (8 bit) per component, component + * bytes with increasing address from left to right (e.g. "rgb0" has r at * address 0), the "0" component contains uninitialized garbage (often * the value 0, but not necessarily; the bad naming is inherited from * FFmpeg) @@ -392,34 +394,33 @@ typedef enum mpv_render_param_type { * * Both stride and pointer value should be a multiple of 64 to facilitate * fast SIMD operation. Lower alignment might trigger slower code paths, - * and in the worst case, will copy the entire target frame. If mpv is built - * with zimg (and zimg is not disabled), the performance impact might be - * less. - * In either cases, the pointer and stride must be aligned at least to the - * pixel alignment size. Otherwise, crashes and undefined behavior is - * possible on platforms which do not support unaligned accesses (either - * through normal memory access or aligned SIMD memory access instructions). + * and in the worst case, will copy the entire target frame. If mpv is + * built with zimg (and zimg is not disabled), the performance impact might + * be less. In either cases, the pointer and stride must be aligned at + * least to the pixel alignment size. Otherwise, crashes and undefined + * behavior is possible on platforms which do not support unaligned + * accesses (either through normal memory access or aligned SIMD memory + * access instructions). */ MPV_RENDER_PARAM_SW_STRIDE = 19, /* - * MPV_RENDER_API_TYPE_SW only: rendering target surface pixel data pointer, - * mandatory. - * Valid for MPV_RENDER_API_TYPE_SW & mpv_render_context_render(). - * Type: void* + * MPV_RENDER_API_TYPE_SW only: rendering target surface pixel data + * pointer, mandatory. Valid for MPV_RENDER_API_TYPE_SW & + * mpv_render_context_render(). Type: void* * * This points to the first pixel at the left/top corner (0, 0). In - * particular, each line y starts at (pointer + stride * y). Upon rendering, - * all data between pointer and (pointer + stride * h) is overwritten. - * Whether the padding between (w, y) and (0, y + 1) is overwritten is left - * unspecified (it should not be, but unfortunately some scaler backends - * will do it anyway). It is assumed that even the padding after the last - * line (starting at bytepos(w, h) until (pointer + stride * h)) is - * writable. + * particular, each line y starts at (pointer + stride * y). Upon + * rendering, all data between pointer and (pointer + stride * h) is + * overwritten. Whether the padding between (w, y) and (0, y + 1) is + * overwritten is left unspecified (it should not be, but unfortunately + * some scaler backends will do it anyway). It is assumed that even the + * padding after the last line (starting at bytepos(w, h) until (pointer + + * stride * h)) is writable. * * See MPV_RENDER_PARAM_SW_STRIDE for alignment requirements. */ MPV_RENDER_PARAM_SW_POINTER = 20, -} mpv_render_param_type; + } mpv_render_param_type; /** * For backwards compatibility with the old naming of @@ -427,36 +428,37 @@ typedef enum mpv_render_param_type { */ #define MPV_RENDER_PARAM_DRM_OSD_SIZE MPV_RENDER_PARAM_DRM_DRAW_SURFACE_SIZE -/** - * Used to pass arbitrary parameters to some mpv_render_* functions. The - * meaning of the data parameter is determined by the type, and each - * MPV_RENDER_PARAM_* documents what type the value must point to. - * - * Each value documents the required data type as the pointer you cast to - * void* and set on mpv_render_param.data. For example, if MPV_RENDER_PARAM_FOO - * documents the type as Something* , then the code should look like this: - * - * Something foo = {...}; - * mpv_render_param param; - * param.type = MPV_RENDER_PARAM_FOO; - * param.data = & foo; - * - * Normally, the data field points to exactly 1 object. If the type is char*, - * it points to a 0-terminated string. - * - * In all cases (unless documented otherwise) the pointers need to remain - * valid during the call only. Unless otherwise documented, the API functions - * will not write to the params array or any data pointed to it. - * - * As a convention, parameter arrays are always terminated by type==0. There - * is no specific order of the parameters required. The order of the 2 fields in - * this struct is guaranteed (even after ABI changes). - */ -typedef struct mpv_render_param { + /** + * Used to pass arbitrary parameters to some mpv_render_* functions. The + * meaning of the data parameter is determined by the type, and each + * MPV_RENDER_PARAM_* documents what type the value must point to. + * + * Each value documents the required data type as the pointer you cast to + * void* and set on mpv_render_param.data. For example, if + * MPV_RENDER_PARAM_FOO documents the type as Something* , then the code + * should look like this: + * + * Something foo = {...}; + * mpv_render_param param; + * param.type = MPV_RENDER_PARAM_FOO; + * param.data = & foo; + * + * Normally, the data field points to exactly 1 object. If the type is char*, + * it points to a 0-terminated string. + * + * In all cases (unless documented otherwise) the pointers need to remain + * valid during the call only. Unless otherwise documented, the API functions + * will not write to the params array or any data pointed to it. + * + * As a convention, parameter arrays are always terminated by type==0. There + * is no specific order of the parameters required. The order of the 2 fields + * in this struct is guaranteed (even after ABI changes). + */ + typedef struct mpv_render_param + { enum mpv_render_param_type type; void *data; -} mpv_render_param; - + } mpv_render_param; /** * Predefined values for MPV_RENDER_PARAM_API_TYPE. @@ -466,10 +468,12 @@ typedef struct mpv_render_param { // See section "Software renderer" #define MPV_RENDER_API_TYPE_SW "sw" -/** - * Flags used in mpv_render_frame_info.flags. Each value represents a bit in it. - */ -typedef enum mpv_render_frame_info_flag { + /** + * Flags used in mpv_render_frame_info.flags. Each value represents a bit in + * it. + */ + typedef enum mpv_render_frame_info_flag + { /** * Set if there is actually a next frame. If unset, there is no next frame * yet, and other flags and fields that require a frame to be queued will @@ -485,18 +489,18 @@ typedef enum mpv_render_frame_info_flag { * MPV_RENDER_UPDATE_FRAME flag set, this flag will usually be set as well, * unless the frame is rendered, or discarded by other asynchronous events. */ - MPV_RENDER_FRAME_INFO_PRESENT = 1 << 0, + MPV_RENDER_FRAME_INFO_PRESENT = 1 << 0, /** - * If set, the frame is not an actual new video frame, but a redraw request. - * For example if the video is paused, and an option that affects video - * rendering was changed (or any other reason), an update request can be - * issued and this flag will be set. + * If set, the frame is not an actual new video frame, but a redraw + * request. For example if the video is paused, and an option that affects + * video rendering was changed (or any other reason), an update request can + * be issued and this flag will be set. * * Typically, redraw frames will not be subject to video timing. * * Implies MPV_RENDER_FRAME_INFO_PRESENT. */ - MPV_RENDER_FRAME_INFO_REDRAW = 1 << 1, + MPV_RENDER_FRAME_INFO_REDRAW = 1 << 1, /** * If set, this is supposed to reproduce the previous frame perfectly. This * is usually used for certain "video-sync" options ("display-..." modes). @@ -504,7 +508,7 @@ typedef enum mpv_render_frame_info_flag { * * Implies MPV_RENDER_FRAME_INFO_PRESENT. */ - MPV_RENDER_FRAME_INFO_REPEAT = 1 << 2, + MPV_RENDER_FRAME_INFO_REPEAT = 1 << 2, /** * If set, the player timing code expects that the user thread blocks on * vsync (by either delaying the render call, or by making a call to @@ -512,14 +516,15 @@ typedef enum mpv_render_frame_info_flag { * * Implies MPV_RENDER_FRAME_INFO_PRESENT. */ - MPV_RENDER_FRAME_INFO_BLOCK_VSYNC = 1 << 3, -} mpv_render_frame_info_flag; + MPV_RENDER_FRAME_INFO_BLOCK_VSYNC = 1 << 3, + } mpv_render_frame_info_flag; -/** - * Information about the next video frame that will be rendered. Can be - * retrieved with MPV_RENDER_PARAM_NEXT_FRAME_INFO. - */ -typedef struct mpv_render_frame_info { + /** + * Information about the next video frame that will be rendered. Can be + * retrieved with MPV_RENDER_PARAM_NEXT_FRAME_INFO. + */ + typedef struct mpv_render_frame_info + { /** * A bitset of mpv_render_frame_info_flag values (i.e. multiple flags are * combined with bitwise or). @@ -531,221 +536,228 @@ typedef struct mpv_render_frame_info { * frames that are redrawn, or if vsync locked video timing is used (see * "video-sync" option), then this can be 0. The "video-timing-offset" * option determines how much "headroom" the render thread gets (but a high - * enough frame rate can reduce it anyway). mpv_render_context_render() will - * normally block until the time is elapsed, unless you pass it + * enough frame rate can reduce it anyway). mpv_render_context_render() + * will normally block until the time is elapsed, unless you pass it * MPV_RENDER_PARAM_BLOCK_FOR_TARGET_TIME = 0. */ int64_t target_time; -} mpv_render_frame_info; + } mpv_render_frame_info; -/** - * Initialize the renderer state. Depending on the backend used, this will - * access the underlying GPU API and initialize its own objects. - * - * You must free the context with mpv_render_context_free(). Not doing so before - * the mpv core is destroyed may result in memory leaks or crashes. - * - * Currently, only at most 1 context can exists per mpv core (it represents the - * main video output). - * - * You should pass the following parameters: - * - MPV_RENDER_PARAM_API_TYPE to select the underlying backend/GPU API. - * - Backend-specific init parameter, like MPV_RENDER_PARAM_OPENGL_INIT_PARAMS. - * - Setting MPV_RENDER_PARAM_ADVANCED_CONTROL and following its rules is - * strongly recommended. - * - If you want to use hwdec, possibly hwdec interop resources. - * - * @param res set to the context (on success) or NULL (on failure). The value - * is never read and always overwritten. - * @param mpv handle used to get the core (the mpv_render_context won't depend - * on this specific handle, only the core referenced by it) - * @param params an array of parameters, terminated by type==0. It's left - * unspecified what happens with unknown parameters. At least - * MPV_RENDER_PARAM_API_TYPE is required, and most backends will - * require another backend-specific parameter. - * @return error code, including but not limited to: - * MPV_ERROR_UNSUPPORTED: the OpenGL version is not supported - * (or required extensions are missing) - * MPV_ERROR_NOT_IMPLEMENTED: an unknown API type was provided, or - * support for the requested API was not - * built in the used libmpv binary. - * MPV_ERROR_INVALID_PARAMETER: at least one of the provided parameters was - * not valid. - */ -MPV_EXPORT int mpv_render_context_create(mpv_render_context **res, mpv_handle *mpv, - mpv_render_param *params); + /** + * Initialize the renderer state. Depending on the backend used, this will + * access the underlying GPU API and initialize its own objects. + * + * You must free the context with mpv_render_context_free(). Not doing so + * before the mpv core is destroyed may result in memory leaks or crashes. + * + * Currently, only at most 1 context can exists per mpv core (it represents + * the main video output). + * + * You should pass the following parameters: + * - MPV_RENDER_PARAM_API_TYPE to select the underlying backend/GPU API. + * - Backend-specific init parameter, like + * MPV_RENDER_PARAM_OPENGL_INIT_PARAMS. + * - Setting MPV_RENDER_PARAM_ADVANCED_CONTROL and following its rules is + * strongly recommended. + * - If you want to use hwdec, possibly hwdec interop resources. + * + * @param res set to the context (on success) or NULL (on failure). The value + * is never read and always overwritten. + * @param mpv handle used to get the core (the mpv_render_context won't + * depend on this specific handle, only the core referenced by it) + * @param params an array of parameters, terminated by type==0. It's left + * unspecified what happens with unknown parameters. At least + * MPV_RENDER_PARAM_API_TYPE is required, and most backends + * will require another backend-specific parameter. + * @return error code, including but not limited to: + * MPV_ERROR_UNSUPPORTED: the OpenGL version is not supported + * (or required extensions are missing) + * MPV_ERROR_NOT_IMPLEMENTED: an unknown API type was provided, or + * support for the requested API was not + * built in the used libmpv binary. + * MPV_ERROR_INVALID_PARAMETER: at least one of the provided parameters + * was not valid. + */ + MPV_EXPORT int mpv_render_context_create (mpv_render_context **res, + mpv_handle *mpv, + mpv_render_param *params); -/** - * Attempt to change a single parameter. Not all backends and parameter types - * support all kinds of changes. - * - * @param ctx a valid render context - * @param param the parameter type and data that should be set - * @return error code. If a parameter could actually be changed, this returns - * success, otherwise an error code depending on the parameter type - * and situation. - */ -MPV_EXPORT int mpv_render_context_set_parameter(mpv_render_context *ctx, - mpv_render_param param); + /** + * Attempt to change a single parameter. Not all backends and parameter types + * support all kinds of changes. + * + * @param ctx a valid render context + * @param param the parameter type and data that should be set + * @return error code. If a parameter could actually be changed, this returns + * success, otherwise an error code depending on the parameter type + * and situation. + */ + MPV_EXPORT int mpv_render_context_set_parameter (mpv_render_context *ctx, + mpv_render_param param); -/** - * Retrieve information from the render context. This is NOT a counterpart to - * mpv_render_context_set_parameter(), because you generally can't read - * parameters set with it, and this function is not meant for this purpose. - * Instead, this is for communicating information from the renderer back to the - * user. See mpv_render_param_type; entries which support this function - * explicitly mention it, and for other entries you can assume it will fail. - * - * You pass param with param.type set and param.data pointing to a variable - * of the required data type. The function will then overwrite that variable - * with the returned value (at least on success). - * - * @param ctx a valid render context - * @param param the parameter type and data that should be retrieved - * @return error code. If a parameter could actually be retrieved, this returns - * success, otherwise an error code depending on the parameter type - * and situation. MPV_ERROR_NOT_IMPLEMENTED is used for unknown - * param.type, or if retrieving it is not supported. - */ -MPV_EXPORT int mpv_render_context_get_info(mpv_render_context *ctx, - mpv_render_param param); + /** + * Retrieve information from the render context. This is NOT a counterpart to + * mpv_render_context_set_parameter(), because you generally can't read + * parameters set with it, and this function is not meant for this purpose. + * Instead, this is for communicating information from the renderer back to + * the user. See mpv_render_param_type; entries which support this function + * explicitly mention it, and for other entries you can assume it will fail. + * + * You pass param with param.type set and param.data pointing to a variable + * of the required data type. The function will then overwrite that variable + * with the returned value (at least on success). + * + * @param ctx a valid render context + * @param param the parameter type and data that should be retrieved + * @return error code. If a parameter could actually be retrieved, this + * returns success, otherwise an error code depending on the parameter type + * and situation. MPV_ERROR_NOT_IMPLEMENTED is used for unknown + * param.type, or if retrieving it is not supported. + */ + MPV_EXPORT int mpv_render_context_get_info (mpv_render_context *ctx, + mpv_render_param param); -typedef void (*mpv_render_update_fn)(void *cb_ctx); + typedef void (*mpv_render_update_fn) (void *cb_ctx); -/** - * Set the callback that notifies you when a new video frame is available, or - * if the video display configuration somehow changed and requires a redraw. - * Similar to mpv_set_wakeup_callback(), you must not call any mpv API from - * the callback, and all the other listed restrictions apply (such as not - * exiting the callback by throwing exceptions). - * - * This can be called from any thread, except from an update callback. In case - * of the OpenGL backend, no OpenGL state or API is accessed. - * - * Calling this will raise an update callback immediately. - * - * @param callback callback(callback_ctx) is called if the frame should be - * redrawn - * @param callback_ctx opaque argument to the callback - */ -MPV_EXPORT void mpv_render_context_set_update_callback(mpv_render_context *ctx, - mpv_render_update_fn callback, - void *callback_ctx); + /** + * Set the callback that notifies you when a new video frame is available, or + * if the video display configuration somehow changed and requires a redraw. + * Similar to mpv_set_wakeup_callback(), you must not call any mpv API from + * the callback, and all the other listed restrictions apply (such as not + * exiting the callback by throwing exceptions). + * + * This can be called from any thread, except from an update callback. In + * case of the OpenGL backend, no OpenGL state or API is accessed. + * + * Calling this will raise an update callback immediately. + * + * @param callback callback(callback_ctx) is called if the frame should be + * redrawn + * @param callback_ctx opaque argument to the callback + */ + MPV_EXPORT void + mpv_render_context_set_update_callback (mpv_render_context *ctx, + mpv_render_update_fn callback, + void *callback_ctx); -/** - * The API user is supposed to call this when the update callback was invoked - * (like all mpv_render_* functions, this has to happen on the render thread, - * and _not_ from the update callback itself). - * - * This is optional if MPV_RENDER_PARAM_ADVANCED_CONTROL was not set (default). - * Otherwise, it's a hard requirement that this is called after each update - * callback. If multiple update callback happened, and the function could not - * be called sooner, it's OK to call it once after the last callback. - * - * If an update callback happens during or after this function, the function - * must be called again at the soonest possible time. - * - * If MPV_RENDER_PARAM_ADVANCED_CONTROL was set, this will do additional work - * such as allocating textures for the video decoder. - * - * @return a bitset of mpv_render_update_flag values (i.e. multiple flags are - * combined with bitwise or). Typically, this will tell the API user - * what should happen next. E.g. if the MPV_RENDER_UPDATE_FRAME flag is - * set, mpv_render_context_render() should be called. If flags unknown - * to the API user are set, or if the return value is 0, nothing needs - * to be done. - */ -MPV_EXPORT uint64_t mpv_render_context_update(mpv_render_context *ctx); + /** + * The API user is supposed to call this when the update callback was invoked + * (like all mpv_render_* functions, this has to happen on the render thread, + * and _not_ from the update callback itself). + * + * This is optional if MPV_RENDER_PARAM_ADVANCED_CONTROL was not set + * (default). Otherwise, it's a hard requirement that this is called after + * each update callback. If multiple update callback happened, and the + * function could not be called sooner, it's OK to call it once after the + * last callback. + * + * If an update callback happens during or after this function, the function + * must be called again at the soonest possible time. + * + * If MPV_RENDER_PARAM_ADVANCED_CONTROL was set, this will do additional work + * such as allocating textures for the video decoder. + * + * @return a bitset of mpv_render_update_flag values (i.e. multiple flags are + * combined with bitwise or). Typically, this will tell the API user + * what should happen next. E.g. if the MPV_RENDER_UPDATE_FRAME flag + * is set, mpv_render_context_render() should be called. If flags unknown to + * the API user are set, or if the return value is 0, nothing needs to be + * done. + */ + MPV_EXPORT uint64_t mpv_render_context_update (mpv_render_context *ctx); -/** - * Flags returned by mpv_render_context_update(). Each value represents a bit - * in the function's return value. - */ -typedef enum mpv_render_update_flag { + /** + * Flags returned by mpv_render_context_update(). Each value represents a bit + * in the function's return value. + */ + typedef enum mpv_render_update_flag + { /** * A new video frame must be rendered. mpv_render_context_render() must be * called. */ - MPV_RENDER_UPDATE_FRAME = 1 << 0, -} mpv_render_context_flag; + MPV_RENDER_UPDATE_FRAME = 1 << 0, + } mpv_render_context_flag; -/** - * Render video. - * - * Typically renders the video to a target surface provided via mpv_render_param - * (the details depend on the backend in use). Options like "panscan" are - * applied to determine which part of the video should be visible and how the - * video should be scaled. You can change these options at runtime by using the - * mpv property API. - * - * The renderer will reconfigure itself every time the target surface - * configuration (such as size) is changed. - * - * This function implicitly pulls a video frame from the internal queue and - * renders it. If no new frame is available, the previous frame is redrawn. - * The update callback set with mpv_render_context_set_update_callback() - * notifies you when a new frame was added. The details potentially depend on - * the backends and the provided parameters. - * - * Generally, libmpv will invoke your update callback some time before the video - * frame should be shown, and then lets this function block until the supposed - * display time. This will limit your rendering to video FPS. You can prevent - * this by setting the "video-timing-offset" global option to 0. (This applies - * only to "audio" video sync mode.) - * - * You should pass the following parameters: - * - Backend-specific target object, such as MPV_RENDER_PARAM_OPENGL_FBO. - * - Possibly transformations, such as MPV_RENDER_PARAM_FLIP_Y. - * - * @param ctx a valid render context - * @param params an array of parameters, terminated by type==0. Which parameters - * are required depends on the backend. It's left unspecified what - * happens with unknown parameters. - * @return error code - */ -MPV_EXPORT int mpv_render_context_render(mpv_render_context *ctx, mpv_render_param *params); + /** + * Render video. + * + * Typically renders the video to a target surface provided via + * mpv_render_param (the details depend on the backend in use). Options like + * "panscan" are applied to determine which part of the video should be + * visible and how the video should be scaled. You can change these options + * at runtime by using the mpv property API. + * + * The renderer will reconfigure itself every time the target surface + * configuration (such as size) is changed. + * + * This function implicitly pulls a video frame from the internal queue and + * renders it. If no new frame is available, the previous frame is redrawn. + * The update callback set with mpv_render_context_set_update_callback() + * notifies you when a new frame was added. The details potentially depend on + * the backends and the provided parameters. + * + * Generally, libmpv will invoke your update callback some time before the + * video frame should be shown, and then lets this function block until the + * supposed display time. This will limit your rendering to video FPS. You + * can prevent this by setting the "video-timing-offset" global option to 0. + * (This applies only to "audio" video sync mode.) + * + * You should pass the following parameters: + * - Backend-specific target object, such as MPV_RENDER_PARAM_OPENGL_FBO. + * - Possibly transformations, such as MPV_RENDER_PARAM_FLIP_Y. + * + * @param ctx a valid render context + * @param params an array of parameters, terminated by type==0. Which + * parameters are required depends on the backend. It's left unspecified what + * happens with unknown parameters. + * @return error code + */ + MPV_EXPORT int mpv_render_context_render (mpv_render_context *ctx, + mpv_render_param *params); -/** - * Tell the renderer that a frame was flipped at the given time. This is - * optional, but can help the player to achieve better timing. - * - * Note that calling this at least once informs libmpv that you will use this - * function. If you use it inconsistently, expect bad video playback. - * - * If this is called while no video is initialized, it is ignored. - * - * @param ctx a valid render context - */ -MPV_EXPORT void mpv_render_context_report_swap(mpv_render_context *ctx); + /** + * Tell the renderer that a frame was flipped at the given time. This is + * optional, but can help the player to achieve better timing. + * + * Note that calling this at least once informs libmpv that you will use this + * function. If you use it inconsistently, expect bad video playback. + * + * If this is called while no video is initialized, it is ignored. + * + * @param ctx a valid render context + */ + MPV_EXPORT void mpv_render_context_report_swap (mpv_render_context *ctx); -/** - * Destroy the mpv renderer state. - * - * If video is still active (e.g. a file playing), video will be disabled - * forcefully. - * - * @param ctx a valid render context. After this function returns, this is not - * a valid pointer anymore. NULL is also allowed and does nothing. - */ -MPV_EXPORT void mpv_render_context_free(mpv_render_context *ctx); + /** + * Destroy the mpv renderer state. + * + * If video is still active (e.g. a file playing), video will be disabled + * forcefully. + * + * @param ctx a valid render context. After this function returns, this is + * not a valid pointer anymore. NULL is also allowed and does nothing. + */ + MPV_EXPORT void mpv_render_context_free (mpv_render_context *ctx); #ifdef MPV_CPLUGIN_DYNAMIC_SYM -MPV_DEFINE_SYM_PTR(mpv_render_context_create) + MPV_DEFINE_SYM_PTR (mpv_render_context_create) #define mpv_render_context_create pfn_mpv_render_context_create -MPV_DEFINE_SYM_PTR(mpv_render_context_set_parameter) + MPV_DEFINE_SYM_PTR (mpv_render_context_set_parameter) #define mpv_render_context_set_parameter pfn_mpv_render_context_set_parameter -MPV_DEFINE_SYM_PTR(mpv_render_context_get_info) + MPV_DEFINE_SYM_PTR (mpv_render_context_get_info) #define mpv_render_context_get_info pfn_mpv_render_context_get_info -MPV_DEFINE_SYM_PTR(mpv_render_context_set_update_callback) -#define mpv_render_context_set_update_callback pfn_mpv_render_context_set_update_callback -MPV_DEFINE_SYM_PTR(mpv_render_context_update) + MPV_DEFINE_SYM_PTR (mpv_render_context_set_update_callback) +#define mpv_render_context_set_update_callback \ + pfn_mpv_render_context_set_update_callback + MPV_DEFINE_SYM_PTR (mpv_render_context_update) #define mpv_render_context_update pfn_mpv_render_context_update -MPV_DEFINE_SYM_PTR(mpv_render_context_render) + MPV_DEFINE_SYM_PTR (mpv_render_context_render) #define mpv_render_context_render pfn_mpv_render_context_render -MPV_DEFINE_SYM_PTR(mpv_render_context_report_swap) + MPV_DEFINE_SYM_PTR (mpv_render_context_report_swap) #define mpv_render_context_report_swap pfn_mpv_render_context_report_swap -MPV_DEFINE_SYM_PTR(mpv_render_context_free) + MPV_DEFINE_SYM_PTR (mpv_render_context_free) #define mpv_render_context_free pfn_mpv_render_context_free #endif |