diff --git a/src/ustreamer/h264/encoder.c b/src/ustreamer/h264/encoder.c index a462b81..d280052 100644 --- a/src/ustreamer/h264/encoder.c +++ b/src/ustreamer/h264/encoder.c @@ -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(); diff --git a/src/ustreamer/h264/encoder.h b/src/ustreamer/h264/encoder.h index 5200488..4d83454 100644 --- a/src/ustreamer/h264/encoder.h +++ b/src/ustreamer/h264/encoder.h @@ -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); diff --git a/src/ustreamer/stream.c b/src/ustreamer/stream.c index 072873c..106ecfc 100644 --- a/src/ustreamer/stream.c +++ b/src/ustreamer/stream.c @@ -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); }