0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-19 20:32:15 +02:00

libobs: Add encode_texture2 function to struct obs_encoder_info

And use it if non-NULL instead of encode_texture.
This commit is contained in:
Torge Matthies 2021-07-11 21:23:07 +02:00 committed by Ryan Foster
parent 3fb529c0ee
commit f81ed52ec7
3 changed files with 61 additions and 16 deletions

View File

@ -120,6 +120,16 @@ struct obs_encoder_roi {
float priority;
};
struct gs_texture;
/** Encoder input texture */
struct encoder_texture {
/** Shared texture handle, only set on Windows */
uint32_t handle;
/** Textures, length determined by format */
struct gs_texture *tex[4];
};
/**
* Encoder interface
*
@ -280,6 +290,12 @@ struct obs_encoder_info {
uint64_t lock_key, uint64_t *next_key,
struct encoder_packet *packet,
bool *received_packet);
bool (*encode_texture2)(void *data, struct encoder_texture *texture,
int64_t pts, uint64_t lock_key,
uint64_t *next_key,
struct encoder_packet *packet,
bool *received_packet);
};
EXPORT void obs_register_encoder_s(const struct obs_encoder_info *info,

View File

@ -707,16 +707,30 @@ cleanup:
da_push_back(dest, &data); \
} while (false)
#define CHECK_REQUIRED_VAL(type, info, val, func) \
do { \
if ((offsetof(type, val) + sizeof(info->val) > size) || \
!info->val) { \
blog(LOG_ERROR, \
"Required value '" #val "' for " \
"'%s' not found. " #func " failed.", \
info->id); \
goto error; \
} \
#define HAS_VAL(type, info, val) \
((offsetof(type, val) + sizeof(info->val) <= size) && info->val)
#define CHECK_REQUIRED_VAL(type, info, val, func) \
do { \
if (!HAS_VAL(type, info, val)) { \
blog(LOG_ERROR, \
"Required value '" #val "' for " \
"'%s' not found. " #func " failed.", \
info->id); \
goto error; \
} \
} while (false)
#define CHECK_REQUIRED_VAL_EITHER(type, info, val1, val2, func) \
do { \
if (!HAS_VAL(type, info, val1) && \
!HAS_VAL(type, info, val2)) { \
blog(LOG_ERROR, \
"Neither '" #val1 "' nor '" #val2 "' " \
"for '%s' found. " #func " failed.", \
info->id); \
goto error; \
} \
} while (false)
#define HANDLE_ERROR(size_var, structure, info) \
@ -927,7 +941,9 @@ void obs_register_encoder_s(const struct obs_encoder_info *info, size_t size)
CHECK_REQUIRED_VAL_(info, destroy, obs_register_encoder);
if ((info->caps & OBS_ENCODER_CAP_PASS_TEXTURE) != 0)
CHECK_REQUIRED_VAL_(info, encode_texture, obs_register_encoder);
CHECK_REQUIRED_VAL_EITHER(struct obs_encoder_info, info,
encode_texture, encode_texture2,
obs_register_encoder);
else
CHECK_REQUIRED_VAL_(info, encode, obs_register_encoder);

View File

@ -69,7 +69,7 @@ static void *gpu_encode_thread(struct obs_core_video_mix *video)
for (size_t i = 0; i < encoders.num; i++) {
struct encoder_packet pkt = {0};
bool received = false;
bool success;
bool success = false;
uint32_t skip = 0;
obs_encoder_t *encoder = encoders.array[i];
@ -125,10 +125,23 @@ static void *gpu_encode_thread(struct obs_core_video_mix *video)
else
next_key++;
success = encoder->info.encode_texture(
encoder->context.data, tf.handle,
encoder->cur_pts, lock_key, &next_key, &pkt,
&received);
if (encoder->info.encode_texture2) {
struct encoder_texture tex = {0};
tex.handle = tf.handle;
tex.tex[0] = tf.tex;
tex.tex[1] = tf.tex_uv;
tex.tex[2] = NULL;
success = encoder->info.encode_texture2(
encoder->context.data, &tex,
encoder->cur_pts, lock_key, &next_key,
&pkt, &received);
} else {
success = encoder->info.encode_texture(
encoder->context.data, tf.handle,
encoder->cur_pts, lock_key, &next_key,
&pkt, &received);
}
send_off_encoder_packet(encoder, success, received,
&pkt);