diff --git a/pkg/codec/x264/bridge.h b/pkg/codec/x264/bridge.h index 38038d36..8bda8be7 100644 --- a/pkg/codec/x264/bridge.h +++ b/pkg/codec/x264/bridge.h @@ -18,6 +18,7 @@ typedef struct Encoder { x264_t *h; x264_picture_t pic_in; x264_param_t param; + int force_key_frame; } Encoder; Encoder *enc_new(x264_param_t param, char *preset, int *rc) { @@ -85,8 +86,14 @@ Slice enc_encode(Encoder *e, uint8_t *y, uint8_t *cb, uint8_t *cr, int *rc) { e->pic_in.img.plane[0] = y; e->pic_in.img.plane[1] = cb; e->pic_in.img.plane[2] = cr; + if (e->force_key_frame) { + e->pic_in.i_type = X264_TYPE_IDR; + } else { + e->pic_in.i_type = X264_TYPE_AUTO; + } int frame_size = x264_encoder_encode(e->h, &nal, &i_nal, &e->pic_in, &pic_out); + e->force_key_frame = 0; Slice s = {.data_len = frame_size}; if (frame_size <= 0) { *rc = ERR_ENCODE; diff --git a/pkg/codec/x264/x264.go b/pkg/codec/x264/x264.go index 948fe8c4..ee5e05f9 100644 --- a/pkg/codec/x264/x264.go +++ b/pkg/codec/x264/x264.go @@ -129,7 +129,8 @@ func (e *encoder) SetBitRate(b int) error { } func (e *encoder) ForceKeyFrame() error { - panic("ForceKeyFrame is not implemented") + e.engine.force_key_frame = C.int(1) + return nil } func (e *encoder) Close() error {