encoder runtime

This commit is contained in:
Devaev Maxim
2019-03-02 11:29:57 +03:00
parent 142c8c84ac
commit 667e3610b2
3 changed files with 46 additions and 30 deletions

View File

@@ -47,11 +47,16 @@ static const struct {
struct encoder_t *encoder_init() { struct encoder_t *encoder_init() {
struct encoder_runtime_t *run;
struct encoder_t *encoder; struct encoder_t *encoder;
A_CALLOC(run, 1);
run->type = ENCODER_TYPE_CPU;
A_CALLOC(encoder, 1); A_CALLOC(encoder, 1);
encoder->type = ENCODER_TYPE_CPU; encoder->type = run->type;
encoder->quality = 80; encoder->quality = 80;
encoder->run = run;
return encoder; return encoder;
} }
@@ -61,15 +66,16 @@ void encoder_prepare(struct encoder_t *encoder, struct device_t *dev) {
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
assert(encoder->type != ENCODER_TYPE_UNKNOWN); assert(encoder->type != ENCODER_TYPE_UNKNOWN);
encoder->run->type = encoder->type;
if (encoder->type != ENCODER_TYPE_CPU) { if (encoder->run->type != ENCODER_TYPE_CPU) {
LOG_DEBUG("Initializing encoder ..."); LOG_DEBUG("Initializing encoder ...");
} }
LOG_INFO("Using JPEG quality: %u%%", encoder->quality); LOG_INFO("Using JPEG quality: %u%%", encoder->quality);
# ifdef OMX_ENCODER # ifdef OMX_ENCODER
if (encoder->type == ENCODER_TYPE_OMX) { if (encoder->run->type == ENCODER_TYPE_OMX) {
if (dev->n_workers > OMX_MAX_ENCODERS) { if (dev->n_workers > OMX_MAX_ENCODERS) {
LOG_INFO( LOG_INFO(
"OMX-based encoder can only work with %u worker threads; forced --workers=%u", "OMX-based encoder can only work with %u worker threads; forced --workers=%u",
@@ -77,11 +83,11 @@ void encoder_prepare(struct encoder_t *encoder, struct device_t *dev) {
); );
dev->n_workers = OMX_MAX_ENCODERS; dev->n_workers = OMX_MAX_ENCODERS;
} }
encoder->n_omxs = dev->n_workers; encoder->run->n_omxs = dev->n_workers;
A_CALLOC(encoder->omxs, encoder->n_omxs); A_CALLOC(encoder->run->omxs, encoder->run->n_omxs);
for (unsigned index = 0; index < encoder->n_omxs; ++index) { for (unsigned index = 0; index < encoder->run->n_omxs; ++index) {
if ((encoder->omxs[index] = omx_encoder_init()) == NULL) { if ((encoder->run->omxs[index] = omx_encoder_init()) == NULL) {
goto use_fallback; goto use_fallback;
} }
} }
@@ -94,21 +100,22 @@ void encoder_prepare(struct encoder_t *encoder, struct device_t *dev) {
# pragma GCC diagnostic push # pragma GCC diagnostic push
use_fallback: use_fallback:
LOG_ERROR("Can't initialize selected encoder, using CPU instead it"); LOG_ERROR("Can't initialize selected encoder, using CPU instead it");
encoder->type = ENCODER_TYPE_CPU; encoder->run->type = ENCODER_TYPE_CPU;
# pragma GCC diagnostic pop # pragma GCC diagnostic pop
} }
void encoder_destroy(struct encoder_t *encoder) { void encoder_destroy(struct encoder_t *encoder) {
# ifdef OMX_ENCODER # ifdef OMX_ENCODER
if (encoder->omxs) { if (encoder->run->omxs) {
for (unsigned index = 0; index < encoder->n_omxs; ++index) { for (unsigned index = 0; index < encoder->run->n_omxs; ++index) {
if (encoder->omxs[index]) { if (encoder->run->omxs[index]) {
omx_encoder_destroy(encoder->omxs[index]); omx_encoder_destroy(encoder->run->omxs[index]);
} }
} }
free(encoder->omxs); free(encoder->run->omxs);
} }
# endif # endif
free(encoder->run);
free(encoder); free(encoder);
} }
@@ -124,13 +131,13 @@ enum encoder_type_t encoder_parse_type(const char *const str) {
#pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic push #pragma GCC diagnostic push
void encoder_prepare_live(struct encoder_t *encoder, struct device_t *dev) { void encoder_prepare_live(struct encoder_t *encoder, struct device_t *dev) {
assert(encoder->type != ENCODER_TYPE_UNKNOWN); assert(encoder->run->type != ENCODER_TYPE_UNKNOWN);
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
# ifdef OMX_ENCODER # ifdef OMX_ENCODER
if (encoder->type == ENCODER_TYPE_OMX) { if (encoder->run->type == ENCODER_TYPE_OMX) {
for (unsigned index = 0; index < encoder->n_omxs; ++index) { for (unsigned index = 0; index < encoder->run->n_omxs; ++index) {
if (omx_encoder_prepare_live(encoder->omxs[index], dev, encoder->quality) < 0) { if (omx_encoder_prepare_live(encoder->run->omxs[index], dev, encoder->quality) < 0) {
goto use_fallback; goto use_fallback;
} }
} }
@@ -143,7 +150,7 @@ void encoder_prepare_live(struct encoder_t *encoder, struct device_t *dev) {
# pragma GCC diagnostic push # pragma GCC diagnostic push
use_fallback: use_fallback:
LOG_ERROR("Can't prepare selected encoder, falling back to CPU"); LOG_ERROR("Can't prepare selected encoder, falling back to CPU");
encoder->type = ENCODER_TYPE_CPU; encoder->run->type = ENCODER_TYPE_CPU;
# pragma GCC diagnostic pop # pragma GCC diagnostic pop
} }
@@ -153,14 +160,14 @@ int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev,
const unsigned worker_number, const unsigned buf_index) { const unsigned worker_number, const unsigned buf_index) {
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
assert(encoder->type != ENCODER_TYPE_UNKNOWN); assert(encoder->run->type != ENCODER_TYPE_UNKNOWN);
if (encoder->type == ENCODER_TYPE_CPU) { if (encoder->run->type == ENCODER_TYPE_CPU) {
jpeg_encoder_compress_buffer(dev, buf_index, encoder->quality); jpeg_encoder_compress_buffer(dev, buf_index, encoder->quality);
} }
# ifdef OMX_ENCODER # ifdef OMX_ENCODER
else if (encoder->type == ENCODER_TYPE_OMX) { else if (encoder->run->type == ENCODER_TYPE_OMX) {
if (omx_encoder_compress_buffer(encoder->omxs[worker_number], dev, buf_index) < 0) { if (omx_encoder_compress_buffer(encoder->run->omxs[worker_number], dev, buf_index) < 0) {
goto error; goto error;
} }
} }
@@ -172,7 +179,7 @@ int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev,
# pragma GCC diagnostic push # pragma GCC diagnostic push
error: error:
LOG_INFO("HW compressing error, falling back to CPU"); LOG_INFO("HW compressing error, falling back to CPU");
encoder->type = ENCODER_TYPE_CPU; encoder->run->type = ENCODER_TYPE_CPU;
return -1; return -1;
# pragma GCC diagnostic pop # pragma GCC diagnostic pop
} }

View File

@@ -45,9 +45,8 @@ enum encoder_type_t {
#endif #endif
}; };
struct encoder_t { struct encoder_runtime_t {
enum encoder_type_t type; enum encoder_type_t type;
unsigned quality;
#ifdef OMX_ENCODER #ifdef OMX_ENCODER
unsigned n_omxs; unsigned n_omxs;
struct omx_encoder_t **omxs; struct omx_encoder_t **omxs;
@@ -55,6 +54,14 @@ struct encoder_t {
}; };
struct encoder_t {
enum encoder_type_t type;
unsigned quality;
struct encoder_runtime_t *run;
};
struct encoder_t *encoder_init(); struct encoder_t *encoder_init();
void encoder_destroy(struct encoder_t *encoder); void encoder_destroy(struct encoder_t *encoder);

View File

@@ -261,14 +261,16 @@ static void _http_callback_state(struct evhttp_request *request, void *v_server)
assert((buf = evbuffer_new())); assert((buf = evbuffer_new()));
assert(evbuffer_add_printf(buf, assert(evbuffer_add_printf(buf,
"{\"ok\": true, \"result\":" "{\"ok\": true, \"result\": {"
" {\"source\": {\"resolution\": {\"width\": %u, \"height\": %u}," " \"encoder\": {\"fallback\": %s, \"quality\": %u},"
" \"online\": %s, \"quality\": %u, \"desired_fps\": %u, \"captured_fps\": %u}," " \"source\": {\"resolution\": {\"width\": %u, \"height\": %u},"
" \"online\": %s, \"desired_fps\": %u, \"captured_fps\": %u},"
" \"stream\": {\"queued_fps\": %u, \"clients\": %u, \"clients_stat\": {", " \"stream\": {\"queued_fps\": %u, \"clients\": %u, \"clients_stat\": {",
bool_to_string(server->run->stream->encoder->type != server->run->stream->encoder->run->type),
server->run->stream->encoder->quality,
(server->fake_width ? server->fake_width : server->run->exposed->width), (server->fake_width ? server->fake_width : server->run->exposed->width),
(server->fake_height ? server->fake_height : server->run->exposed->height), (server->fake_height ? server->fake_height : server->run->exposed->height),
bool_to_string(server->run->exposed->online), bool_to_string(server->run->exposed->online),
server->run->stream->encoder->quality,
server->run->stream->dev->desired_fps, server->run->stream->dev->desired_fps,
server->run->exposed->captured_fps, server->run->exposed->captured_fps,
server->run->exposed->queued_fps, server->run->exposed->queued_fps,