golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
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.
116 lines
2.9 KiB
116 lines
2.9 KiB
#include <stdio.h> |
|
#include <stdbool.h> |
|
#include <stdarg.h> |
|
#include <stdint.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <pthread.h> |
|
|
|
#include "parameters.h" |
|
#include "pipe.h" |
|
#include "camera.h" |
|
#include "text.h" |
|
#include "encoder.h" |
|
|
|
static int pipe_video_fd; |
|
static pthread_mutex_t pipe_video_mutex; |
|
static text_t *text; |
|
static encoder_t *enc; |
|
|
|
static void on_frame( |
|
uint8_t *mapped_buffer, |
|
int stride, |
|
int height, |
|
int buffer_fd, |
|
uint64_t size, |
|
uint64_t timestamp) { |
|
text_draw(text, mapped_buffer, stride, height); |
|
encoder_encode(enc, buffer_fd, size, timestamp); |
|
} |
|
|
|
static void on_encoder_output(uint64_t ts, const uint8_t *buf, uint64_t size) { |
|
pthread_mutex_lock(&pipe_video_mutex); |
|
pipe_write_buf(pipe_video_fd, ts, buf, size); |
|
pthread_mutex_unlock(&pipe_video_mutex); |
|
} |
|
|
|
int main() { |
|
int pipe_conf_fd = atoi(getenv("PIPE_CONF_FD")); |
|
pipe_video_fd = atoi(getenv("PIPE_VIDEO_FD")); |
|
|
|
uint8_t *buf; |
|
uint32_t n = pipe_read(pipe_conf_fd, &buf); |
|
|
|
parameters_t params; |
|
bool ok = parameters_unserialize(¶ms, &buf[1], n-1); |
|
free(buf); |
|
if (!ok) { |
|
pipe_write_error(pipe_video_fd, "parameters_unserialize(): %s", parameters_get_error()); |
|
return 5; |
|
} |
|
|
|
pthread_mutex_init(&pipe_video_mutex, NULL); |
|
pthread_mutex_lock(&pipe_video_mutex); |
|
|
|
camera_t *cam; |
|
ok = camera_create( |
|
¶ms, |
|
on_frame, |
|
&cam); |
|
if (!ok) { |
|
pipe_write_error(pipe_video_fd, "camera_create(): %s", camera_get_error()); |
|
return 5; |
|
} |
|
|
|
ok = text_create(¶ms, &text); |
|
if (!ok) { |
|
pipe_write_error(pipe_video_fd, "text_create(): %s", text_get_error()); |
|
return 5; |
|
} |
|
|
|
ok = encoder_create( |
|
¶ms, |
|
camera_get_mode_stride(cam), |
|
camera_get_mode_colorspace(cam), |
|
on_encoder_output, |
|
&enc); |
|
if (!ok) { |
|
pipe_write_error(pipe_video_fd, "encoder_create(): %s", encoder_get_error()); |
|
return 5; |
|
} |
|
|
|
ok = camera_start(cam); |
|
if (!ok) { |
|
pipe_write_error(pipe_video_fd, "camera_start(): %s", camera_get_error()); |
|
return 5; |
|
} |
|
|
|
pipe_write_ready(pipe_video_fd); |
|
pthread_mutex_unlock(&pipe_video_mutex); |
|
|
|
while (true) { |
|
uint8_t *buf; |
|
uint32_t n = pipe_read(pipe_conf_fd, &buf); |
|
|
|
switch (buf[0]) { |
|
case 'e': |
|
return 0; |
|
|
|
case 'c': |
|
{ |
|
parameters_t params; |
|
bool ok = parameters_unserialize(¶ms, &buf[1], n-1); |
|
free(buf); |
|
if (!ok) { |
|
printf("skipping reloading parameters since they are invalid: %s\n", parameters_get_error()); |
|
continue; |
|
} |
|
camera_reload_params(cam, ¶ms); |
|
encoder_reload_params(enc, ¶ms); |
|
parameters_destroy(¶ms); |
|
} |
|
} |
|
} |
|
|
|
return 0; |
|
}
|
|
|