diff --git a/libv4l-rockchip/libv4l-encplugin-rockchip.c b/libv4l-rockchip/libv4l-encplugin-rockchip.c
index 4a7be00ffd0526077904045187688f485bf5ef73..120beb05140ab4c43c80595683ed625fffb557d2 100644
--- a/libv4l-rockchip/libv4l-encplugin-rockchip.c
+++ b/libv4l-rockchip/libv4l-encplugin-rockchip.c
@@ -422,11 +422,8 @@ static int ioctl_s_ext_ctrls_locked(struct encoder_context *ctx, int fd,
 		switch (ext_ctrls->controls[i].id) {
 		case V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE:
 			if (ext_ctrls->controls[i].value ==
-					V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_NOT_CODED)
-				break;
-			runtime_param_ptr->keyframe_request = true;
-			runtime_param_ptr->keyframe_value = (ext_ctrls->controls[i].value ==
-					V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_I_FRAME);
+					V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_I_FRAME)
+				runtime_param_ptr->keyframe_request = true;
 			break;
 		case V4L2_CID_MPEG_VIDEO_BITRATE:
 			runtime_param_ptr->bitrate = ext_ctrls->controls[i].value;
diff --git a/libv4l-rockchip/libvpu/rk_vepu_interface.h b/libv4l-rockchip/libvpu/rk_vepu_interface.h
index e40812ecf543b78eb761c4fa38fc25c55c656a35..b9d93ee843018edcb2600d07a8a3a759580373a6 100644
--- a/libv4l-rockchip/libvpu/rk_vepu_interface.h
+++ b/libv4l-rockchip/libvpu/rk_vepu_interface.h
@@ -39,7 +39,6 @@ struct rk_vepu_runtime_param {
   int32_t framerate_denom;
   int32_t bitrate; /* bits per second */
   bool keyframe_request; /* have keyframe request */
-  bool keyframe_value; /* keyframe */
 };
 
 /**
diff --git a/libv4l-rockchip/libvpu/vp8_enc/rk_vp8encapi.c b/libv4l-rockchip/libvpu/vp8_enc/rk_vp8encapi.c
index ed3cc6ebb9b49a97219cbb39e48177741548e232..c14df0887a60b105d88aaa776544ba29ad2bac00 100644
--- a/libv4l-rockchip/libvpu/vp8_enc/rk_vp8encapi.c
+++ b/libv4l-rockchip/libvpu/vp8_enc/rk_vp8encapi.c
@@ -129,8 +129,7 @@ static void rk_vp8_encoder_setconfig(struct rk_vp8_encoder *enc,
   enc->cmdl.frameCntTotal = 0;
 
   if (param->keyframe_request) {
-    enc->encIn.codingType =
-      param->keyframe_value ? VP8ENC_INTRA_FRAME : VP8ENC_PREDICTED_FRAME;
+    enc->cmdl.keyframeRequest = true;
   }
 }
 
@@ -213,26 +212,23 @@ static int rk_vp8_encoder_before_encode(struct rk_vp8_encoder *enc) {
     return -1;
   }
 
-  /* Select frame type */
-  if ((cml->intraPicRate != 0) && (enc->intraPeriodCnt >= cml->intraPicRate))
+  /* Code keyframe according to intra period counter
+   * or if requested by client. */
+  if (cml->keyframeRequest ||
+      (cml->intraPicRate != 0 &&
+       enc->intraPeriodCnt >= cml->intraPicRate)) {
     enc->encIn.codingType = VP8ENC_INTRA_FRAME;
-  else
-    enc->encIn.codingType = VP8ENC_PREDICTED_FRAME;
-
-  if (enc->encIn.codingType == VP8ENC_INTRA_FRAME)
     enc->intraPeriodCnt = 0;
+    cml->keyframeRequest = false;
+  } else {
+    enc->encIn.codingType = VP8ENC_PREDICTED_FRAME;
+  }
 
   /* This applies for PREDICTED frames only. By default always predict
    * from the previous frame only. */
   enc->encIn.ipf = VP8ENC_REFERENCE_AND_REFRESH;
   enc->encIn.grf = enc->encIn.arf = VP8ENC_REFERENCE;
 
-  /* Force odd frames to be coded as droppable. */
-  if (cml->droppable && cml->frameCnt & 1) {
-    enc->encIn.codingType = VP8ENC_PREDICTED_FRAME;
-    enc->encIn.ipf = enc->encIn.grf = enc->encIn.arf = VP8ENC_REFERENCE;
-  }
-
   /* Encode one frame */
   ret = VP8EncStrmEncode(enc->encoder, &enc->encIn, &cml->encOut, cml);
   if (ret < 0) {
@@ -602,8 +598,6 @@ void SetDefaultParameter(EncoderParameters* cml) {
   cml->intra16Favor       = 0;
   /* Penalty value for intra mode in intra/inter */
   cml->intraPenalty       = 0;
-  /* Code all odd frames as droppable */
-  cml->droppable          = 0;
 }
 
 void PrintTitle(EncoderParameters* cml) {
diff --git a/libv4l-rockchip/libvpu/vp8_enc/vp8encapi.h b/libv4l-rockchip/libvpu/vp8_enc/vp8encapi.h
index d37d4745305db0115aa1a33b9c6c4d6cb03b0b3d..7d5ce7093d180b000346ad30744c905988a641f7 100644
--- a/libv4l-rockchip/libvpu/vp8_enc/vp8encapi.h
+++ b/libv4l-rockchip/libvpu/vp8_enc/vp8encapi.h
@@ -385,7 +385,6 @@ typedef struct
 
   int32_t printPsnr;
   int32_t mvOutput;
-  int32_t droppable;
 
   int32_t intra16Favor;
   int32_t intraPenalty;
@@ -402,6 +401,7 @@ typedef struct
   ma_s ma;            /* Calculate moving average of bitrate */
   uint32_t psnrSum;        /* Calculate average PSNR over encoded frames */
   uint32_t psnrCnt;
+  uint32_t keyframeRequest;
 
   int32_t frameCnt;       /* Frame counter of input file */
   uint64_t frameCntTotal;  /* Frame counter of all frames */