/***
Oak - Non-Linear Video Editor
Copyright (C) 2026 Oak Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
***/
#ifndef OAKENGINE_PROXY_H
#define OAKENGINE_PROXY_H
#include
#include "export.h"
#include "footage.h"
#include "init.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file proxy.h
* @brief C ABI for the engine's proxy generation singleton (olive::ProxyManager)
*
* A thin facade over ProxyManager's instance lifecycle, proxy parameter
* configuration, proxy state queries and proxy generation. The opaque task
* handle returned in oak_proxy_result::task is a borrowed pointer to the
* engine's internal ProxyTask; it is intended only for logging and becomes
* invalid when the proxy operation finishes.
*
* Conventions match the other facade families:
* - 0 (OAKENGINE_OK) / negative OAKENGINE_E_* codes.
* - String output uses the buf/size convention.
* - Booleans are int (1/0).
*/
#define OAKENGINE_PROXY_STATE_MISSING 0
#define OAKENGINE_PROXY_STATE_GENERATING 1
#define OAKENGINE_PROXY_STATE_READY 2
#define OAKENGINE_PROXY_STATE_FAILED 3
typedef struct oak_proxy_result {
int state; /**< OAKENGINE_PROXY_STATE_* */
char filename[1024];
int64_t task; /**< ProxyTask* as opaque handle, or 0 if none */
} oak_proxy_result;
/**
* @brief Create the ProxyManager singleton.
*
* Safe to call when the instance already exists (no-op). Returns
* OAKENGINE_OK or OAKENGINE_E_FAILED.
*/
OAKENGINE_API int oakengine_proxy_create_instance(void);
/**
* @brief Destroy the ProxyManager singleton.
*
* Safe to call when no instance exists (no-op). Returns OAKENGINE_OK.
*/
OAKENGINE_API int oakengine_proxy_destroy_instance(void);
/**
* @brief Build proxy parameters from the global application config.
*
* Fills `out` with the configured width/height/divider/version/crf/extension
* /preset/include_audio values. Returns OAKENGINE_OK or an error code.
*/
OAKENGINE_API int oakengine_proxy_params_from_config(oak_proxy_params *out);
/**
* @brief Query the state of a proxy file on disk.
*
* Returns one of the OAKENGINE_PROXY_STATE_* values, or
* OAKENGINE_PROXY_STATE_MISSING if `proxy_filename` is NULL/empty or the
* proxy does not exist.
*/
OAKENGINE_API int oakengine_proxy_get_state(const char *proxy_filename);
/**
* @brief Human-readable string for a proxy state (buf/size convention).
*
* Returns the string length on success, or a negative OAKENGINE_E_* code for
* an unknown state.
*/
OAKENGINE_API int oakengine_proxy_state_to_string(int state, char *buf,
int buf_size);
/**
* @brief Get or start generating a proxy for `source_filename`.
*
* `cache_path` is the project cache directory. `stream_index` is the source
* stream to proxy. `params` are the proxy generation parameters (width/height
* etc.). On return `out->state` and `out->filename` describe the proxy; if a
* generation task was started, `out->task` is a borrowed opaque handle to it,
* otherwise it is 0.
*/
OAKENGINE_API int oakengine_proxy_get_or_start(const char *cache_path,
const char *source_filename,
int stream_index,
const oak_proxy_params *params,
oak_proxy_result *out);
/**
* @brief Get the "working" filename for a proxy file (buf/size convention).
*
* The working filename is used by the proxy generator while the proxy is being
* generated. Returns the string length on success, or a negative
* OAKENGINE_E_* code on error.
*/
OAKENGINE_API int oakengine_proxy_get_working_filename(const char *proxy_filename,
char *buf, int buf_size);
#ifdef __cplusplus
}
#endif
#endif /* OAKENGINE_PROXY_H */