coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE);
        }
 
-       if (ctx->params.bitrate) {
+       if (ctx->params.bitrate && (ctx->params.frame_rc_enable ||
+                                   ctx->params.mb_rc_enable)) {
                ctx->params.bitrate_changed = false;
                ctx->params.h264_intra_qp_changed = false;
 
        }
        coda_write(dev, value, CODA_CMD_ENC_SEQ_OPTION);
 
-       coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE);
+       if (ctx->params.frame_rc_enable && !ctx->params.mb_rc_enable)
+               value = 1;
+       else
+               value = 0;
+       coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE);
 
        coda_setup_iram(ctx);
 
 
        case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION:
                ctx->params.h264_constrained_intra_pred_flag = ctrl->val;
                break;
+       case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
+               ctx->params.frame_rc_enable = ctrl->val;
+               break;
+       case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
+               ctx->params.mb_rc_enable = ctrl->val;
+               break;
        case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET:
                ctx->params.h264_chroma_qp_index_offset = ctrl->val;
                break;
        v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
                V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION, 0, 1, 1,
                0);
+       v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
+               V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, 0, 1, 1, 1);
+       v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
+               V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE, 0, 1, 1, 1);
        v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
                V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, -12, 12, 1, 0);
        v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,