You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

348 lines
9.3 KiB

// SPDX-License-Identifier: LGPL-2.1-or-later
/*****************************************************************************
* vlc_preparser_serializer.h: preparser serializer
*****************************************************************************
* Copyright © 2025 Videolabs, VideoLAN and VLC authors
*
* Authors: Gabriel Lafond Thenaille <gabriel@videolabs.io>
*****************************************************************************/
#ifndef VLC_PREPARSER_IPC_H
#define VLC_PREPARSER_IPC_H
#include <vlc_common.h>
#include <vlc_vector.h>
#include <vlc_input.h>
#include <vlc_input_item.h>
#include <vlc_preparser.h>
#include <vlc_interrupt.h>
/**
* @defgroup preparser_ipc Preparser IPC
* @ingroup preparser
* @{
* @file
* VLC Preparser IPC API
*
* @defgroup preparser_msg preparser message api
* @ingroup preparser_ipc
* @{
*/
/**
* Request types
*/
enum vlc_preparser_msg_req_type {
/**
* Type of the request emitted by a `vlc_preparser_Push` call.
*/
VLC_PREPARSER_MSG_REQ_TYPE_PARSE,
/**
* Type of the request emitted by a `vlc_preparser_GenerateThumbnail`
* call.
*/
VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL,
/**
* Type of the request emitted by a
* `vlc_preparser_GenerateThumbnailToFiles` call.
*/
VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL_TO_FILES,
};
/**
* Preparser request.
*/
struct vlc_preparser_msg_req {
/**
* Type of the request.
*/
enum vlc_preparser_msg_req_type type;
/**
* Used only by request of type `VLC_PREPARSER_MSG_REQ_TYPE_PARSE`.
*/
int options;
/**
* Used by both type `VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL` and
* `VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL_TO_FILES`.
*/
struct vlc_thumbnailer_arg arg;
/**
* Used only by request of type
* `VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL_TO_FILES`.
*/
/* all `output_path` will be freed so they must be heap allocated or set to
* NULL before a `vlc_preparser_msg_Clean` call. */
struct VLC_VECTOR(char *) outputs_path;
struct VLC_VECTOR(struct vlc_thumbnailer_output) outputs;
/* `uri` will be freed so it must be heap allocated or set to
* NULL before a `vlc_preparser_msg_Clean` call. */
char *uri;
};
/**
* Preparser Response
*/
struct vlc_preparser_msg_res {
/**
* Type of the response (As the response answering a request they share the
* same type).
*/
enum vlc_preparser_msg_req_type type;
/**
* Used only by request of type `VLC_PREPARSER_MSG_REQ_TYPE_PARSE`.
*/
struct VLC_VECTOR(input_attachment_t *) attachments;
input_item_node_t *subtree;
/**
* Used only by request of type `VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL`.
*/
picture_t *pic;
/**
* Used only by request of type
* `VLC_PREPARSER_MSG_REQ_TYPE_THUMBNAIL_TO_FILES`.
*/
struct VLC_VECTOR(bool) result;
/**
* Used by all types of request.
*/
int status;
input_item_t *item;
};
/**
* Preparser message.
*/
struct vlc_preparser_msg {
/**
* Type of the message can be a request or a response.
*/
enum {
VLC_PREPARSER_MSG_TYPE_REQ,
VLC_PREPARSER_MSG_TYPE_RES,
} type;
/**
* Type of the underling request or response.
*/
enum vlc_preparser_msg_req_type req_type;
union {
struct vlc_preparser_msg_req req;
struct vlc_preparser_msg_res res;
};
};
/**
* Initialize a preparser message.
*
* @info All data specific to each request/response have to be initialized
* by hand.
*
* @param msg message to initialize.
* @param msg_type message type (request or response).
* @param req_type request/response type (see enum vlc_preparser_req_type
* for more information).
*/
VLC_API void
vlc_preparser_msg_Init(struct vlc_preparser_msg *msg, int msg_type,
enum vlc_preparser_msg_req_type req_type);
/**
* Clean all memory used by a message.
*
* @info This function don't free the `msg` pointer.
*
* @param msg message to release.
*/
VLC_API void
vlc_preparser_msg_Clean(struct vlc_preparser_msg *msg);
/**
* @} preparser_msg
*
* @defgroup preparser_serdes preparser serializer api
* @ingroup preparser_ipc
*
* @{
*/
#define VLC_PREPARSER_MSG_SERDES_TYPE_DATA 0x1
#define VLC_PREPARSER_MSG_SERDES_TYPE_ATTACHMENT 0x2
#define VLC_PREPARSER_MSG_SERDES_TYPE_END_DATA 0x4
#define VLC_PREPARSER_MSG_SERDES_TYPE_END_ATTACHMENT 0x8
struct vlc_preparser_msg_serdes_cbs {
/**
* Write callback.
*
* @param [in] data buffer to write.
* @param [in] size number of bytes to write.
* @param [in] userdata callback userdata.
*
* @return the number of bytes writen or an error code on failure.
*/
ssize_t (*write)(const void *data, size_t size, void *userdata);
/**
* Read callback.
*
* @param [out] data buffer to read into.
* @param [in] size number of bytes to read.
* @param [in] userdata callback userdata.
*
* @return the number of bytes read or an error code on failure.
*/
ssize_t (*read)(void *data, size_t size, void *userdata);
};
struct vlc_preparser_msg_serdes;
struct vlc_preparser_msg_serdes_operations {
/**
* Serialize `msg` and call the write callback with serialized data.
*
* @param [in] serdes serializer internal structure.
* @param [in] msg message to serialize.
* @param [in] userdata context for the write callbacks
*
* @return VLC_SUCCESS or an error code on failure.
*/
int (*serialize)(struct vlc_preparser_msg_serdes *serdes,
const struct vlc_preparser_msg *msg,
void *userdata);
/**
* Deserialize `msg` and call the read callback to get data to deserialize.
*
* @param [in] serdes serializer internal structure.
* @param [out] msg message to deserialize.
* @param [in] userdata context for the read callbacks
*
* @return VLC_SUCCESS or an error code on failure.
*/
int (*deserialize)(struct vlc_preparser_msg_serdes *serdes,
struct vlc_preparser_msg *msg,
void *userdata);
/**
* Close the serializer/deserialier and release all used memory.
*
* @param [in] serdes preparser msg serdes internal struture.
*/
void (*close)(struct vlc_preparser_msg_serdes *serdes);
};
/**
* Internal structure used by serializer.
*/
struct vlc_preparser_msg_serdes {
/** Operations */
const struct vlc_preparser_msg_serdes_operations *ops;
struct {
/** Callbacks */
const struct vlc_preparser_msg_serdes_cbs *cbs;
/** Used by the serializer module. */
void *sys;
} owner;
};
typedef int (*vlc_preparser_msg_serdes_module)
(struct vlc_preparser_msg_serdes *, bool);
#define set_callback_preparser_msg_serdes(activate, priority) \
{\
vlc_preparser_msg_serdes_module open__ = activate;\
(void)open__;\
set_callback(activate)\
}\
set_capability("preparser msg serdes", priority)
/**
* Call the serialize operation.
*
* @param [in] s
* @param [out] buf
* @param [in] msg
*
* @return size of the allocated buffer.
*/
static inline int
vlc_preparser_msg_serdes_Serialize(struct vlc_preparser_msg_serdes *serdes,
const struct vlc_preparser_msg *msg,
void *userdata)
{
assert(serdes != NULL);
if (serdes->ops != NULL && serdes->ops->serialize != NULL) {
return serdes->ops->serialize(serdes, msg, userdata);
}
return VLC_EGENERIC;
}
/**
* Call the deserialize operation.
*
* @param [in] s
* @param [in] buf
* @param [in] size
*
* @return size of the allocated buffer.
*/
static inline int
vlc_preparser_msg_serdes_Deserialize(struct vlc_preparser_msg_serdes *serdes,
struct vlc_preparser_msg *msg,
void *userdata)
{
assert(serdes!= NULL);
if (serdes->ops != NULL && serdes->ops->deserialize != NULL) {
return serdes->ops->deserialize(serdes, msg, userdata);
}
return VLC_EGENERIC;
}
/**
* Free the msg_serdes struct.
*
* @param [in] msg_serdes
*/
static inline void
vlc_preparser_msg_serdes_Delete(struct vlc_preparser_msg_serdes *serdes)
{
assert(serdes != NULL);
if (serdes->ops != NULL && serdes->ops->close != NULL) {
serdes->ops->close(serdes);
}
free(serdes);
}
/**
* Create a vlc_preparser_msg_serdes object and load a preparser msg_serdes
* module.
*
* @param [in] obj vlc object
* @param [in] c serializer's callbacks
* @param [in] bin_data describe if the serializer and deserializer use
* binary data (intput_attachment_t or plane_t)
*
* @return a vlc_preparser_msg_serdes object or NULL on failure.
*/
VLC_API struct vlc_preparser_msg_serdes *
vlc_preparser_msg_serdes_Create(vlc_object_t *obj,
const struct vlc_preparser_msg_serdes_cbs *c,
bool bin_data);
/**
* @} preparser_serdes
* @} preparser_ipc
*/
#endif /* VLC_PREPARSER_IPC */