configurable framerate and gop for h264

This commit is contained in:
Devaev Maxim
2021-01-07 12:18:52 +03:00
parent 7883625165
commit b924a0fecb
5 changed files with 19 additions and 5 deletions

View File

@@ -48,7 +48,7 @@ h264_encoder_s *h264_encoder_init(void) {
h264_encoder_s *enc;
A_CALLOC(enc, 1);
enc->gop = 45; // 60
enc->bps = 5000 * 1000; // Kbps * 1000
enc->bitrate = 5000; // Kbps
enc->fps = 0; // FIXME: 30 or 0? https://github.com/6by9/yavta/blob/master/yavta.c#L210
enc->run = run;
@@ -175,7 +175,7 @@ int h264_encoder_prepare(h264_encoder_s *enc, const frame_s *frame) {
OFMT(type) = MMAL_ES_TYPE_VIDEO;
OFMT(encoding) = MMAL_ENCODING_H264;
OFMT(encoding_variant) = MMAL_ENCODING_VARIANT_H264_DEFAULT;
OFMT(bitrate) = enc->bps;
OFMT(bitrate) = enc->bitrate * 1000;
OFMT(es->video.frame_rate.num) = enc->fps;
OFMT(es->video.frame_rate.den) = 1;
RUN(output_port->buffer_size) = RUN(output_port->buffer_size_recommended) * 4;
@@ -205,8 +205,8 @@ int h264_encoder_prepare(h264_encoder_s *enc, const frame_s *frame) {
SET_PORT_PARAM(output, boolean, VIDEO_IMMUTABLE_INPUT, MMAL_FALSE);
SET_PORT_PARAM(output, boolean, VIDEO_DROPPABLE_PFRAMES, MMAL_FALSE);
SET_PORT_PARAM(output, boolean, VIDEO_ENCODE_INLINE_HEADER, MMAL_TRUE); // SPS/PPS: https://github.com/raspberrypi/userland/issues/443
SET_PORT_PARAM(output, uint32, VIDEO_BIT_RATE, enc->bps);
SET_PORT_PARAM(output, uint32, VIDEO_ENCODE_PEAK_RATE, enc->bps);
SET_PORT_PARAM(output, uint32, VIDEO_BIT_RATE, enc->bitrate * 1000);
SET_PORT_PARAM(output, uint32, VIDEO_ENCODE_PEAK_RATE, enc->bitrate * 1000);
SET_PORT_PARAM(output, uint32, VIDEO_ENCODE_MIN_QUANT, 16);
SET_PORT_PARAM(output, uint32, VIDEO_ENCODE_MAX_QUANT, 34);
SET_PORT_PARAM(output, uint32, VIDEO_ENCODE_FRAME_LIMIT_BITS, 1000000);

View File

@@ -58,7 +58,7 @@ typedef struct {
typedef struct {
unsigned gop; // Interval between keyframes
unsigned bps; // Bit-per-sec
unsigned bitrate; // Kbit-per-sec
unsigned fps;
h264_encoder_runtime_s *run;

View File

@@ -90,6 +90,8 @@ enum _OPT_VALUES {
ADD_SINK(JPEG)
# ifdef WITH_OMX
ADD_SINK(H264)
_O_H264_BITRATE,
_O_H264_GOP,
# endif
# undef ADD_SINK
@@ -179,6 +181,8 @@ static const struct option _LONG_OPTS[] = {
ADD_SINK(jpeg, JPEG)
# ifdef WITH_OMX
ADD_SINK(h264, H264)
{"h264-bitrate", required_argument, NULL, _O_H264_BITRATE},
{"h264-gop", required_argument, NULL, _O_H264_GOP},
# endif
# undef ADD_SINK
@@ -431,6 +435,8 @@ int options_parse(options_s *options, device_s *dev, encoder_s *enc, stream_s *s
ADD_SINK(jpeg, JPEG)
# ifdef WITH_OMX
ADD_SINK(h264, H264)
case _O_H264_BITRATE: OPT_NUMBER("--h264-bitrate", stream->h264_bitrate, 100, 16000, 0);
case _O_H264_GOP: OPT_NUMBER("--h264-gop", stream->h264_gop, 0, 60, 0);
# endif
# undef ADD_SINK
@@ -662,6 +668,8 @@ static void _help(FILE *fp, device_s *dev, encoder_s *enc, stream_s *stream, ser
ADD_SINK(jpeg, JPEG)
# ifdef WITH_OMX
ADD_SINK(h264, H264)
SAY(" --h264-bitrate <kbps> ───── H264 bitrate in Kbps. Default: %u.\n", stream->h264_bitrate);
SAY(" --h264-gop <N> ──────────── Intarval between keyframes. Default: %u.\n", stream->h264_gop);
# endif
# undef ADD_SINK
# ifdef WITH_GPIO

View File

@@ -62,6 +62,10 @@ stream_s *stream_init(device_s *dev, encoder_s *enc) {
A_CALLOC(stream, 1);
stream->last_as_blank = -1;
stream->error_delay = 1;
# ifdef WITH_OMX
stream->h264_bitrate = 5000; // Kbps
stream->h264_gop = 30;
# endif
stream->proc = proc;
stream->video = video;
stream->dev = dev;

View File

@@ -81,6 +81,8 @@ typedef struct {
memsink_s *jpeg_sink;
# ifdef WITH_OMX
memsink_s *h264_sink;
unsigned h264_bitrate;
unsigned h264_gop;
# endif
process_s *proc;