mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-11 01:53:43 +00:00
fixed encoder segfault
This commit is contained in:
@@ -45,33 +45,36 @@ static const struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct encoder_t *encoder_init(enum encoder_type_t type) {
|
struct encoder_t *encoder_init() {
|
||||||
struct encoder_t *encoder;
|
struct encoder_t *encoder;
|
||||||
|
|
||||||
assert(type != ENCODER_TYPE_UNKNOWN);
|
|
||||||
A_CALLOC(encoder, 1);
|
A_CALLOC(encoder, 1);
|
||||||
encoder->type = type;
|
encoder->type = ENCODER_TYPE_CPU;
|
||||||
|
return encoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
void encoder_prepare(struct encoder_t *encoder) {
|
||||||
|
assert(encoder->type != ENCODER_TYPE_UNKNOWN);
|
||||||
|
|
||||||
if (encoder->type != ENCODER_TYPE_CPU) {
|
if (encoder->type != ENCODER_TYPE_CPU) {
|
||||||
LOG_DEBUG("Initializing encoder ...");
|
LOG_DEBUG("Initializing encoder ...");
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef OMX_ENCODER
|
# ifdef OMX_ENCODER
|
||||||
if (type == ENCODER_TYPE_OMX) {
|
if (encoder->type == ENCODER_TYPE_OMX) {
|
||||||
if ((encoder->omx = omx_encoder_init()) == NULL) {
|
if ((encoder->omx = omx_encoder_init()) == NULL) {
|
||||||
goto use_fallback;
|
goto use_fallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
return encoder;
|
return;
|
||||||
|
|
||||||
# pragma GCC diagnostic ignored "-Wunused-label"
|
# pragma GCC diagnostic ignored "-Wunused-label"
|
||||||
# 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->type = ENCODER_TYPE_CPU;
|
||||||
return encoder;
|
|
||||||
# pragma GCC diagnostic pop
|
# pragma GCC diagnostic pop
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,11 +98,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(struct encoder_t *encoder, struct device_t *dev) {
|
void encoder_prepare_for_device(struct encoder_t *encoder, struct device_t *dev) {
|
||||||
|
assert(encoder->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->type == ENCODER_TYPE_OMX) {
|
||||||
if (omx_encoder_prepare(encoder->omx, dev) < 0) {
|
if (omx_encoder_prepare_for_device(encoder->omx, dev) < 0) {
|
||||||
goto use_fallback;
|
goto use_fallback;
|
||||||
}
|
}
|
||||||
if (dev->run->n_workers > 1) {
|
if (dev->run->n_workers > 1) {
|
||||||
@@ -121,6 +126,8 @@ void encoder_prepare(struct encoder_t *encoder, struct device_t *dev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev, int index) {
|
int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev, int index) {
|
||||||
|
assert(encoder->type != ENCODER_TYPE_UNKNOWN);
|
||||||
|
|
||||||
if (encoder->type == ENCODER_TYPE_CPU) {
|
if (encoder->type == ENCODER_TYPE_CPU) {
|
||||||
jpeg_encoder_compress_buffer(dev, index);
|
jpeg_encoder_compress_buffer(dev, index);
|
||||||
}
|
}
|
||||||
@@ -131,6 +138,7 @@ int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
# pragma GCC diagnostic ignored "-Wunused-label"
|
# pragma GCC diagnostic ignored "-Wunused-label"
|
||||||
|
|||||||
@@ -54,10 +54,11 @@ struct encoder_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct encoder_t *encoder_init(enum encoder_type_t type);
|
struct encoder_t *encoder_init();
|
||||||
void encoder_destroy(struct encoder_t *encoder);
|
void encoder_destroy(struct encoder_t *encoder);
|
||||||
|
|
||||||
enum encoder_type_t encoder_parse_type(const char *const str);
|
enum encoder_type_t encoder_parse_type(const char *const str);
|
||||||
|
|
||||||
void encoder_prepare(struct encoder_t *encoder, struct device_t *dev);
|
void encoder_prepare(struct encoder_t *encoder);
|
||||||
|
void encoder_prepare_for_device(struct encoder_t *encoder, struct device_t *dev);
|
||||||
int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev, int index);
|
int encoder_compress_buffer(struct encoder_t *encoder, struct device_t *dev, int index);
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
if ((exit_code = _parse_options(argc, argv, dev, encoder, server)) == 0) {
|
if ((exit_code = _parse_options(argc, argv, dev, encoder, server)) == 0) {
|
||||||
_install_signal_handlers();
|
_install_signal_handlers();
|
||||||
|
encoder_prepare(encoder);
|
||||||
|
|
||||||
pthread_t stream_loop_tid;
|
pthread_t stream_loop_tid;
|
||||||
pthread_t server_loop_tid;
|
pthread_t server_loop_tid;
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ void omx_encoder_destroy(struct omx_encoder_t *omx) {
|
|||||||
free(omx);
|
free(omx);
|
||||||
}
|
}
|
||||||
|
|
||||||
int omx_encoder_prepare(struct omx_encoder_t *omx, struct device_t *dev) {
|
int omx_encoder_prepare_for_device(struct omx_encoder_t *omx, struct device_t *dev) {
|
||||||
if (component_set_state(&omx->encoder, OMX_StateIdle) < 0) {
|
if (component_set_state(&omx->encoder, OMX_StateIdle) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,5 +49,5 @@ struct omx_encoder_t {
|
|||||||
struct omx_encoder_t *omx_encoder_init();
|
struct omx_encoder_t *omx_encoder_init();
|
||||||
void omx_encoder_destroy(struct omx_encoder_t *omx);
|
void omx_encoder_destroy(struct omx_encoder_t *omx);
|
||||||
|
|
||||||
int omx_encoder_prepare(struct omx_encoder_t *omx, struct device_t *dev);
|
int omx_encoder_prepare_for_device(struct omx_encoder_t *omx, struct device_t *dev);
|
||||||
int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev, int index);
|
int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev, int index);
|
||||||
|
|||||||
@@ -344,7 +344,7 @@ static int _stream_init(struct device_t *dev, struct workers_pool_t *pool) {
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
encoder_prepare(pool->encoder, dev);
|
encoder_prepare_for_device(pool->encoder, dev);
|
||||||
|
|
||||||
_stream_init_workers(dev, pool);
|
_stream_init_workers(dev, pool);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user