mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-05-26 23:36:16 +00:00
refactoring
This commit is contained in:
@@ -214,7 +214,7 @@ static _enc_buffer_s *_enc_buffer_init(void) {
|
|||||||
static void *_pcm_thread(void *v_audio) {
|
static void *_pcm_thread(void *v_audio) {
|
||||||
US_THREAD_SETTLE("us_a_pcm");
|
US_THREAD_SETTLE("us_a_pcm");
|
||||||
|
|
||||||
us_audio_s *const audio = (us_audio_s *)v_audio;
|
us_audio_s *const audio = v_audio;
|
||||||
u8 in[_MAX_BUF8];
|
u8 in[_MAX_BUF8];
|
||||||
|
|
||||||
while (!atomic_load(&audio->stop)) {
|
while (!atomic_load(&audio->stop)) {
|
||||||
@@ -244,7 +244,7 @@ static void *_pcm_thread(void *v_audio) {
|
|||||||
static void *_encoder_thread(void *v_audio) {
|
static void *_encoder_thread(void *v_audio) {
|
||||||
US_THREAD_SETTLE("us_a_enc");
|
US_THREAD_SETTLE("us_a_enc");
|
||||||
|
|
||||||
us_audio_s *const audio = (us_audio_s *)v_audio;
|
us_audio_s *const audio = v_audio;
|
||||||
s16 in_res[_MAX_BUF16];
|
s16 in_res[_MAX_BUF16];
|
||||||
|
|
||||||
while (!atomic_load(&audio->stop)) {
|
while (!atomic_load(&audio->stop)) {
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ static void *_audio_thread(void *v_client) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void *_common_thread(void *v_client, bool video) {
|
static void *_common_thread(void *v_client, bool video) {
|
||||||
us_janus_client_s *const client = (us_janus_client_s *)v_client;
|
us_janus_client_s *const client = v_client;
|
||||||
us_ring_s *const ring = (video ? client->video_ring : client->audio_ring);
|
us_ring_s *const ring = (video ? client->video_ring : client->audio_ring);
|
||||||
assert(ring != NULL); // Audio may be NULL
|
assert(ring != NULL); // Audio may be NULL
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void us_rtp_write_header(us_rtp_s *rtp, u32 pts, bool marked) {
|
|||||||
++rtp->seq;
|
++rtp->seq;
|
||||||
|
|
||||||
# define WRITE_BE_U32(x_offset, x_value) \
|
# define WRITE_BE_U32(x_offset, x_value) \
|
||||||
*((u32 *)(rtp->datagram + x_offset)) = __builtin_bswap32(x_value)
|
*((u32*)(rtp->datagram + x_offset)) = __builtin_bswap32(x_value)
|
||||||
WRITE_BE_U32(0, word0);
|
WRITE_BE_U32(0, word0);
|
||||||
WRITE_BE_U32(4, pts);
|
WRITE_BE_U32(4, pts);
|
||||||
WRITE_BE_U32(8, rtp->ssrc);
|
WRITE_BE_U32(8, rtp->ssrc);
|
||||||
|
|||||||
@@ -99,11 +99,11 @@ static PyObject *_MemsinkObject_close(_MemsinkObject *self, PyObject *Py_UNUSED(
|
|||||||
|
|
||||||
static PyObject *_MemsinkObject_enter(_MemsinkObject *self, PyObject *Py_UNUSED(ignored)) {
|
static PyObject *_MemsinkObject_enter(_MemsinkObject *self, PyObject *Py_UNUSED(ignored)) {
|
||||||
Py_INCREF(self);
|
Py_INCREF(self);
|
||||||
return (PyObject *)self;
|
return (PyObject*)self;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *_MemsinkObject_exit(_MemsinkObject *self, PyObject *Py_UNUSED(ignored)) {
|
static PyObject *_MemsinkObject_exit(_MemsinkObject *self, PyObject *Py_UNUSED(ignored)) {
|
||||||
return PyObject_CallMethod((PyObject *)self, "close", "");
|
return PyObject_CallMethod((PyObject*)self, "close", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _wait_frame(_MemsinkObject *self) {
|
static int _wait_frame(_MemsinkObject *self) {
|
||||||
@@ -230,7 +230,7 @@ static PyObject *_MemsinkObject_wait_frame(_MemsinkObject *self, PyObject *args,
|
|||||||
SET_NUMBER(grab_ts, Double, Float);
|
SET_NUMBER(grab_ts, Double, Float);
|
||||||
SET_NUMBER(encode_begin_ts, Double, Float);
|
SET_NUMBER(encode_begin_ts, Double, Float);
|
||||||
SET_NUMBER(encode_end_ts, Double, Float);
|
SET_NUMBER(encode_end_ts, Double, Float);
|
||||||
SET_VALUE("data", PyBytes_FromStringAndSize((const char *)self->frame->data, self->frame->used));
|
SET_VALUE("data", PyBytes_FromStringAndSize((const char*)self->frame->data, self->frame->used));
|
||||||
|
|
||||||
# undef SET_NUMBER
|
# undef SET_NUMBER
|
||||||
# undef SET_VALUE
|
# undef SET_VALUE
|
||||||
@@ -305,7 +305,7 @@ PyMODINIT_FUNC PyInit_ustreamer(void) {
|
|||||||
|
|
||||||
Py_INCREF(&_MemsinkType);
|
Py_INCREF(&_MemsinkType);
|
||||||
|
|
||||||
if (PyModule_AddObject(module, "Memsink", (PyObject *)&_MemsinkType) < 0) {
|
if (PyModule_AddObject(module, "Memsink", (PyObject*)&_MemsinkType) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ us_output_file_s *us_output_file_init(const char *path, bool json) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void us_output_file_write(void *v_output, const us_frame_s *frame) {
|
void us_output_file_write(void *v_output, const us_frame_s *frame) {
|
||||||
us_output_file_s *output = (us_output_file_s *)v_output;
|
us_output_file_s *output = v_output;
|
||||||
if (output->json) {
|
if (output->json) {
|
||||||
us_base64_encode(frame->data, frame->used, &output->base64_data, &output->base64_allocated);
|
us_base64_encode(frame->data, frame->used, &output->base64_data, &output->base64_allocated);
|
||||||
fprintf(output->fp,
|
fprintf(output->fp,
|
||||||
@@ -66,7 +66,7 @@ void us_output_file_write(void *v_output, const us_frame_s *frame) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void us_output_file_destroy(void *v_output) {
|
void us_output_file_destroy(void *v_output) {
|
||||||
us_output_file_s *output = (us_output_file_s *)v_output;
|
us_output_file_s *output = v_output;
|
||||||
US_DELETE(output->base64_data, free);
|
US_DELETE(output->base64_data, free);
|
||||||
if (output->fp && output->fp != stdout) {
|
if (output->fp && output->fp != stdout) {
|
||||||
if (fclose(output->fp) < 0) {
|
if (fclose(output->fp) < 0) {
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ int main(int argc, char *argv[]) {
|
|||||||
_output_context_s ctx = {0};
|
_output_context_s ctx = {0};
|
||||||
|
|
||||||
if (output_path && output_path[0] != '\0') {
|
if (output_path && output_path[0] != '\0') {
|
||||||
if ((ctx.v_output = (void *)us_output_file_init(output_path, output_json)) == NULL) {
|
if ((ctx.v_output = (void*)us_output_file_init(output_path, output_json)) == NULL) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ctx.write = us_output_file_write;
|
ctx.write = us_output_file_write;
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ INLINE void us_thread_set_name(const char *name) {
|
|||||||
# elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
# elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
||||||
pthread_set_name_np(pthread_self(), name);
|
pthread_set_name_np(pthread_self(), name);
|
||||||
# elif defined(__NetBSD__)
|
# elif defined(__NetBSD__)
|
||||||
pthread_setname_np(pthread_self(), "%s", (void *)name);
|
pthread_setname_np(pthread_self(), "%s", (void*)name);
|
||||||
# else
|
# else
|
||||||
# error us_thread_set_name() not implemented, you can disable it using WITH_PTHREAD_NP=0
|
# error us_thread_set_name() not implemented, you can disable it using WITH_PTHREAD_NP=0
|
||||||
# endif
|
# endif
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ void us_encoder_open(us_encoder_s *enc, us_device_s *dev) {
|
|||||||
|
|
||||||
enc->run->pool = us_workers_pool_init(
|
enc->run->pool = us_workers_pool_init(
|
||||||
"JPEG", "jw", n_workers, desired_interval,
|
"JPEG", "jw", n_workers, desired_interval,
|
||||||
_worker_job_init, (void *)enc,
|
_worker_job_init, (void*)enc,
|
||||||
_worker_job_destroy,
|
_worker_job_destroy,
|
||||||
_worker_run_job);
|
_worker_run_job);
|
||||||
|
|
||||||
@@ -188,19 +188,19 @@ void us_encoder_get_runtime_params(us_encoder_s *enc, us_encoder_type_e *type, u
|
|||||||
static void *_worker_job_init(void *v_enc) {
|
static void *_worker_job_init(void *v_enc) {
|
||||||
us_encoder_job_s *job;
|
us_encoder_job_s *job;
|
||||||
US_CALLOC(job, 1);
|
US_CALLOC(job, 1);
|
||||||
job->enc = (us_encoder_s *)v_enc;
|
job->enc = (us_encoder_s*)v_enc;
|
||||||
job->dest = us_frame_init();
|
job->dest = us_frame_init();
|
||||||
return (void *)job;
|
return (void*)job;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _worker_job_destroy(void *v_job) {
|
static void _worker_job_destroy(void *v_job) {
|
||||||
us_encoder_job_s *job = (us_encoder_job_s *)v_job;
|
us_encoder_job_s *job = v_job;
|
||||||
us_frame_destroy(job->dest);
|
us_frame_destroy(job->dest);
|
||||||
free(job);
|
free(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _worker_run_job(us_worker_s *wr) {
|
static bool _worker_run_job(us_worker_s *wr) {
|
||||||
us_encoder_job_s *job = (us_encoder_job_s *)wr->job;
|
us_encoder_job_s *job = wr->job;
|
||||||
us_encoder_s *enc = job->enc; // Just for _ER()
|
us_encoder_s *enc = job->enc; // Just for _ER()
|
||||||
const us_frame_s *src = &job->hw->raw;
|
const us_frame_s *src = &job->hw->raw;
|
||||||
us_frame_s *dest = job->dest;
|
us_frame_s *dest = job->dest;
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct jpeg_destination_mgr mgr; // Default manager
|
struct jpeg_destination_mgr mgr; // Default manager
|
||||||
JOCTET *buf; // Start of buffer
|
JOCTET *buf; // Start of buffer
|
||||||
us_frame_s *frame;
|
us_frame_s *frame;
|
||||||
} _jpeg_dest_manager_s;
|
} _jpeg_dest_manager_s;
|
||||||
|
|
||||||
@@ -63,7 +63,12 @@ void us_cpu_encoder_compress(const us_frame_s *src, us_frame_s *dest, unsigned q
|
|||||||
jpeg.image_width = src->width;
|
jpeg.image_width = src->width;
|
||||||
jpeg.image_height = src->height;
|
jpeg.image_height = src->height;
|
||||||
jpeg.input_components = 3;
|
jpeg.input_components = 3;
|
||||||
jpeg.in_color_space = ((src->format == V4L2_PIX_FMT_YUYV || src->format == V4L2_PIX_FMT_UYVY) ? JCS_YCbCr : JCS_RGB);
|
switch (src->format) {
|
||||||
|
case V4L2_PIX_FMT_YUYV:
|
||||||
|
case V4L2_PIX_FMT_YVYU:
|
||||||
|
case V4L2_PIX_FMT_UYVY: jpeg.in_color_space = JCS_YCbCr; break;
|
||||||
|
default: jpeg.in_color_space = JCS_RGB; break;
|
||||||
|
}
|
||||||
|
|
||||||
jpeg_set_defaults(&jpeg);
|
jpeg_set_defaults(&jpeg);
|
||||||
jpeg_set_quality(&jpeg, quality, TRUE);
|
jpeg_set_quality(&jpeg, quality, TRUE);
|
||||||
@@ -89,12 +94,12 @@ void us_cpu_encoder_compress(const us_frame_s *src, us_frame_s *dest, unsigned q
|
|||||||
|
|
||||||
static void _jpeg_set_dest_frame(j_compress_ptr jpeg, us_frame_s *frame) {
|
static void _jpeg_set_dest_frame(j_compress_ptr jpeg, us_frame_s *frame) {
|
||||||
if (jpeg->dest == NULL) {
|
if (jpeg->dest == NULL) {
|
||||||
assert((jpeg->dest = (struct jpeg_destination_mgr *)(*jpeg->mem->alloc_small)(
|
assert((jpeg->dest = (struct jpeg_destination_mgr*)(*jpeg->mem->alloc_small)(
|
||||||
(j_common_ptr) jpeg, JPOOL_PERMANENT, sizeof(_jpeg_dest_manager_s)
|
(j_common_ptr) jpeg, JPOOL_PERMANENT, sizeof(_jpeg_dest_manager_s)
|
||||||
)) != NULL);
|
)) != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s *)jpeg->dest;
|
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s*)jpeg->dest;
|
||||||
dest->mgr.init_destination = _jpeg_init_destination;
|
dest->mgr.init_destination = _jpeg_init_destination;
|
||||||
dest->mgr.empty_output_buffer = _jpeg_empty_output_buffer;
|
dest->mgr.empty_output_buffer = _jpeg_empty_output_buffer;
|
||||||
dest->mgr.term_destination = _jpeg_term_destination;
|
dest->mgr.term_destination = _jpeg_term_destination;
|
||||||
@@ -221,10 +226,10 @@ static void _jpeg_write_scanlines_bgr24(struct jpeg_compress_struct *jpeg, const
|
|||||||
#define JPEG_OUTPUT_BUFFER_SIZE ((size_t)4096)
|
#define JPEG_OUTPUT_BUFFER_SIZE ((size_t)4096)
|
||||||
|
|
||||||
static void _jpeg_init_destination(j_compress_ptr jpeg) {
|
static void _jpeg_init_destination(j_compress_ptr jpeg) {
|
||||||
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s *)jpeg->dest;
|
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s*)jpeg->dest;
|
||||||
|
|
||||||
// Allocate the output buffer - it will be released when done with image
|
// Allocate the output buffer - it will be released when done with image
|
||||||
assert((dest->buf = (JOCTET *)(*jpeg->mem->alloc_small)(
|
assert((dest->buf = (JOCTET*)(*jpeg->mem->alloc_small)(
|
||||||
(j_common_ptr) jpeg, JPOOL_IMAGE, JPEG_OUTPUT_BUFFER_SIZE * sizeof(JOCTET)
|
(j_common_ptr) jpeg, JPOOL_IMAGE, JPEG_OUTPUT_BUFFER_SIZE * sizeof(JOCTET)
|
||||||
)) != NULL);
|
)) != NULL);
|
||||||
|
|
||||||
@@ -235,7 +240,7 @@ static void _jpeg_init_destination(j_compress_ptr jpeg) {
|
|||||||
static boolean _jpeg_empty_output_buffer(j_compress_ptr jpeg) {
|
static boolean _jpeg_empty_output_buffer(j_compress_ptr jpeg) {
|
||||||
// Called whenever local jpeg buffer fills up
|
// Called whenever local jpeg buffer fills up
|
||||||
|
|
||||||
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s *)jpeg->dest;
|
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s*)jpeg->dest;
|
||||||
|
|
||||||
us_frame_append_data(dest->frame, dest->buf, JPEG_OUTPUT_BUFFER_SIZE);
|
us_frame_append_data(dest->frame, dest->buf, JPEG_OUTPUT_BUFFER_SIZE);
|
||||||
|
|
||||||
@@ -249,7 +254,7 @@ static void _jpeg_term_destination(j_compress_ptr jpeg) {
|
|||||||
// Called by jpeg_finish_compress after all data has been written.
|
// Called by jpeg_finish_compress after all data has been written.
|
||||||
// Usually needs to flush buffer.
|
// Usually needs to flush buffer.
|
||||||
|
|
||||||
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s *)jpeg->dest;
|
_jpeg_dest_manager_s *const dest = (_jpeg_dest_manager_s*)jpeg->dest;
|
||||||
const size_t final = JPEG_OUTPUT_BUFFER_SIZE - dest->mgr.free_in_buffer;
|
const size_t final = JPEG_OUTPUT_BUFFER_SIZE - dest->mgr.free_in_buffer;
|
||||||
|
|
||||||
// Write any data remaining in the buffer.
|
// Write any data remaining in the buffer.
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ us_workers_pool_s *us_workers_pool_init(
|
|||||||
WR(pool) = pool;
|
WR(pool) = pool;
|
||||||
WR(job) = job_init(job_init_arg);
|
WR(job) = job_init(job_init_arg);
|
||||||
|
|
||||||
US_THREAD_CREATE(WR(tid), _worker_thread, (void *)&(pool->workers[number]));
|
US_THREAD_CREATE(WR(tid), _worker_thread, (void*)&(pool->workers[number]));
|
||||||
pool->free_workers += 1;
|
pool->free_workers += 1;
|
||||||
|
|
||||||
# undef WR
|
# undef WR
|
||||||
@@ -176,7 +176,7 @@ long double us_workers_pool_get_fluency_delay(us_workers_pool_s *pool, const us_
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void *_worker_thread(void *v_worker) {
|
static void *_worker_thread(void *v_worker) {
|
||||||
us_worker_s *wr = (us_worker_s *)v_worker;
|
us_worker_s *wr = v_worker;
|
||||||
|
|
||||||
US_THREAD_SETTLE("%s", wr->name);
|
US_THREAD_SETTLE("%s", wr->name);
|
||||||
US_LOG_DEBUG("Hello! I am a worker %s ^_^", wr->name);
|
US_LOG_DEBUG("Hello! I am a worker %s ^_^", wr->name);
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ static void *_follower_thread(void *v_unix_follow) {
|
|||||||
strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
|
strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
|
||||||
addr.sun_family = AF_UNIX;
|
addr.sun_family = AF_UNIX;
|
||||||
|
|
||||||
const bool online = !connect(fd, (struct sockaddr *)&addr, sizeof(addr));
|
const bool online = !connect(fd, (struct sockaddr*)&addr, sizeof(addr));
|
||||||
atomic_store(&_g_ustreamer_online, online);
|
atomic_store(&_g_ustreamer_online, online);
|
||||||
US_CLOSE_FD(fd); // cppcheck-suppress unreadVariable
|
US_CLOSE_FD(fd); // cppcheck-suppress unreadVariable
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user