refactoring

This commit is contained in:
Devaev Maxim
2021-01-07 14:31:00 +03:00
parent e176b1d738
commit 2ab0f34add
3 changed files with 13 additions and 8 deletions

View File

@@ -91,6 +91,12 @@ void h264_encoder_destroy(h264_encoder_s *enc) {
free(enc);
}
bool h264_encoder_is_prepared_for(h264_encoder_s *enc, const frame_s *frame) {
# define EQ(_field) (frame->_field == enc->_field)
return (EQ(width) && EQ(height) && EQ(format) && EQ(stride));
# undef EQ
}
int h264_encoder_prepare(h264_encoder_s *enc, const frame_s *frame) {
LOG_INFO("H264: Configuring MMAL encoder ...");
@@ -216,7 +222,7 @@ int h264_encoder_prepare(h264_encoder_s *enc, const frame_s *frame) {
ENABLE_PORT(input);
ENABLE_PORT(output);
enc->prepared = true;
enc->ready = true;
return 0;
error:
@@ -249,11 +255,11 @@ static void _h264_encoder_cleanup(h264_encoder_s *enc) {
enc->wrapper->status = MMAL_SUCCESS; // Это реально надо?
enc->last_online = -1;
enc->prepared = false;
enc->ready = false;
}
int h264_encoder_compress(h264_encoder_s *enc, const frame_s *src, frame_s *dest) {
assert(enc->prepared);
assert(enc->ready);
frame_copy_meta(src, dest);
dest->encode_begin_ts = get_now_monotonic();

View File

@@ -58,12 +58,13 @@ typedef struct {
unsigned height;
unsigned format;
unsigned stride;
bool prepared;
bool ready;
} h264_encoder_s;
h264_encoder_s *h264_encoder_init(unsigned bitrate, unsigned gop, unsigned fps);
void h264_encoder_destroy(h264_encoder_s *enc);
bool h264_encoder_is_prepared_for(h264_encoder_s *enc, const frame_s *frame);
int h264_encoder_prepare(h264_encoder_s *enc, const frame_s *frame);
int h264_encoder_compress(h264_encoder_s *enc, const frame_s *src, frame_s *dest);

View File

@@ -439,12 +439,10 @@ static void _h264_stream_destroy(h264_stream_s *h264) {
}
static void _h264_stream_process(h264_stream_s *h264, const frame_s *frame) {
# define NEQ(_field) (frame->_field != h264->enc->_field)
if (NEQ(width) || NEQ(height) || NEQ(format) || NEQ(stride)) {
# undef NEQ
if (!h264_encoder_is_prepared_for(h264->enc, frame)) {
h264_encoder_prepare(h264->enc, frame);
}
if (h264->enc->prepared) {
if (h264->enc->ready) {
if (h264_encoder_compress(h264->enc, frame, h264->dest) == 0) {
memsink_server_put(h264->sink, h264->dest);
}